数字图像处理大作业--均值滤波和方框滤波(盒子滤波)python实现

一.均值滤波:

 

 

数字图像处理大作业--均值滤波和方框滤波(盒子滤波)python实现_第1张图片

图片中一个方块区域(一般为3*3)内,中心点的像素为全部点像素值的平均值。均值滤波就是对于整张图片进行以上操作。

数字图像处理大作业--均值滤波和方框滤波(盒子滤波)python实现_第2张图片

 

我们可以看下图的矩阵进行理解

数字图像处理大作业--均值滤波和方框滤波(盒子滤波)python实现_第3张图片

 

缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

 

原图:

数字图像处理大作业--均值滤波和方框滤波(盒子滤波)python实现_第4张图片

 

对比图:

数字图像处理大作业--均值滤波和方框滤波(盒子滤波)python实现_第5张图片

 

 

 

  • 方框滤波

 

 

原理:当normalize=True时,与均值滤波结果相同, normalize=False,表示对加和后的结果不进行平均操作,大于255的使用255表示

用途:

非归一化(normalized=False)的方框滤波用于计算每个像素邻域内的积分特性,比如密集光流算法(dense optical flow algorithms)中用到的图像倒数的协方差矩阵(covariance matrices of image derivatives)

数字图像处理大作业--均值滤波和方框滤波(盒子滤波)python实现_第6张图片

 

数字图像处理大作业--均值滤波和方框滤波(盒子滤波)python实现_第7张图片

 

import cv2
from pylab import *

def BoxFilter(Imge,dim,dim2,flag):       #Image为待处理图像,dim为滤波器的大小dim*dim2
    im=array(Imge)
    #序列化
    sigema=0
    #滤波求和

    for i in range(int(dim/2), im.shape[0] - int(dim/2)):
        for j in range(int(dim2/2), im.shape[1] - int(dim2/2)):
            for a in range(-int(dim/2), -int(dim/2)+dim):
                for b in range(-int(dim2/2), -int(dim2/2)+dim2):
                    sigema = sigema + img[i + a, j + b]
                    #对于滤波范围内求和,从左到右,从上到下扫

            if(flag):
                im[i, j] = sigema / (dim*dim2)

            else:
                im[i,j]=min(sigema,255)
            #归一化则与均值滤波一致,不归一化的话超过255用255表示
            sigema = 0
            #滤波移动
    return im


img=cv2.imread('20170522171941388.png',0)
#读取图像
x=int(input("输入滤波长度:\n"))
y=int(input("输入滤波宽度:\n"))
flag=int(input("是否归一化(1/0)?\n"))

im=BoxFilter(img,x,y,flag)
#im= cv2.boxFilter(img, -1, (3, 3), normalize=False)
#im= cv2.blur(source, (3, 3))

#第一个为手写的方框滤波,第二个为opencv调包的方框滤波,第三个为调包的均值滤波

cv2.imshow('After',im)
cv2.imshow('Origin',img)
cv2.waitKey()
cv2.destroyAllWindows()
#显示结果

 

你可能感兴趣的:(数字图像处理)