OpenCV의 블러 필터

Salman Mehmood 2024년2월15일
OpenCV의 블러 필터

이 데모에서는 OpenCV에서 이미지를 부드럽게 하거나 흐리게 하는 방법을 소개합니다. 이 기사의 끝에서 다양한 유형의 흐림 필터와 사용 방법에 대해 설명합니다.

OpenCV에서 다양한 유형의 블러 필터 사용

블러링이라고도 하는 스무딩은 이미지 처리에서 가장 일반적으로 사용되는 작업 중 하나입니다. 일반적으로 이미지에서 노이즈를 제거하는 데 사용됩니다.

선형 필터는 달성하기 쉽고 상대적으로 빠르기 때문에 다양한 선형 필터를 사용할 수 있습니다. OpenCV에서 사용할 수 있는 다양한 종류의 필터가 있습니다. 예를 들어 Homogeneous, Gaussian, median 또는 양측 필터는 개별적으로 볼 수 있습니다.

우선, 우리는 균질 필터를 볼 것입니다. 동종 필터는 간단하며 각 출력 픽셀은 동종 필터에서 커널 이웃의 평균입니다.

모든 픽셀은 동일한 가중치로 기여하므로 균일 필터라고 합니다. 즉, 커널은 이미지에 적용하거나 컨볼루션할 수 있는 모양입니다.

numpy는 이런 종류의 제곱 커널을 만듭니다. 따라서 동종 필터에서 커널은 다음 이미지와 같습니다.

Opencv 블러 예제 1

동종 필터에서 커널 K는 1을 커널 너비로 나눈 값에 커널 높이를 곱한 것과 같습니다. 이 공식을 사용하여 5 x 5 커널을 사용하려는 경우 K는 1을 25로 나누고 1의 5 x 5 커널 행렬을 갖게 됩니다.

Opencv 블러 예제 2

이제 filter2D() 또는 동종 필터를 사용하여 이미지 필터링을 위해 이 커널을 생성해야 합니다. 먼저 imread() 메서드를 사용하여 이미지를 읽습니다.

IMG = cv2.imread("opencv-logo.jpg")

matplotlib는 RGB 형식의 이미지를 읽고 OpenCV는 BGR 형식의 이미지를 읽기 때문에 이미지를 BGR에서 RGB로 변환해야 합니다.

IMG = cv2.cvtColor(IMG, cv2.COLOR_BGR2RGB)

float32 데이터 유형과 함께 ones() 메서드를 사용하여 5x5 커널을 정의해야 하며 이를 25로 나눕니다.

K = np.ones((5, 5), np.float32) / 25

이제 정의된 커널을 지원하여 대상 이미지를 정의할 수 있습니다. 균질 필터에는 filter2D()라는 방법이 사용됩니다.

첫 번째 매개변수는 소스 이미지, 두 번째 매개변수는 대상 이미지의 원하는 깊이, 세 번째 매개변수는 커널입니다.

HMG = cv2.filter2D(IMG, -1, K)

다음 줄에서는 for 루프를 반복하고 있으며 이 루프를 통해 matplotlib에 1 x 2 형식으로 이미지를 표시합니다.

for j in range(2):
    plot.subplot(1, 2, j + 1), plot.imshow(IMGS[j], "gray")

완전한 예제 소스 코드:

import numpy as np
import matplotlib.pyplot as plot

IMG = cv2.imread("opencv-logo.jpg")
IMG = cv2.cvtColor(IMG, cv2.COLOR_BGR2RGB)

K = np.ones((5, 5), np.float32) / 25
HMG = cv2.filter2D(IMG, -1, K)


T = ["Original IMG", "2D Convolution"]
IMGS = [IMG, HMG]

for j in range(2):
    plot.subplot(1, 2, j + 1), plot.imshow(IMGS[j], "gray")
    plot.title(T[j])
    plot.xticks([]), plot.yticks([])

plot.show()

모서리에 약간의 노이즈가 있는 것을 볼 수 있으며 이 이미지에 2D 컨볼루션을 적용한 후 모서리가 약간 매끄럽거나 흐려집니다. 노이즈는 이 블러에 의해 제거되거나 억제되므로 filter2D() 메서드를 사용하여 이미지를 흐리게 하는 한 가지 방법입니다.

