이미지도 음성 신호처럼 주파수로 표현이 가능하다. 고주파는 밝기의 변화가 많은 곳, 즉 경계선 영역에서 나타나고 일반적인 배경은 저주파로 나타난다. 이를 바탕으로 고주파를 제거하면 Blur처리가 되고, 저주파를 제거하면 대상의 영역을 확인할 수 있다.
LPF를 적용하면 노이즈 제거나 Blur처리를 할 수 있고, HPF를 적용하면 경계선을 찾을 수 있다.
Box 형태의 커널을 이미지에 적용한 후 평균값을 Box의 중심점에 적용
cv2.blur(src,ksize) -> dst : 위 예제와 동일한 역할
ksize는 튜플 형태 (3,3 등)
import cv2
import numpy as np
def nothing(x):
pass
img = cv2.imread('squirrel1.jpg')
cv2.namedWindow('Image')
cv2.createTrackbar('K','Image',1,20,nothing)
while True:
if cv2.waitKey(1) & 0xFF == 27:
break
k = cv2.getTrackbarPos('K','Image')
if k == 0:
k = 1
kernel = np.ones((k,k),np.float32) / k**2
dst = cv2.filter2D(img,-1,kernel)
cv2.imshow('Image',dst)
cv2.destroyAllWindows()
# 1.Averaging Blur
import cv2
import numpy as np
img = cv2.imread('emoji1.png')
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
img_blur = cv2.blur(img,(7,7))
images = [img,img_blur]
titles = ['Original','Box Blur(7X7)']
plt.figure(figsize=(14,14))
for i in range(len(images)):
plt.subplot(1,2,i+1)
plt.imshow(images[i])
plt.title(titles[i])
plt.tight_layout()
plt.show()
Gaussian Filter는 Gaussian 함수를 이용한 값으로 이루어진 커널 사용
cv2.GaussianBlur(img,ksize,sigmaX)
ksize는 width,height가 다를 수 있지만 양수의 홀수이어야 함
# 2. Gaussian Filtering
import cv2
import numpy as np
img = cv2.imread('emoji1.png')
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
img_noise = img.copy()
img_noise = np.clip((img/255 + np.random.normal(
scale = 0.1, size = img.shape)) * 255, 0, 255).astype('uint8')
img_gaussian = cv2.GaussianBlur(img_noise,(7,7),0)
images = [img_noise,img_gaussian]
titles = ['White Noise','Gaussian Blur(7X7)']
plt.figure(figsize=(14,14))
for i in range(len(images)):
plt.subplot(1,2,i+1)
plt.imshow(images[i])
plt.title(titles[i])
plt.tight_layout()
plt.show()
커널내의 값들을 정렬한 후 중간값을 선택하여 적용
cv2.medianBlur(src,ksize)
ksize는 1보다 큰 홀수(3,5 등)
# 3. Median Filtering
import cv2
import numpy as np
img = cv2.imread('emoji1.png')
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
img_pepper = img.copy()
n = 10000
np.random.seed(20)
idx1 = np.random.randint(img_pepper.shape[0],size = n)
idx2 = np.random.randint(img_pepper.shape[1],size = n)
img_pepper[idx1,idx2] = 0
img_median = cv2.medianBlur(img_pepper,9)
images = [img_pepper,img_median]
titles = ['Pepper Noise','Median Blur(9X9)']
plt.figure(figsize=(14,14))
for i in range(len(images)):
plt.subplot(1,2,i+1)
plt.imshow(images[i])
plt.title(titles[i])
plt.tight_layout()
plt.show()
지금까지의 Blur처리와 달리 경계선을 유지하며 Gaussian Blur처리
Gaussian 필터를 적용하고 또 하나의 Gaussian 필터를 주변 픽셀까지 고려하여 적용하는 방식
cv2.bilateralBlur(src,d,sigmaColor,sigmaSpace)
src : 8비트, 1 or 3 채널 이미지
d : 필터링시 고려할 주변 픽셀 지름 (커널 사이즈)
sigmaColor : 색을 고려할 공간. 숫자가 크면 멀리 있는 색도 고려
sigmaSpace : 숫자가 크면 멀리 있는 픽셀도 고려
# 4. Bilateral Filtering
import cv2
import numpy as np
img = cv2.imread('emoji1.png')
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
img_noise = img.copy()
img_noise = np.clip((img/255 + np.random.normal(
scale = 0.1, size = img.shape)) * 255, 0, 255).astype('uint8')
img_bilateral = cv2.bilateralFilter(img_noise,9,75,75)
images = [img_noise,img_bilateral]
titles = ['White Noise','Bilateral Filtering(9X9)']
plt.figure(figsize=(14,14))
for i in range(len(images)):
plt.subplot(1,2,i+1)
plt.imshow(images[i])
plt.title(titles[i])
plt.tight_layout()
plt.show()
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('squirrel1.jpg')
# pyplot을 위해 BGR -> RGB 변환
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
# 1. Averaging
dst1 = cv2.blur(img,(7,7))
# 2. Gaussian Blur
dst2 = cv2.GaussianBlur(img,(5,5),0)
# 3. Median Blur
dst3 = cv2.medianBlur(img,9)
# 4. Bilateral Filtering
dst4 = cv2.bilateralFilter(img,9,75,75)
images = [img,dst1,dst2,dst3,dst4]
titles = ['Original','Blur(7X7)','Gaussian Blur(5X5)','Median Blur','Bilateral']
plt.figure(figsize=(8,8))
for i in range(5):
plt.subplot(3,2,i+1)
plt.imshow(images[i])
plt.title(titles[i])
plt.tight_layout()
plt.show()