안녕하세요. 지난 포스팅의 디지털 영상 처리 - 스무딩 공간 필터(Smoothing Spatial Filter)에서는 영상 공간에서 수행하는 대표적인 필터링 기법인 스무딩에 대해서 알아보았습니다. 이러한 스무딩 필터링은 관심 없는 객체나 노이즈를 제거하는 데 유용하게 쓰인다고 말씀드렸습니다. 오늘은 이러한 스무딩 필터들을 구현해보는 시간을 가져보도록 하겠습니다. 소스코드는 아래의 깃허브를 보시면 됩니다.
1. 평균 필터(Mean Filter)
평균 필터는 BoxFilterForLoop.m와 BoxFilterVector.m 두 가지 방식으로 구현이 되어 있습니다. 일반적으로 Vectorization을 취했을 때 속도가 더 빨라야하지만 제가 아직 미숙한 점이 있어 이상하게 For Loop로 구현한 스무딩 함수가 더 빠르게 동작하였습니다. ㅠㅠ 그래서 Vectorization된 버전은 이후에 보완되면 추가하도록 하겠습니다. 이점 감안하시고 코드를 봐주시면 감사하겠습니다.
function [SmoothImage] = BoxFilterForLoop(image, window)
%BoxFilterForLoop : 입력 영상을 입력받아 박스 필터링을 수행하는 함수
% input
% 1. image : 입력 영상
% 2. window : 커널의 크기
% output
% 1. SmoothImage : 스무딩된 영상
if size(image, 3) == 3
image = rgb2gray(image);
end
kernel = ones([window, window], 'double'); % 커널 정의
n = floor(window/2);
[height, width] = size(image); % 입력 영상의 높이와 너비 추출
SmoothImage = zeros([height, width], 'uint8'); % 입력 영상의 크기에 따라서 스무딩 영상 초기화
image = double(image);
PaddedImage = zeros([height+2*n, width+2*n]);
PaddedImage(n+1:height+n, n+1:width+n) = image;
for i=n+1:height+n % 입력 영상의 높이
for j=n+1:width+n % 입력 영상이 너비
% (i, j)에 해당하는 픽셀에 윈도우의 크기만큼 linear smoothing 수행
pixelValue = 0.0;
for s=-n:n
for t=-n:n
pixelValue = pixelValue + kernel(s+n+1, t+n+1)*PaddedImage(i+s, j+t);
end
end
SmoothImage(i-n, j-n) = pixelValue/(window^2);
end
end
end
알고리즘 자체는 간단합니다. 일단 저희는 현재 컬러 영상은 배우지 않았기 때문에 입력 영상이 컬러라면 강제로 그레이 영상으로 변환해주는 전처리를 해줍니다. 이후에는 함수의 입력 파라미터인 window에 따른 크기의 커널을 생성해줍니다. 저는 구현을 간편하게 하기 위해서 커널이 항상 정사각형임과 동시에 window가 항상 홀수라는 가정을 하였습니다. 물론, 직사각형의 크기를 가지는 커널이라고 하더라도 구현은 할 수 있습니다!! 그 다음에는 커널 크기를 반으로 나누고 floor를 취한 값을 $n$이라고 하였습니다. 해당 값이 사실 굉장히 중요합니다. 왜냐하면 공간 영상 필터링 기초에서 보았다싶이 필터가 영상의 크기를 넘어가면 패딩을 취해주어야합니다. 저는 이 $n$을 이용해서 처리를 해주었습니다.
만약, MATLAB을 기준으로 $256 \times 256$ 크기의 영상 픽셀 중 (1, 1)에서 $5 \times 5$ 커널을 이용해서 영상 필터링을 수행하기 위해서는 왼쪽으로 2칸, 윗쪽으로 2칸이 더 필요합니다. 그리고 (1, 256)에서는 오른쪽으로 2칸, 윗쪽으로 2칸, (256, 1)에서는 왼쪽으로 2칸, 아랫쪽으로 2칸, (256, 256)에서는 오른쪽으로 2칸, 아랫쪽으로 2칸이 필요합니다. 이때, $2 = \text{floor}\left(\frac{5}{2}\right)$가 되기 때문에 필터의 크기에 따라서 왼쪽, 오른쪽, 윗쪽, 아랫쪽으로 얼마나 패딩할 지 결정을 할 수 있습니다. 따라서 패딩된 영상은 양 옆, 위아래에 2개의 픽셀을 추가하여 $(256 + 2 * 2) \times (256 + 2 * 2)$ 크기를 가지게 됩니다. 이제 반복문을 돌면서 Smoothing된 pixelValue를 계산하고 새로운 SmoothImage에 값을 넣어주면 됩니다.
2. 순서-통계 필터(Order-Statistic Filter)
사실 상단의 선형 필터링을 이해했다면 다 똑같고 내부 연산만 정렬 후 어떤 값을 선택할 건지만 달라집니다. 그래서 코드는 따로 올리지 않고 결과만 보도록 하겠습니다.
중간값 필터는 소금-후추 노이즈 제거에 탁월한 효과를 보인다고 설명을 드렸습니다. 실제로 그런지 한번 봅시다.
하단 왼쪽 영상은 기존의 스무딩 함수를 이용해서 스무딩한 결과입니다. 오리지널 영상에 비해서 퀄리티가 매우 떨어지는 것을 볼 수 있죠. 하지만, 중간값 필터의 경우에는 이전 포스팅에서 말씀드린 이유로 원본 영상과의 차이가 거의 없는 것을 볼 수 있습니다.
마지막으로 중간값 필터뿐만 아니라 최댓값, 최솟값 필터 결과를 보고 마치도록 하겠습니다.
'image processing' 카테고리의 다른 글
디지털 영상 처리 - 샤프닝 공간 필터(Sharpening Spatial Filter) : 언샤프닝 마스킹, 하이부스팅 필터링, 비등방성 필터 (0) | 2021.03.21 |
---|---|
디지털 영상 처리 - 샤프닝 공간 필터(Sharpening Spatial Filter) : 라플라시안 필터 (2) | 2021.03.20 |
디지털 영상 처리 - 스무딩 공간 필터(Smoothing Spatial Filter) (0) | 2021.03.17 |
디지털 영상 처리 - 공간 필터링 기초 (3) | 2021.03.15 |
디지털 영상 처리 - 히스토그램 처리 함수 구현 (0) | 2021.03.13 |