2015년 9월 18일 금요일

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

댓글 없음:

댓글 쓰기