Python에 의한 화상 처리 100개 노크 #11 평활화 필터(평균 필터)

소개



아무래도, 라무입니다.
이번에는 이미지의 노이즈를 제거하는 메디안 필터를 구현합니다.

11개째: 평활화 필터(평균 필터)



평활화 필터는 이미지를 평활화하는 필터입니다. 이 필터를 적용하여 전체 이미지를 흐리게 처리할 수 있습니다.

이 필터는 관심 픽셀을 주변 픽셀의 평균값으로 대체합니다.
예를 들어, 3×3 또는 5×5의 평균 필터는 다음과 같습니다.


$\frac{1}{9}$
$\frac{1}{9}$
$\frac{1}{9}$


$\frac{1}{9}$
$\frac{1}{9}$
$\frac{1}{9}$

$\frac{1}{9}$
$\frac{1}{9}$
$\frac{1}{9}$



$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$


$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$

$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$

$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$

$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$
$\frac{1}{25}$


주목 화소가 중심이라고 하면, 주변 화소와 대응하는 필터치의 곱의 합을 주목 화소에 대입하면 좋네요.
3×3 필터라면 $I(x_0,y_0)×\frac{1}{9} + I(x_0,y_1)×\frac{1}{9} + ... I(x_2,y_2)×\frac{1}{9}$ 의 값을 주목 픽셀에 대입합니다. 이제 주변 화소의 평균값이 주목 화소에 대입되고 있네요.

또, 전회와 같이, 화상의 단부 부분은 필터링 처리를 실시할 수 없기 때문에 존재하지 않는 화소는 0을 이용하는 0패딩 처리를 실시합니다.

소스 코드



meanFilter.py
import numpy as np
import cv2
import matplotlib.pyplot as plt


def meanFilter(img,k):
  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/k**2)

  # フィルタリング処理
  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')

# 平均フィルタ
img = meanFilter(img,9)

# 画像保存
cv2.imwrite('result.jpg', img)
# 画像表示
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()



이미지 왼쪽은 입력 이미지이고 이미지 오른쪽은 출력 이미지입니다.
흐릿한 느낌의 출력 화상이 되어 있어, 평활화를 실시할 수 있는 것을 알 수 있습니다.

결론



만약, 질문이 있는 분이 계시면 부담없이 부디.
imori_imori씨의 Github 에 공식의 해답이 실려 있으므로 꼭 그쪽도 확인해 보세요.
그런 다음 파이썬은 초보자이므로 잘못된 곳이 있더라도 부드럽게 지적하십시오.

좋은 웹페이지 즐겨찾기