自适应中值滤波器python实现

自适应中值滤波器的基本原理:

Zxy:图像中第x行第y列个像素点的灰度值;

Sxy:滤波器窗口,该区域中心点为图像中第y行第x列个像素点;

Zmin:Sxy中最小的灰度值;

Zmax:Sxy中最大的灰度值;

Zmed:Sxy中所有灰度值的中值;

Smax:Sxy所允许的最大窗口尺寸;

自适应中值滤波器分为以下两个层次:

A:

A1 = Zmed-Zmin

A2 = Zmed-Zmax

如果A1>0且 A2<0,则跳转到B

否则,增大窗口的尺寸

如果增大后的尺寸≤Smax,则重复A

否则,直接输出Zmed

B:

B1 = Zxy-Zmin

B2 = Zxy-Zmax

如果B1>0且 B2<0,则输出Zxy

否则输出Zmed

自适应中值滤波器对椒盐噪声处理的效果好,所以先对图像进行了椒盐噪声处理再使用自适应中值滤波算法。

import cv2 as cv
import numpy as np

#将彩色图片转换为灰度图片并添加椒盐噪声
def AddNoise(path,probility):
    image = cv.imread(path, 0)  # 直接以灰度图片读取
    cv.imwrite('gray.jpg', image)  # 保存灰度的图片
    height,width=image.shape[:2]
    for i in range (height):
        for j in range (width):
           if np.random.random(1) Zmin) and (Zmed < Zmax):  #A层次
        if (Zxy > Zmin) and (Zxy < Zmax):   #转到B层次
            return Zxy
        else:
            return Zmed
    else:
        filter_size = filter_size + 1 #增大窗口尺寸再进行判断
        if filter_size <= Smax:
            return auto_deal(src, i, j, filter_size, Smax)
        else: #窗口尺寸过大返回中值
            return Zmed

def auto_med_filter(img, Smin, Smax):

    borderSize = Smax

    src = cv.copyMakeBorder(img, borderSize, borderSize, borderSize, borderSize, cv.BORDER_REFLECT)
    #寻找图像上的每一个像素点
    for m in range(borderSize, src.shape[0] - borderSize):
        for n in range(borderSize, src.shape[1] - borderSize):
            src[m,n] = auto_deal(src, m, n, Smin, Smax)

    img1 = src[borderSize:borderSize+img.shape[0], borderSize:borderSize+img.shape[1]]
    return img1

if __name__ == '__main__':
    img=AddNoise('img1.jpg', 0.4)
    img_auto_filter = auto_med_filter(img, 2,7)
    cv.imwrite('img1_auto_filter.jpg', img_auto_filter)

你可能感兴趣的:(python,开发语言)