간단하게 median filter를 만들어 보았다.
main.cpp와 src img를 첨부한다.
padding은 replicate padding을 사용했고, 픽셀을 순회하면서 계산하는 방식이다.
[CODE 전체적인 과정]
1. Median Filter를 적용하기 위한 별도의 함수를 작성.
함수는 입력 영상(src), median filter의 neighbor 크기, 출력 영상(dst)을 매개변수로 받는다.
2. 함수 내부에서 dst의 모든 픽셀을 순회하며,
a. 각 필셀마다 src의 대상 영역 필셀 값들을 추출.
b. 이때 대상 영역은 x축으로 [-window, window] 이며, y축으로도 [-window, window].
c. 추출된 픽셀 값을 정렬하여 중간 값을 찾고, 중간 값을 dst의 해당 픽셀에 저장.
3. main 함수
a. 첨부된 MedianFilterInput.png 파일을 OpenCV를 이용하여 회색조(gray scale)로 읽어옴.
b. 앞서 작성한 함수를 사용하여 window=1 일 때 median filter를 적용하고,
c. imshow를 통하여 화면에 출력한 후 waitkey() 한다.
d. b-c 과정을 반복하여 window크기를 2, 3, 4, 5까지 바꾸어 가며 결과를 출력한다.
//window에 따른 필터링 결과를 보기 위함.
HINT]
픽셀 값들을 모아서 median을 계산하는 과정에 std::vector를 사용하면 편리.
std::vector<uchar> neighbors;
neighbors.clear(); 로 기존에 쌓여 있던 data를 삭제.
src의 해당 영역 내의 각 픽셀의 값을 추가 할 때는 neighbots.push_back( val ); 과 같이 추가.
영역 내의 필셀이 모은 후, 정렬은 std::sort( neighbors.begin(), neighbors.end() ); 와 같이 진행.
median 값은 neighbors[ neighbors.size()/2 ]
'영상처리' 카테고리의 다른 글
아주 간단한 Box filter 구현 /C++/openCV (0) | 2021.04.15 |
---|