[opencv-python] blurring

2019. 7. 7. 03:21Python-이론/python-opencv

blurring

blurring이란 이미지의 고주파 부분을 조금 더 자연스럽게 바꾸어줄 수 있는 방법이다. 

 

이미지의 고주파 저주파란?

저주파란 이미지 부분마다 색의 차이가 적은 부분을 의미합니다. 

 

고주파는 이미지의 색의 차이가 큰 부분을 의미합니다. 

 

LPF, HPF

LPF

저주파를 통과시키고 고주파가 통과되는 것을 막습니다. 

 

HPF

고주파를 통과시키고 저주파가 통과되는 것을 막습니다.

블러링은 LPF를 활용해 고주파의 부분을 부드럽게 만들어주는 것입니다. 하지만 이렇게 고주파의 부분을 완화시켜주면 edge가 부분적으로 줄어들게 되고 흐릿하게 변하게 됩니다. 

 

코드

import numpy as np
import cv2


def bluring():
    img = cv2.imread("../resource/Images/kind.jpg")

    kernel = np.ones((5, 5), np.float32)/25
    blur = cv2.filter2D(img, -1, kernel)

    cv2.imshow("original", img)
    cv2.imshow("blur", blur)

    cv2.waitKey(0)
    cv2.destroyAllWindows()


bluring()

25로 나누어 주는 이유는 정규화를 해주기 위해서입니다. 그러기 위해서 mask의 모든 배열의 값을 더한 다음 역수를 만들어서 곱해주면 됩니다. 

결과

 

Blurring

LPF를 사용하여 고주파의 화면을 값을 더 작게 만들어줍니다. 그래서 부드럽지만 희미하게 이미지가 바뀌게 됩니다. 이번에는 Blur를 trackBar를 활용하여 실습해보겠습니다. 

 

opencv에서 제공해주는 Blurring은 여러 종류가 있는데  

cv2.blur(img, (val, val))

이미지를 일반적인 blurring을 실행해줍니다. 

val, val은 blurring해주는 값을 구하기 위한 box크기를 지정해줍니다. 두 값이 달라도 됩니다. 

 

cv2.GaussianBlur(img, (val, val), 0)

가운데 픽셀에 가장 큰 가중치를 두어서 계산을 합니다. 

(val, val)은 두 값이 서로 달라도 되지만 양의 홀수여야합니다. 

 

cv2.medianBlur(img, val)

크기순으로 픽셀을 정렬한 후 중간값을 뽑아서 픽셀 값으로 사용합니다. 

val * val로 사이즈를 지정해줍니다. 

 

cv2.bilateralBlur(src, dst, d, sigmaColor, sigmaSpace)

src는 이미지 데이터를 의미합니다.

dst는 출력영상을 의미합니다. 

d는 필터링에서 이용해주는 픽셀의 지름을 결정합니다. 

sigmaColor는

sigmaSpace는 

 

여기에 있는 필터의 부분은 따로 포스트를 만들겠습니다. 

 

코드 

import numpy as np
import cv2


def onMouse(x):
    pass


def bluring():
    img = cv2.imread("../resource/Images/kind.jpg")

    cv2.namedWindow("BlurPane")
    cv2.createTrackbar("BLUR_MODE", "BlurPane", 0, 3, onMouse)
    cv2.createTrackbar("BLUR", "BlurPane", 0, 5, onMouse)

    mode = cv2.getTrackbarPos("BLUR_MODE", "BlurPane")
    val = cv2.getTrackbarPos("BLUR", "BlurPane")

    while True:
        val = val * 2 + 1

        try:
            if mode == 0:
                blur = cv2.blur(img, (val, val))
            elif mode == 1:
                blur = cv2.GaussianBlur(img, (val, val), 0)
            elif mode == 2:
                blur = cv2.medianBlur(img, val)
            elif mode == 3:
                blur = cv2.bilateralFilter(img, 9, 75, 75)
            else:
                break
            cv2.imshow("BlurPane", blur)
        except:
            break

        k = cv2.waitKey(1) & 0xFF
        if k == 27:
            break

        mode = cv2.getTrackbarPos("BLUR_MODE", "BlurPane")
        val = cv2.getTrackbarPos("BLUR", "BlurPane")

    cv2.destroyAllWindows()


bluring()

결과

일반 blur

Gaussian Blur 

median Blur

 

bilateral Blur