Python으로 이미지 처리 100 개 노크 # 9 가우시안 필터
소개
아무래도, 라무입니다.
이번에는 이미지의 노이즈를 제거하는 가우시안 필터를 구현합니다.
9개째: 가우시안 필터
가우시안 필터는 이미지를 평활화하는 필터입니다. 이 필터를 적용하여 전체 이미지를 흐리게 처리할 수 있습니다.
이 필터에서는 주목 화소의 주변 화소를 가우스 분포에 의해 가중하고, 필터의 중심 화소에 가까울수록 큰 가중치를 붙입니다. 가우스 분포에 의한 가중치는 다음과 같이 정의됩니다.
g(x,y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}
예를 들면, 3×3이나 5×5의 가우시안 필터는 이하의 필터가 자주 이용됩니다. 아마 인수 s에 $σ=0.85$당을 지정하면 이 값이 될까 생각합니다.
$\frac{1}{16}$
$\frac{2}{16}$
$\frac{1}{16}$
$\frac{2}{16}$
$\frac{4}{16}$
$\frac{2}{16}$
$\frac{1}{16}$
$\frac{2}{16}$
$\frac{1}{16}$
$\frac{1}{256}$
$\frac{4}{256}$
$\frac{6}{256}$
$\frac{4}{256}$
$\frac{1}{256}$
$\frac{4}{256}$
$\frac{16}{256}$
$\frac{24}{256}$
$\frac{16}{256}$
$\frac{4}{256}$
$\frac{6}{256}$
$\frac{24}{256}$
$\frac{36}{256}$
$\frac{24}{256}$
$\frac{6}{256}$
$\frac{4}{256}$
$\frac{16}{256}$
$\frac{24}{256}$
$\frac{16}{256}$
$\frac{4}{256}$
$\frac{1}{256}$
$\frac{4}{256}$
$\frac{6}{256}$
$\frac{4}{256}$
$\frac{1}{256}$
주목 화소가 중심이라고 하면, 주변 화소와 대응하는 필터치의 곱의 합을 주목 화소에 대입하면 좋네요.
3×3 필터라면 $I(x_0,y_0)×\frac{1}{16} + I(x_0,y_1)×\frac{2}{16} + ... I(x_2,y_2)×\frac{1}{16}$ 의 값을 주목 픽셀에 대입합니다.
또한 이미지의 끝 부분은 필터링 처리를 할 수 없기 때문에 존재하지 않는 픽셀은 0을 사용합니다. 이것을 0 패딩이라고합니다.
소스 코드
gaussianFilter.py
import numpy as np
import cv2
import matplotlib.pyplot as plt
def gaussianFilter(img,k,s):
w,h,c = img.shape
size = k // 2
# 0パディング処理
_img = np.zeros((w+2*size,h+2*size,c), dtype=np.uint8)
_img[size:size+w,size:size+h] = img.copy().astype(np.uint8)
dst = _img.copy()
# フィルタ作成
ker = np.zeros((k,k), dtype=np.float)
for x in range(-1*size,k-size):
for y in range(-1*size,k-size):
ker[x+size,y+size] = (1/(2*np.pi*(s**2)))*np.exp(-1*(x**2+y**2)/(2*(s**2)))
ker /= ker.sum()
# フィルタリング処理
for x in range(w):
for y in range(h):
for z in range(c):
dst[x+size,y+size,z] = np.sum(ker*_img[x:x+k,y:y+k,z])
dst = dst[size:size+w,size:size+h].astype(np.uint8)
return dst
# 画像読込
img = cv2.imread('image.jpg')
# ガウシアンフィルタ
# 第2引数:フィルタサイズ、第3引数:標準偏差(σ)
img = gaussianFilter(img,21,2)
# 画像保存
cv2.imwrite('result.jpg', img)
# 画像表示
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
이미지 왼쪽은 입력 이미지이고 이미지 오른쪽은 출력 이미지입니다.
점 형상의 노이즈가 저감되어 있는 것을 알 수 있습니다.
결론
만약, 질문이 있는 분이 계시면 부담없이 부디.
imori_imori씨의 Github 에 공식의 해답이 실려 있으므로 꼭 그쪽도 확인해 보세요.
그런 다음 파이썬은 초보자이므로 잘못된 곳이 있더라도 부드럽게 지적하십시오.
Reference
이 문제에 관하여(Python으로 이미지 처리 100 개 노크 # 9 가우시안 필터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/muro5866/items/f55ec1eaccdda462bde6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)