Opencv 블러 출력 1

블러 필터

1차원 이미지는 저역 통과 필터 또는 고역 통과 필터로 필터링할 수 있습니다. 저역 통과 필터는 이미지의 노이즈나 흐릿함 등을 제거하는 데 도움이 되고, 고역 통과 필터는 이미지의 가장자리를 찾는 데 도움이 됩니다.

흐린 이미지를 얻으려면 저역 통과 필터로 이미지를 변환해야 합니다. OpenCV에서는 다양한 종류의 알고리즘을 사용할 수 있습니다. 첫 번째 알고리즘은 blur() 메서드입니다.

blur() 방법은 평균화 방법이라고도 하며, 평균화 알고리즘을 적용하여 흐린 이미지를 만드는 데 사용할 것입니다. 이 메서드는 두 개의 매개변수를 사용합니다. 첫 번째는 이미지이고 두 번째는 (5,5)가 될 커널입니다.

import cv2
import numpy as np
import matplotlib.pyplot as plot

IMG = cv2.imread("opencv-logo.jpg")
IMG = cv2.cvtColor(IMG, cv2.COLOR_BGR2RGB)

K = np.ones((5, 5), np.float32) / 25
HMG = cv2.filter2D(IMG, -1, K)
BL = cv2.blur(IMG, (5, 5))

T = ["Original IMG", "2D Convolution", "Blur"]
IMGS = [IMG, HMG, BL]

for j in range(3):
    plot.subplot(1, 3, j + 1), plot.imshow(IMGS[j], "gray")
    plot.title(T[j])
    plot.xticks([]), plot.yticks([])

plot.show()

결과는 2D 컨볼루션과 흐림 사이에서 거의 동일하게 보입니다. 왜냐하면 우리는 두 함수에 같은 종류의 커널을 적용했기 때문입니다.

Opencv 블러 출력 2

가우스 필터

다음 알고리즘인 가우스 필터 알고리즘을 살펴보겠습니다. 가우스 필터는 x 및 y 방향 모두에서 다른 가중치 커널을 사용하는 것뿐입니다.

출력에서 픽셀은 더 높거나 더 큰 가중치를 가진 커널 중앙에 위치합니다. 가중치는 이웃 중심에서 멀어질수록 감소합니다.

가중치가 작은 픽셀은 측면에 있고 가중치가 높은 픽셀은 중앙에 있습니다.

5x5 커널을 사용하면 결과가 이미지와 같이 보일 것입니다.

Opencv 블러 예제 3

OpenCV에서 GaussianBlur() 메서드를 사용하는 방법을 살펴보겠습니다. 매개변수는 blur() 메소드와 동일하므로 첫 번째 매개변수는 입력 이미지, 두 번째 매개변수는 커널, 세 번째 매개변수는 Sigma X 값입니다.

import cv2
import numpy as np
import matplotlib.pyplot as plot

IMG = cv2.imread("eye.jpg")
IMG = cv2.cvtColor(IMG, cv2.COLOR_BGR2RGB)

K = np.ones((5, 5), np.float32) / 25
HMG = cv2.filter2D(IMG, -1, K)
BL = cv2.blur(IMG, (5, 5))
GB = cv2.GaussianBlur(IMG, (5, 5), 0)

T = ["Original IMG", "2D Convolution", "Blur", "GaussianBlur"]
IMGS = [IMG, HMG, BL, GB]

for j in range(4):
    plot.subplot(2, 2, j + 1), plot.imshow(IMGS[j], "gray")
    plot.title(T[j])
    plot.xticks([]), plot.yticks([])

plot.show()

GaussianBlur() 방법의 결과가 다른 블러 방법보다 우수함을 알 수 있습니다.

노이즈가 너무 많은 원본 이미지를 보십시오. GaussianBlur() 메서드를 적용하면 모든 노이즈가 제거됩니다.

따라서 GaussianBlur() 메서드는 이미지에서 고주파 노이즈를 제거하기 위해 특별히 설계되었습니다.

Opencv 블러 출력 3

중앙값 필터

