数字图像处理编程基础:Python语言不调用OpenCV函数实现任意滤波模板对图像进行滤波

Python语言不调用OpenCV函数实现任意模板滤波

    • 编译环境
    • 前提
    • 代码
    • 滤波结果如下
    • 总结

编译环境

由于编程语言选择Python,所以博主用的编译器为PyCharm 2017

前提

岗萨勒斯第三版的数字图像处理中,介绍到空间滤波器模板,为了实现任意模板的滤波,例如3×3或5×5的均值滤波和3×3或5×5的高斯滤波,以及任意数值的空间滤波模板,用python语言在PyCharm中编写了如下代码。

代码

此次例中中采用的是5×5,sigma=1.4的高斯滤波模板,模板设置如下:
数字图像处理编程基础:Python语言不调用OpenCV函数实现任意滤波模板对图像进行滤波_第1张图片
代码如下

import cv2
from pylab import *

def GeneralFilter(Image,a):           #输入图像Image,模板a
    im=array(Image)
    dim=math.sqrt(len(a))             # 模板的维度dim
    w=im.shape[0]                     # 计算输入图像的宽高
    h=im.shape[1]
    b=[]                              # 待处理的与模板等大小的图像块,BGR通道
    g=[]
    r=[]
    for i in range(int(dim/2),w-int(dim/2)):
        for j in range(int(dim/2),h-int(dim/2)):
            for m in range(-int(dim/2),-int(dim/2)+int(dim)):
                for n in range(-int(dim / 2), -int(dim / 2) + int(dim)):
                    b.append(im[i+m,j+n,0])
                    g.append(im[i+m,j+n,1])
                    r.append(im[i+m,j+n,2])
            im[i,j,0]=sum(np.multiply(np.array(a),np.array(b)))/sum(a)
            im[i, j, 1] =sum(np.multiply(np.array(a),np.array(g)))/sum(a)
            im[i, j, 2] =sum(np.multiply(np.array(a),np.array(r)))/sum(a)
            b=[];g=[];r=[]
    return im
img=cv2.imread('Gauss.jpg')
a=[2,4,5,4,2,4,9,12,9,4,5,12,15,12,5,4,9,12,9,4,2,4,5,4,2]
im=GeneralFilter(img,a)
cv2.imshow('Origin',img)
cv2.imshow('GaussFilter',im)
cv2.waitKey()
cv2.destroyAllWindows()

滤波结果如下

数字图像处理编程基础:Python语言不调用OpenCV函数实现任意滤波模板对图像进行滤波_第2张图片

总结

高斯滤波对于被高斯噪声污染的图像有比较好的处理效果,而该模板同样可以设计成Sobel算子模板和其他的模板,具有很好的通用性,值得学习。

你可能感兴趣的:(滤波模板函数)