영상처리/OpenCV

각종 흐림효과

성혜영 2022. 6. 8. 13:41

흐림효과

블러링(Blurring) 또는 스무딩(Smoothing)이라 불리며, 노이즈를 줄이거나 외부 영향을 최소화 하는데 사용. > 연산 시 계산을 빠르고 정확하게 수행하는 데 도움

샘플링된 이미지를 재구성(이미지의 해상도를 변경하는 경우)에 사용

영상이나 이미지를 번지게 하며, 해당 픽셀의 주변값들과 비교하고 계산해서 픽셀들의 색상을 재조정. 크게 5가지 종류, 3가지 중요 매개변수. > 커널과 고정점, 테두리 외삽법



커널과 고정점

커널(kernel) : 이미지에서 (x,y)의 픽셀과 해당픽셀 주변을 포함한 작은 크기의 공간

이 영역 각각에 특정한 수식이나 함수 등을 적용해 새로운 이미지를 얻는 알고리즘에서 적용 영역의 형태와 요소가 결합되는 방식을 정의하는 템플릿을 의미하기도 함

신호처리 분야에서는 커널을 필터 라고도 함.

 

컨벌루션(Convolution) : 새로운 픽셀을 만들어 내기 위해 커널 크기의 화소 값을 이용해 어떤 시스템을 통과해 계산. ex) 블러링(blurring), 샤프닝(sharpening), 미분(Gradient, Laplacian)

 

고정점(anchor point) : 커널을 통해 컨벌루션된 값을 할당한 지점. 커널 내에서 고정점은 하나의 짖머을 가지며, 이미지와 어떻게 정렬되는지 나타냄

 

위 숫자는 행렬에 할당된 값을 나타내며, 박스는 3x3 크기와 99의 고정점(anchor point)을 갖는 커널임. 커널로 전영역에 걸쳐 연산을 수행하며 3x3 크기의 사각형을 기준으로 고정점 위치의 픽셀값 재조정. 이때 연산을 수행하는 방법은 커널의 종류(소벨커널, 가우시안 커널 등)에 따라 결정. 커널을 사용하는 알고리즘이 모든 픽셀에 대해 연산을 수행, 최종적으로 모든 픽셀의 값이 변경. 3x3, 5x5, 7x7 등 홀수의 값을 갖는 크기를 활용, 고정점은 중심부

모든 픽셀에 컨벌루션 진행시 테두리 부분을 처리할때 문제. -> 외삽법으로 해결

 

테두리 외삽법

테두리의 이미지 바깥쪽에 가상의 픽셀을 만들어 처리. 외삽법으로 가상의 픽셀 값을 할당하는데, 가상 픽셀의 값을 0으로 처리하거나 커널이 연산할 수 있는 부분부터 연산을 수행하기도 함. 또는 이미지 시작과 끝을 연결해 폐곡선을 형성해 이미지의 테두리부분을 대신 하게 함.



단순 흐림 효과

# 단순 흐림 효과 함수

dst = cv2.blur(

    src,

    ksize,

    anchor = None,

    borderType = None

)

 

입력 이미지(src)의 각 픽셀에 대해 커널을 적용해 모든 픽셀의 단순 평균을 구해 출력 이미지(dst)에 저장.

ksize : 커널의 크기

anchor : 커널을 정렬하는 방식을 지정해 고정점을 설정하는 데 사용

> null 값이나 none 값을 사용하면 고정점의 위치는 (-1, -1)을 가짐 > 커널을 기준으로 중앙에 위치함을 의미

borderType : 테두리 외삽법



박스 필터 흐림 효과

# 박스 필터 흐림 효과 함수

dst = cv2.boxFilter(

    src,

    ddepth,

    ksize,

    anchor = None,

    normalize = None,

    borderType = None

)

 

박스 필터 함수 > 커널의 내부 값이 모두 같은 필터

ddepth : 출력 이미지의 정밀도. int나 float이 아닌 C#의 MatyType처럼 cv2.CV_8U 형식

-1로 설정할 경우 입력 이미지와 동일한 정밀도 설정

normalize : 커널의 영역별 정규화 여부. 일반적으로 커널의 모든 값이 1을 갖지만, True로 지정할 경우 정규화된 박스 필터(normalized box filter)로 변경되며, 커널의 모든 값이 커널의 개수(면적)만큼 나눠짐.

 

중간값 흐림 효과

# 중간값 흐림 효과

dst = cv2.medianBlur(

    src,

    ksize

)

 

고정점을 사용하지 않고 중심 픽셀 주변으로 사각형 크기(ksize x ksize)의 이웃한 픽셀들의 중간값을 사용해 각 픽셀의 값 변경 > 고정점이 항상 커널의 중심에 있다고 가정

ksize : 홀수 값만 적용

src : 2차원 이하의 배열

 

가우시안 흐림 효과

# 가우시안 흐림 효과 함수

dst = cv2.GaussianBlur(

    src,

    ksize,

    sigmaX,

    sigmaY = None,

    borderType = None

)

 

흐림 효과 함수에서 가장 유용한 함수. 입력 이미지의 각 지점에 가우시안 커널을 적용해 합산한 다음, 출력 이미지 반환. 3x3, 5x5, 7x7 크기에 우수한 성능

ksize : 커널의 크기

sigmaX : x방향의 가우스 커널 표준 편차

sigmaY : y방향의 가우스 커널 표준 편차 > 0인경우 sigmaX의 값과 같아짐

가우스 표준 편차 값이 모두 0인 경우 커널의 크기로 sigmaX와 sigmaY를 계산

커널은 0보다 커야하며, 홀수 값만 입력 가능.

borderType : 테두리 외삽법



양방향 필터 흐림 효과

가장자리(edge)를 선명하게 보존하면서 노이즈를 우수하게 제거하는 흐림 효과 함수

두 종류의 가우시안 필터를 적용. 가우시안 가중치는 픽셀의 위치와 해당 위치의 값 사용. 

지름(d) : 흐림 효과를 적용할 각 픽셀 영역의 지름

시그마 색상(sigmaColor) : 색상공간(color domain)에서 사용할 가우시안 커널의 너비 > 매개변수의 값이 클수록 흐림 효과에 포함될 강도의 범위가 넓어짐

시그마 공간(sigmaSpace)은 좌표공간(space domain)에서 사용할 가우시안 커널의 너비 > 값이 클수록 인접한 픽셀에 영향을 미침

다른 흐림 효과 함수에 비해 느리며, 지름(d)이 클수록 수채화처럼 변형. > -1로 지정하는 경우 시그마공간(sigmaSpace)과 비례하도록 설정

 

# 양방향 필터 흐림효과 적용 > 가장자리 보존, 차이 모르겠음



import cv2



src = cv2.imread("Chapter5/Example-05-14-Py/crescent.jpg")



dst = cv2.bilateralFilter(src, 100, 33, 11, borderType=cv2.BORDER_ISOLATED)



cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

픽셀의 지름(d)을 100, 시그마 색상(sigmaColor)을 33, 시그마 공간(sigmaSpace)을 11로 지정

테두리 외삽을 고려하지 않도록 cv2.BORDER_IS0LATED 적용

 

'영상처리 > OpenCV' 카테고리의 다른 글

이미지 크기 조절  (0) 2022.06.08
이미지 변환 (확대/축소)  (0) 2022.06.08
선형 방정식 시스템의 해 찾기  (0) 2022.06.08
색상 공간 변환  (0) 2022.06.08
트랙바 생성  (0) 2022.06.08