중앙값 필터는 각 픽셀 값을 인접 픽셀의 중앙값으로 바꾸는 것입니다. medianBlur() 메서드는 소금과 후추 노이즈가 있는 이미지를 처리할 때 유용합니다.

소금 후추 소음에 대해 더 알고 싶다면 이 링크를 따르십시오.

여기에 이미지가 있습니다. 일부 픽셀은 왜곡되고 일부는 흰색 점 또는 백색 노이즈이며 일부는 블랙 노이즈가 보이는 곳입니다. 픽셀이 소금처럼 왜곡되고 검은 픽셀이 후추처럼 보이기 때문에 소금과 후추 노이즈라고 합니다.

샘플 물 이미지

이 이미지를 medianBlur() 메서드의 소스로 사용합시다. 소스 이미지는 첫 번째 매개변수가 되고 두 번째는 커널 크기가 됩니다.

커널 크기는 1을 제외하고 3, 5, 7 등과 같이 홀수여야 합니다. 1을 사용하면 원본 이미지가 표시됩니다.

import cv2
import numpy as np
import matplotlib.pyplot as plot

IMG = cv2.imread("water.jpg")
IMG = cv2.cvtColor(IMG, cv2.COLOR_BGR2RGB)

K = np.ones((5, 5), np.float32) / 25
HMG = cv2.filter2D(IMG, -1, K)
BL = cv2.blur(IMG, (5, 5))
GB = cv2.GaussianBlur(IMG, (5, 5), 0)
MB = cv2.medianBlur(IMG, 5)

T = ["Original IMG", "2D Convolution", "Blur", "GaussianBlur", "medianBlur"]
IMGS = [IMG, HMG, BL, GB, MB]

for j in range(5):
    plot.subplot(2, 3, j + 1), plot.imshow(IMGS[j], "gray")
    plot.title(T[j])
    plot.xticks([]), plot.yticks([])

plot.show()

아래에서 medianBlur() 메서드를 사용하여 얻은 최상의 결과를 볼 수 있습니다.

Opencv 블러 출력 4

양방향 필터

양방향 필터라고 하는 마지막 필터를 살펴보겠습니다. 그래서 다른 필터를 사용하여 노이즈를 제거할 뿐만 아니라 가장자리도 매끄럽게 만들었습니다.

때로는 가장자리를 보존해야 합니다. 즉, 이미지가 흐려져도 모든 가장자리가 선명하게 유지됩니다.

bilateralFilter() 메서드는 이미지를 첫 번째 매개변수로 사용합니다. 두 번째 매개변수는 필터 동안 사용된 각 픽셀의 직경이고, 세 번째 매개변수는 시그마 색상이고, 네 번째 매개변수는 시그마 공간입니다.

시그마 색상은 색상 공간의 필터 시그마이고 시그마 공간은 좌표 공간의 필터 시그마입니다.

import cv2
import numpy as np
import matplotlib.pyplot as plot

IMG = cv2.imread("lena-1.jpg")
IMG = cv2.cvtColor(IMG, cv2.COLOR_BGR2RGB)

K = np.ones((5, 5), np.float32) / 25
HMG = cv2.filter2D(IMG, -1, K)
BL = cv2.blur(IMG, (5, 5))
GB = cv2.GaussianBlur(IMG, (5, 5), 0)
MB = cv2.medianBlur(IMG, 5)
BF = cv2.bilateralFilter(IMG, 9, 75, 75)

T = [
    "Original IMG",
    "2D Convolution",
    "Blur",
    "GaussianBlur",
    "medianBlur",
    "bilateralFilter",
]
IMGS = [IMG, HMG, BL, GB, MB, BF]
plot.figure(figsize=(8, 6))
for j in range(6):
    plot.subplot(2, 3, j + 1), plot.imshow(IMGS[j], "gray")
    plot.title(T[j])
    plot.xticks([]), plot.yticks([])

plot.show()

bilateralFilter() 메서드가 적용된 경우 가장자리가 훨씬 더 잘 보존되는 방법을 살펴보십시오. 양방향 필터는 가장자리를 날카롭게 유지하면서 노이즈를 제거하는 데 매우 효과적입니다.

Opencv 블러 출력 5

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

관련 문장 - Python OpenCV