이미지 blur와 양방향 필터링(Bilateral Filtering)

노이즈를 줄이거나 이미지를 부드럽게 보이기 위해 blurring을 사용한다. 

일반적으로 커널 윈도우를 이미지 전체에서 슬라이딩하여 필터링하며 blurring한다. 

 



많이 사용되는 필터(커널)의 형태는 다음과 같다.

1. 커널 영역 픽셀의 평균값을 사용

2. 커널 영역 픽셀의 가우스 분포 가중 평균을 사용

3. 커널 영역 픽셀의 중앙값을 사용


import cv2 as cv

#https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37
def Blur(img, ksize=(1,1), title='Blur'):
    if img is None:
        return
    dst = cv.blur(img,ksize)
    cv.imshow(title,dst)

#https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1
def GaussianBlur(img, ksize=(1,1), title='GaussianBlur'):
    if img is None:
        return
    dst = cv.GaussianBlur(img,ksize,0)
    cv.imshow(title,dst)

#https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9
def MedianBlur(img,ksize, title='MedianBlur'):
    if img is None:
        return
    dst = cv.medianBlur(img,ksize)
cv.imshow(title,dst)

def main():
    img = cv.imread('village.jpg')
    cv.imshow('img',img)
    
    Blur(img,(5,5),'blur 5x5')
    GaussianBlur(img,(5,5),'GaussianBlur 5x5')
    MedianBlur(img,5,'medianBlur 5')
    
    cv.waitKey(0)
    cv.destroyAllWindows()



위 방법들은 이미지의 경계까지 흐려지는 단점을 가지고 있다.

이런 문제를 해결한 blurring 방법이 양방향 필터링(Bilateral Filtering)이다.


양방향 필터링(Bilateral Filtering)

Bilateral Filtering은 각 픽셀의 값을 근처 픽셀의 가중 평균을 사용하여 blurring에 사용한다. 또한 가중치는 가우스 분포를 사용하기도 한다. 하지만, 양방향 필터는 픽셀 간의 거리만이 아니라 픽셀의 색상 강도, 깊이 등의 차이를 고려한다. 이들을 고려한 필터는 아래 그림 (b)와 같은 모양을 가지게 된다. 아래 이미지에서 절벽처럼 픽셀 값의 차이를 나타내는 부분은 이미지의 경계면에 해당한다. 

 


<이미지 출처: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html>

Blurring 하려는 원본 이미지 (a)에 필터 (b)를 적용하면 (c)와 같은 이미지를 얻을 수 있다.

 

python opencv를 사용한 예제 코드는 다음과 같다.

import cv2 as cv

#https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga9d7064d478c95d60003cf839430737ed
def BilateralBlur(img,ksize, title='BilateralBlur'):
    if img is None:
        return
    dst = cv.bilateralFilter(img,ksize,ksize*2,ksize/2)
    cv.imshow(title,dst)

def main():
    img = cv.imread('village.jpg')
    cv.imshow('img',img)
    
    GaussianBlur(img,(5,5),'GaussianBlur 5x5')
    BilateralBlur(img,5,'BilateralBlur 5')
    
    cv.waitKey(0)
    cv.destroyAllWindows()



양방향 필터링(Bilateral Filtering)을 한 경우 gaussian Blur 보다 경계면이 선명한 것을 볼 수 있다.


댓글

  1. 안녕하세요. 구글블로그스팟 이용에 관해 궁굼한게 있는데 혹시..1:1대화나..카톡상담을 해도될까융...

    답글삭제
    답글
    1. 안녕하세요. 제가 카톡은 사용하고 있지 않습니다. 궁금하신 점은 댓글로 부탁드립니다. 감사합니다.

      삭제
    2. 앗.답변감사합니다.^.^
      그 뭐라고 설명을 해야할까요.. 다른분 구글 블로그를 구경했는데..
      메인상단 밑에 메뉴가젯들이 이미지로 되어있더라구요..검삭해보니 아마 html인가..그걸로 한거같은데..
      요런건 어떠케 설정을 해야하는지 알수있을까요?
      보통 메뉴가젯은 페이지 들어가서 그냥 텍스트로 하나씩 추가추가 하는건데..
      그분 블로그에는 메뉴탭들이 하나하나 이미지로 설정되어있더라구요..예쁘게..

      삭제
    3. 제가 알고 있는 방법은 https://ryanclaire.blogspot.com/2020/09/make-blogger-menu.html 포스트에 기록해 두었습니다.

      삭제
  2. 감사합니다. 확인해보겠습니다. 감사합니다.

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

아두이노(arduino) 심박센서 (heart rate sensor) 심박수 측정 example code

Embedded Linux USB Ethernet Gadget 사용하기

간단한 이미지 센서 (ccd/cmos) 원리 이해