반응형


이미지 블러링은 이미지를 로우 패스 필터 커널로 컨벌루션하는 것입니다.

이미지에서 고주파인 노이즈가 흐려지게 됩니다. 이때 같은 고주파인 선도 같이 흐려지게 됩니다.



마지막 업데이트 - 2018. 10. 11




다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다.


https://docs.opencv.org/3.4.3/d6/d00/tutorial_py_root.html




컨볼루션(Convolution)


이미지에 커널(마스크)을 컨볼루션하여 블러닝(흐리게), 샤프닝(선명하게) 등의 처리를 할 수 있습니다.



컨볼루션 계산은 커널과 이미지 상에 대응되는 값끼리 곱한 후, 모두 더하여 구해집니다.  이 결과값을 결과 영상의 현재 위치에 기록하면 됩니다.


img_output(1,1) = img_input(0,0) x mask(0,0) + img_input(0,1) x mask(0,1)


                     + img_input(0,2) x mask(0,2) + img_input(1,0) x mask(1,0)


                     + img_input(1,1) x mask(1,1) + img_input(1,2) x mask(1,2)


                     + img_input(2,0) x mask(2,0) + img_input(2,1) x mask(2,1)


                     + img_input(2,2) x mask(2,2)





OpenCV에서는 컨볼루션을 쉽게 할 수 있도록 filter2D 함수를 제공합니다. 커널만 아래처럼 정의해주면 쉽게 계산을 할 수 있습니다.

다음 커널은 입력이미지의 현재 위치에서 5 x 5 범위의 주변 픽셀 평균을 해서 결과 이미지의 같은 위치의 값으로 합니다.  




실행 결과 다음처럼 이미지가 흐려지게 됩니다.





테스트에 사용한 이미지와 전체 소스 코드입니다.


import numpy as np
import cv2


img = cv2.imread('test.png')
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img, -1, kernel)


cv2.imshow('Original', img)
cv2.imshow('Result', dst)

cv2.waitKey(0)
cv2.destroyAllWindows()




평균 블러링(Averaging Blurring)

커널을 만들어서 컨볼루션하는 번거로움을 줄이기 위해 OpenCV에서는 블러링하는 함수를 제공합니다.

앞에서 살펴본 5 x 5  범위내 이웃 픽셀의 평균을 결과 이미지의 픽셀값으로하는 평균 블러링을 하는 blur함수가 있습니다.


blur = cv2.blur(img,(5,5))



결과는 앞에서 살펴본 것과 동일합니다.




테스트에 사용한 전체 소스 코드입니다.


import cv2


img = cv2.imread('test.png')
blur = cv2.blur(img,(5,5))


cv2.imshow('Original', img)
cv2.imshow('Result', blur)

cv2.waitKey(0)
cv2.destroyAllWindows()




가우시안 블러링(Gaussian Blurring)

모든 픽셀에 똑같은 가중치를 부여했던 평균 블러링과 달리 가우시안 블러링은 중심에 있는 픽셀에 높은 가중치를 부여합니다.


   



세번째 아규먼트를 0으로 하면 지정한 커널 크기(5 x 5)에 맞추어 시그마를 계산해서 사용합니다.


blur = cv2.GaussianBlur(img, (5,5), 0)




평균 블러링(왼쪽)은 에지 포함해서 전체적으로 블러링된 반면 가우시안 블러링(오른쪽)은 에지가 남아있는 상태에서 블러링이 이루어졌습니다.  

캐니(Canny)로 에지를 검출하기전에 노이즈를 제거하기 위해 사용됩니다.


  



테스트에 사용한 전체 소스코드입니다.


import cv2


img = cv2.imread('test.png')
blur = cv2.GaussianBlur(img,(5,5),0)


cv2.imshow('Original', img)
cv2.imshow('Result', blur)

cv2.waitKey(0)
cv2.destroyAllWindows()




미디안 블러링(Median Blurring)


관심화소 주변으로 지정한 커널 크기( 5 x 5) 내의 픽셀을 크기순으로 정렬한 후 중간값을 뽑아서 픽셀값으로 사용합니다.


median = cv2.medianBlur(img, 5)



무작위 노이즈를 제거하는데 효과적입니다. 하지만 에지가 있는 이미지의 경우에는 결과 이미지에서 에지가 사라질 수 있습니다.





테스트에 사용한 이미지와 전체 코드입니다.



import cv2


img = cv2.imread('circle.png')
median = cv2.medianBlur(img, 5)

cv2.imshow('Original', img)
cv2.imshow('Result', median)

cv2.waitKey(0)
cv2.destroyAllWindows()





Bilateral Filtering

에지를 보존하면서 노이즈를 감소시킬수 있는 방법입니다.



결과 이미지에서 질감있는 부분만 블러링 되고 에지 부분은 보존되었습니다.




테스트에 사용한 이미지와 전체 소스 코드입니다.



import cv2


img = cv2.imread('texture.png')
blur = cv2.bilateralFilter(img,9,75,75)

cv2.imshow('Original', img)
cv2.imshow('Result', blur)

cv2.waitKey(0)
cv2.destroyAllWindows()






문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts