OpenCV 필터링을 조사해 보았습니다.
19221 단어 Python3파이썬OpenCVmatplotlibnumpy
처음에
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')
Reference
이 문제에 관하여(OpenCV 필터링을 조사해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shinichirou/items/d710585fe6e0985635aa
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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')
Reference
이 문제에 관하여(OpenCV 필터링을 조사해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shinichirou/items/d710585fe6e0985635aa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)