지난 글에서 비트맵 이미지의 노이즈를 제거 하는 방법으로 근처 9 개의 픽셀 값의 평균 값을 적용하는 방법을

해 보았습니다.

노이즈를 발생시킨 후 평균 값을 구해 적용해 보면 실제 노이즈 자체가 없어지는 것이 아니란걸 확인 할 수 있습니다.

1.jpg 

위 그림처럼 평균 값을 구하게 되면 노이즈(검은색 픽셀) 와 원색 (옅은회색)의 평균 값인

짙은 회색이 되어 실제 색과는 다른 값이 되어 버립니다.


그래서 그런 노이즈를 조금더 확실히 없앨 수 있는 방법으로 median sort 를 적용해 보겠습니다.

median sort 의 원리는 근처 9개의 픽셀 값들을 정렬 시킨 후 그중 중간 값으로 대처 하는 방법입니다.

평균값 계산 방법과 메디안 정렬 방법을 비교 해보면 아래 그림 과 같습니다.


2.jpg


3.jpg

위 그림처럼 근처한 9개의 픽셀을 정렬 시킨 후 중간 값으로 바꾸면 없는 색을

사용 하는 것이 아니고 원래의 색중 하나를 쓰기 때문에 노이즈 제거에 보다 효과 적이라 할 수 있겠습니다.


그럼 실제로 적용해 보겠습니다.

4-1.jpg

먼저 원본 이미지 입니다.


5.jpg

임의의 픽셀을 검게 만들어 노이즈를 넣었습니다.


6.jpg

median 정렬을 실행한 이미지입니다.

얼핏 보면 원본 이미지와 같다고 생각이 들정도로 노이즈가 제거 된 것을 확인 할 수 있습니다.

소스

---------------------------------------------------------------------

~ 생략 


//24 bit 트루컬러 이미지에 메디안 필터를 적용 한다.

if(hinfo.biBitCount == 24)

{

for(i=0; i<hinfo.biHeight; i++)

{

for(j=0; j<hinfo.biWidth; j++)

{

// 근처 9 개의 픽셀을 배열에 넣는다.

median_B[0] = lpimg[(i-1)*rwsize2 + 3*(j-1)];

median_B[1] = lpimg[(i-1)*rwsize2 + 3*j];

median_B[2] = lpimg[(i-1)*rwsize2 + 3*(j+1)];

median_B[3] = lpimg[i*rwsize2 + 3*(j-1)];

median_B[4] = lpimg[i*rwsize2 + 3*j];

median_B[5] = lpimg[i*rwsize2 + 3*(j+1)];

median_B[6] = lpimg[(i+1)*rwsize2 + 3*(j-1)];

median_B[7] = lpimg[(i+1)*rwsize2 + 3*j];

median_B[8] = lpimg[(i+1)*rwsize2 + 3*(j+1)];

for(int k=0; k<9; k++)

{

for(int l=0; l<9; l++)

{

//9 개의 픽셀 값을 순서대로 정렬 시킨다.

if(median_B[l] < median_B[l+1])

{

temp = median_B[l];

median_B[l] = median_B[l+1];

median_B[l+1] = temp;

}

}

}

B = median_B[4]; //정렬된 픽셀중 중간 값을 넣어준다.

~ 생략 ( G, B 도 동일 한 방법으로 적용 ) 

----------------------------------------------------------------------------------


아주 간단한 방법이지만 상당히 효과적으로 노이즈를 제거 하는 방법이라 생각이 됩니다.