OpenCV 필터링을 조사해 보았습니다.

처음에



OpenCV에서 제공하는 필터링 처리에 대해 살펴 보았습니다.

운영 환경



Python3, OpenCV

단순 평활화(흐림/흐림) 처리



원본 이미지는 다음 데이터 (그레이 스케일)로 단순 평활화 (흐림)를 수행합니다.


단순 평활화는 각 픽셀을 둘러싸는 여러 픽셀의 직사각형의 단순 평균을 해당 픽셀의 값으로 설정합니다.
여기에서는 직사각형의 크기를 (3*3)로 하기 위해 다음과 같이 계산됩니다


전체 픽셀을 계산하면 다음과 같습니다.

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cm

black = [0x00, 0x00, 0x00]
white = [0xFF, 0xFF, 0xFF]

img = np.array([
                [black, black, black, black, black, black, black]
                ,[black, black, black, black, black, black, black]
                ,[black, black, white, white, white, black, black]
                ,[black, black, white, white, white, black, black]
                ,[black, black, white, white, white, black, black]
                ,[black, black, black, black, black, black, black]
                ,[black, black, black, black, black, black, black]                               
                ]
                , dtype=np.uint8)

# グレースケール化
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)

# グラフ描画域
fig = plt.figure(figsize=(8, 3))
ax1 = fig.add_subplot(121, projection='3d')
ax2 = fig.add_subplot(122, projection='3d')

# X,Y
_x = np.arange(img.shape[1])
_y = np.arange(img.shape[0])
_xx, _yy = np.meshgrid(_x, _y)
x, y = _xx.ravel(), _yy.ravel()
width = depth = 1

# 高さ
top = img.ravel()
bottom = np.zeros_like(top)

# 0-255 を 0.0-1.0に変換する関数の定義(グレースケール表示の為)
norm = colors.Normalize(0, 255)

# オリジナル
color_values = cm.gray(top.tolist())
ax1.bar3d(x, y, bottom, width, depth, top, color=color_values)
ax1.set_title('Original')

# Blur(カーネルサイズ 3*3)
blurImg = cv.blur(img, (3, 3))
top = blurImg.ravel()
color_values = cm.gray(norm(top.tolist()))
ax2.bar3d(x, y, bottom, width, depth, top, color=color_values)
ax2.set_title('Blur')

plt.show()





메디안 필터링



메디안 필터는, 각 픽셀을 둘러싸는 직사각형의 중간치를, 그 픽셀의 값으로 합니다


전체 픽셀을 계산하면 다음과 같습니다.

# medianBlur(カーネルサイズ 3*3)
mBlurImg = cv.medianBlur(img, 3)
top = mBlurImg.ravel()
color_values = cm.gray(norm(top.tolist()))
ax2.bar3d(x, y, bottom, width, depth, top, color=color_values)
ax2.set_title('medianBlur')





Gaussian(가우시안) 필터링



가우시안 필터는 각 픽셀을 둘러싸는 직사각형에 가우스 커널이라는 행렬을 곱하여 그 합계를 픽셀의 값으로 만듭니다.
여기서 사용하고 있는 3*3의 가우스 커널은 다음과 같습니다.
\begin{pmatrix}
1/16 & 2/16 & 1/16 \\
2/16 & 4/16 & 2/16 \\ 
1/16 & 2/16 & 1/16
\end{pmatrix}



PixelA는 다음과 같이 계산됩니다.
import numpy as np

pixelA = np.array([[0, 0, 0]
                   ,[0, 255, 255]
                   ,[0, 255, 255]])
gaussKernel = np.array([[1/16, 2/16, 1/16]
                        ,[2/16, 4/16, 2/16]
                        ,[1/16, 2/16, 1/16]])
print(sum(sum(pixelA * gaussKernel))) 
#143  

전체 픽셀을 계산하면 다음과 같습니다.

# GaussianBlur
gBlurImg = cv.GaussianBlur(img, (3, 3), 0, 0)
top = gBlurImg.ravel()
color_values = cm.gray(norm(top.tolist()))
ax2.bar3d(x, y, bottom, width, depth, top, color=color_values)
ax2.set_title('GaussianBlur')



좋은 웹페이지 즐겨찾기