우리가 흔히 볼 수 있는 어플의 기능중 하나인 필터의 개념을 직접 구현해 보는 것이였는데
방법은 정사각형의 픽셀을 정렬하여 가장 가운데 있는 중간 값을 새로운 배열의 넣고
사진의 한픽셀 한픽셀 이동하면서 이 짓거리를 반복하는 것이다. 그러면 사진이 전체적으
로 부드러워 지면서 노이즈(잡티)가 제거 되는 것이다. 이번 과제를 하면서 고역이었던 것이
머리로는 방법을 알겠는데 매트랩으로 구현하는 것이 나에겐 너무 어려웠다. 일단 반복문을
너무 오랜만에 써보는 것도 있지만 매트랩과 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
댓글 없음:
댓글 쓰기