Python+OpenCVガウスフィルタソース作成
1849 ワード
ガウスフィルタリングにはガウスフィルタ,すなわちボリュームコアが必要である.本ブログでは,3*3のボリュームコアを用いたが,原理解析により,Gaussボリュームコアの具体的な値は自身の座標にのみ関係し,画像と直接関連していないことが分かったので,まずボリュームコアを計算し,その後画像のGaussフィルタリングを行うことができる.アルゴリズムステップ:(1)式に基づいてガウスボリュームコア内の具体的な値を計算し、ここでは2次元ガウスボリュームコアを構築するために使用され、作成中に係数部分を省いた(なぜ省いたのか分からないが、仕方がない...).そして公式に対して小さい修正(CSDNのその他の大物のアルゴリズムによって操作します)をして、正規化を覚えています;(2)入力画像を階調化処理する.(3)階調画像素点を遍歴し,画素点近傍(およびGaussボリュームコアが一般的に大きい)をGaussフィルタリングする.コードは次のとおりです.
実験結果:上図は左から右にかけてそれぞれ原画像,階調図,Gaussフィルタ図であった.明瞭な画像フィルタリングの結果はぼやけ,実験結果は理論的根拠に合致した.以上がガウスフィルタリングです.
import cv2 as cv
import math
import numpy as np
#
def rgb2gray(img):
h=img.shape[0]
w=img.shape[1]
img1=np.zeros((h,w),np.uint8)
for i in range(h):
for j in range(w):
img1[i,j]=0.144*img[i,j,0]+0.587*img[i,j,1]+0.299*img[i,j,1]
return img1
#
def gausskernel(size):
sigma=1.0
gausskernel=np.zeros((size,size),np.float32)
for i in range (size):
for j in range (size):
norm=math.pow(i-1,2)+pow(j-1,2)
gausskernel[i,j]=math.exp(-norm/(2*math.pow(sigma,2))) #
sum=np.sum(gausskernel) #
kernel=gausskernel/sum #
return kernel
#
def gauss(img):
h=img.shape[0]
w=img.shape[1]
img1=np.zeros((h,w),np.uint8)
kernel=gausskernel(3) #
for i in range (1,h-1):
for j in range (1,w-1):
sum=0
for k in range(-1,2):
for l in range(-1,2):
sum+=img[i+k,j+l]*kernel[k+1,l+1] #
img1[i,j]=sum
return img1
image = cv.imread("D:/Testdata/selina.png")
grayimage=rgb2gray(image)
gaussimage = gauss(grayimage)
cv.imshow("image",image)
cv.imshow("grayimage",grayimage)
cv.imshow("gaussimage",gaussimage)
cv.waitKey(0)
cv.destroyAllWindows()
実験結果:上図は左から右にかけてそれぞれ原画像,階調図,Gaussフィルタ図であった.明瞭な画像フィルタリングの結果はぼやけ,実験結果は理論的根拠に合致した.以上がガウスフィルタリングです.