Python+OpenCVガウスフィルタソース作成


ガウスフィルタリングにはガウスフィルタ,すなわちボリュームコアが必要である.本ブログでは,3*3のボリュームコアを用いたが,原理解析により,Gaussボリュームコアの具体的な値は自身の座標にのみ関係し,画像と直接関連していないことが分かったので,まずボリュームコアを計算し,その後画像のGaussフィルタリングを行うことができる.アルゴリズムステップ:(1)式に基づいてガウスボリュームコア内の具体的な値を計算し、ここでは2次元ガウスボリュームコアを構築するために使用され、作成中に係数部分を省いた(なぜ省いたのか分からないが、仕方がない...).そして公式に対して小さい修正(CSDNのその他の大物のアルゴリズムによって操作します)をして、正規化を覚えています;(2)入力画像を階調化処理する.(3)階調画像素点を遍歴し,画素点近傍(および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フィルタ図であった.明瞭な画像フィルタリングの結果はぼやけ,実験結果は理論的根拠に合致した.以上がガウスフィルタリングです.