[OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝] 7장_정리(1)

SUN·2022년 12월 17일
0

[7장 필터링]

7.1 영상의 필터링

7.1.1 필터링 연산 방법

  • 필터(filter)

    영상 처리에서 필터링(filtering)이란, 영상에서 원하는 정보만 통과시키고 원치 않는 정보는 걸러 내는 작업

    ex) 영상에서 지저분한 잡음을 걸러내어 깔끔하게 만드는 필터, 부드러운 느낌을 제거해 날카로운 느낌이 나도록 만드는 필터

    필터링은 마스크(mask)라고 부르는 작은 크기의 행렬을 이용

    마스크는 커널(kernel), 윈도우(window)라고도 부르며, 마스크 자체를 필터라고 부르기도 한다

    3X3 정방형 행렬이 가장 널리 사용되고있다

    필터링 연산의 결과는 마스크 행렬의 모양과 원소 값에 의해 결정된다

  • 마스크 연산

    마스크 행렬의 모든 원소에 대하여 마스크 행렬 원소 값과 같은 위치에 있는 입력 영상 픽셀 값을 서로 곱한 후, 그 결과를 모두 더하는 연산


    영상의 맨 바깥쪽, 가장자리 픽셀에서는 앞선 수식을 적용하기 어렵다

    영상의 가장자리 픽셀에 대해 필터링을 수행할때는 특별한 처리를 해야하는데,

    영상의 가장자리 픽셀을 확장하여 영상 바깥쪽에 가상의 픽셀을 만든다

7.1.2 엠보싱 필터링

  • 엠보싱

    올록볼록한 형태로 만든 객체의 윤곽 또는 무늬

  • 엠보싱 필터

    입력 영상을 엠보싱 느낌이 나도록 변환하는 필터

    보통 입력 영상에서 픽셀 값 변화가 적은 평탄한 영역은 회색으로 설정하고, 객체의 경계 부분은 좀 더 밝거나 어둡게 설정하면 엠보싱 느낌이 난다

    결과 영상에 128을 더하는것이 보기 좋다

  • 예제코드

필터
import sys
import numpy as np
import cv2


src = cv2.imread('rose.bmp', cv2.IMREAD_GRAYSCALE)

if src is None:
    print('Image load failed!')
    sys.exit()

emboss = np.array([[-1, -1, 0],
                   [-1, 0, 1],
                   [0, 1, 1]], np.float32)

dst = cv2.filter2D(src, -1, emboss, delta=128)

cv2.imshow('src', src)
cv2.imshow('dst', dst)

cv2.waitKey()
cv2.destroyAllWindows()

cv2.filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None)

src : 입력 영상
ddepth : 출력 영상데이터 타입(-1을 지정하면 src와 같은 타입의 dst영상을 생성한다)
kernel : 필터 마스크 행렬
anchor : 고정점 위치
delta : 추가적으로 더할 값
borderType : 가장자리 픽셀 확장 방식



7.2 블러링 : 영상 부드럽게 하기

  • 블러링(blurring)

    초점이 맞지 않은 사진처럼 영상을 부드럽게 만드는 필터링 기법

    스무딩(smoothing)이라고도 함

    인접한 픽셀 간의 픽셀 값 변화가 크지 않은 경우 부드러운 느낌을 받을 수 있다

    영상을 부드럽게 만드는 용도로 사용하거나, 입력 영상에 존재하는 잡음을 제거하는 전처리 과정으로도 사용한다

