2015년 9월 20일 일요일

gaussian filter

이번에 구현한 것은 가우시안 필터이다. 사실 이게 맞는지도 잘 모르겠다. 일단 원하던 결과

는 나온다. 가우시안에 대해서 검색하면 요상한 그래프를 자주 볼 수 있을 것이다. 뭐 표준

편차에 어쩌구 저쩌구 하는데 나는 이에 대해서 이번에 처음듣게 되어서 생소하였다.  간단

하게 말하자면 가운데의 비중이 제일크고 주변으로 갈수록 비중이 작아 진다는 건데 시그

마 값에 의해서 주변 값들의 비중이 결정 되어진다 시그마가 높으면 주변 값의 비중이 높아

진다. 그래서 주어진 식에 대입해서 그렇게 해서 반복문으로 아래를 만들었다. 다중포문을

사용할때는 주어진 값이 변경된다면 변수를 이용해서 하는 편이 더 깔끔하고 좋았다는 걸

느꼈다.


function [ output_args ] = gaussian( img_name, f_size, sigma )
%GAUSSIAN Summary of this function goes here
%   Detailed explanation goes here


       t_img = imread(img_name);
     
       filter = zeros(f_size);

       [h w] = size(t_img);
     
       result = zeros(h, w, 'uint8');
     
       f_size_buf = (f_size-1)/2;
       gauss_buf = 1/(2*pi*(sigma^2));
     
     
       for i=-f_size_buf:f_size_buf
           for j=-f_size_buf:f_size_buf
               filter(i+f_size_buf+1,j+f_size_buf+1) = gauss_buf * exp(-1*(i^2+j^2)/(2*(sigma^2)));
           end
       end
     
             
     
     
     
     
     
     
     
     
     
       i= 0;
       j= 0;
       k= 0;
       l= 0;
     
       for i=f_size_buf+1:h-f_size_buf
           for j=f_size_buf+1:w-f_size_buf
               temp = 0;
               for k= -f_size_buf:f_size_buf
                   for l= -f_size_buf:f_size_buf
                       temp = temp + t_img(i+k,j+l)*filter(k+f_size_buf+1,l+f_size_buf+1);
                   end
               end
               result(i-1,j-1) = ceil(temp);
           end
       end
     
       figure, imshow(t_img);
       figure, imshow(result);


end

2015년 9월 18일 금요일

matlab. mean filter

매트랩 mean filter이다. 단순히 하나의 픽셀을 둘러싸고있는 정사각형의 배열(둘러싸고 있

는 픽셀 3*3이라면 2,2의 중앙의 값을 결정 하기 위한)에서 모든 수를 더하고 그 픽셀의

개수만큼 나눠주어서 평균값을 계산하여 픽셀의 수치를 계산하는 것이다.




function [ output_args ] = mean( img_name, f_size )
%MEAN Summary of this function goes here
%   Detailed explanation goes here

       t_img = imread(img_name);
     
       filter = zeros(f_size);
       filter(1:f_size,1:f_size) = 1/(f_size*f_size);

       [h w] = size(t_img);
     
       result = zeros(h, w, 'uint8');
     
       i= 0;
       j= 0;
       k= 0;
       l= 0;
     
       for i=2:h-1
           for j=2:w-1
               temp = 0;
               for k= -1:1
                   for l= -1:1
                       temp = temp + t_img(i+k,j+l)*filter(k+2,l+2);
                   end
               end
               result(i-1,j-1) = ceil(temp);
           end
       end
     
       figure, imshow(t_img);
       figure, imshow(result);
     
end

matlab. redian 필터 적용.

이번에는 처음 접해보는 매트랩이란 프로그램으로 이미지 수정 작업을 하였다.

우리가 흔히 볼 수 있는 어플의 기능중 하나인 필터의 개념을 직접 구현해 보는 것이였는데

방법은 정사각형의 픽셀을 정렬하여 가장 가운데 있는 중간 값을 새로운 배열의 넣고

사진의 한픽셀 한픽셀 이동하면서 이 짓거리를 반복하는 것이다. 그러면 사진이 전체적으

로 부드러워 지면서 노이즈(잡티)가 제거 되는 것이다. 이번 과제를 하면서 고역이었던 것이

머리로는 방법을 알겠는데 매트랩으로 구현하는 것이 나에겐 너무 어려웠다. 일단 반복문을

너무 오랜만에 써보는 것도 있지만 매트랩과 c언어와의 차이점 때문에 고생을 좀 많이 했

다. 반복문 사용방법이라든지 달랐으니까... 힘들었던 부분중 하나가 ceil이란 함수 인데

이것은 수를 반올림 해주는 것이다. 매트랩의 default형은 double 인 것 같은데 막상

double 형태의 배열을 imshow() 를 이용하여 출력할려면 잘 안되는 것이다. 그래서

zeros(h, w, 'uint8')로 설정한 다음에 ceil을 이용하여 넣을때 반올림을 해줘서 넣으니까 된

것 같다. 아직도 왜 이해가 잘 안간다.  필터 사이즈는 그냥 3으로 해서 했다 일단 쉽게 설정

해놓고 이제 필터값 변경에 따른 반복문 변수를 바꿔주는 일만 남았지...







function [] = median( img_name, f_size )
%MEDIAN Summary of this function goes here
%   Detailed explanation goes here

       t_img = imread(img_name);
     
       filter = zeros(f_size);
       filter(1:f_size,1:f_size) = 1/(f_size*f_size);

       [h w] = size(t_img);
     
       result = zeros(h, w, 'uint8');
     
       i= 0;
       j= 0;
       k= 0;
       l= 0;
       n= 1;
     
     
       for i=2:h-1
           for j=2:w-1
                temp = zeros(9,1);
                n = 1;
               for k= -1:1
                   for l= -1:1
                       temp(n) = ceil(t_img(i+k,j+l));
                       n = n +1;
                   end
               end


               for sort_i = 1:8
                   minindex = sort_i;
                   for sort_j= minindex+1:9
                      if(temp(minindex) > temp(sort_j))
                          minindex = sort_j;
                      end
                      if(minindex ~= sort_j)
                          sort_buf = temp(minindex);
                          temp(minindex) = temp(sort_j);
                          temp(sort_j) = sort_buf;
                      end
                   end
               end                  

               result(i-1,j-1) = temp(5);
           end
       end
       figure, imshow(t_img);
       figure, imshow(result);
     
end