7.2.1 평균값 필터

  • 평균값 필터(mean filter)

    입력 영상에서 특정 픽셀과 주변 픽셀들의 산술 평균을 결과 영상 픽셀 값으로 설정하는 필터

    평균값 필터에 의해 생성되는 결과 영상은 픽셀 값의 급격한 변화가 줄어들어 날카로운 에지가 무뎌지고 잡음의 영향이 크게 사라지는 효과

    평균값 필터를 너무 과하게 사용하면, 사물의 경계가 흐릿해지고 사물의 구분이 어려워질 수 있다

    평균값 필터의 크기가 커질수록 결과 영상이 더욱 부드럽게 변경되는것을 볼 수 있다

    필터 마스크 행렬은 모든 원소 합이 1도는 0이 되도록 한다

    합이 1이면 필터링 결과 영상의 평균 밝기가 입력 영상 평균 밝기와 같게 유지된다

    합이 1보다 작으면 입력 영상보다 어두운 결과 영상이 생성되고,

    반대로 합이 1보다 크면 좀 더 밝은 형태의 결과 영상이 생성된다

    그러므로 평균 밝기를 그대로 유지하려면 필터 마스크 행렬의 원소의 합이 1이 되어야한다

    원소의 합이 0이면 전체적으로 검은색으로 구성된 결과 영상이 생성된다

7.2.2 가우시안 필터

평균값 필터 블러링의 단점은 필터링 대상 위치에서 가까이 있는 픽셀과 멀리 있는 픽셀이 모두 같은 가중치를 사용하여 평균을 계산한다

멀리있는 픽셀의 영향을 많이 받아 필터 결과의 퀄리티가 낮아지게 된다

이러한 단점을 보완하기 위해 가우시안 필터를 사용한다

  • 가우시안 필터(Gaussian filter)

    평균값 필터보다 자연스러운 블러링 결과를 생성해 냄

    가우시안 분포(Gaussian distribution) 함수를 근사하여 생성한 필터 마스크를 사용하는 필터링 기법

  • 가우시안 분포

    평균을 중심으로 좌우 대칭의 종 모양(bell shape)을 갖는 확률 분포를 말하며, 정규 분포(normal distribution)이라고도 한다

    평균과 표준 편차에 따라 분포 모양이 결정된다

    영상의 가우시안 필터에서는 주로 평균이 0인 가우시안 분포 함수를 사용한다

가우시안 필터 마스크가 가중 평균을 구하기 위한 가중치 행렬 역할을 한다

표준 편차 값(sigma x, y)이 커질수록 결과 영상이 더욱 부드럽게 변경되는것을 볼 수 있다

  • 예제코드
블러링
import numpy as np
import cv2


def blurring_mean():
    src = cv2.imread('rose.bmp', cv2.IMREAD_GRAYSCALE)

    if src is None:
        print('Image load failed!')
        return

    cv2.imshow('src', src)

    for ksize in (3, 5, 7):
        dst = cv2.blur(src, (ksize, ksize))

        desc = "Mean: %dx%d" % (ksize, ksize)
        cv2.putText(dst, desc, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                   1.0, 255, 1, cv2.LINE_AA)

        cv2.imshow('dst', dst)
        cv2.waitKey()

    cv2.destroyAllWindows()


def blurring_gaussian():
    src = cv2.imread('rose.bmp', cv2.IMREAD_GRAYSCALE)

    if src is None:
        print('Image load failed!')
        return

    cv2.imshow('src', src)

    for sigma in range(1, 6):
        dst = cv2.GaussianBlur(src, (0, 0), sigma)

        desc = "Gaussian: sigma = %d" % (sigma)
        cv2.putText(dst, desc, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                   1.0, 255, 1, cv2.LINE_AA)

        cv2.imshow('dst', dst)
        cv2.waitKey()

    cv2.destroyAllWindows()


if __name__ == '__main__':
    blurring_mean()
    blurring_gaussian()

cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)

src : 입력 영상
ksize : 평균값 필터 크기. (width, height) 형태의 튜플
dst : 결과영상 

cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

src : 입력 영상
dst : 출력 영상
ksize : 가우시안 커널 크기.(0,0)을 지저하면 sigma 값에 의해 자동 결정됨
sigmaX : x방향 sigma
sigmaY : y 방향 sigma. 0이면 sigmaX와 같게 설정
borderType : 가장자리 픽셀 확장 방식 

0개의 댓글