数字图像处理:python线性邻域滤波法,非线性中值滤波法

还是数字图像处理的作业。。。

对包含随机噪声的LenaNoise图像进行以下处理(可使用编程语言自带函数,以实验报告形式提交word文件):

(1)线性邻域滤波法,分别使用以下2种滤波模板进行滤波;

数字图像处理:python线性邻域滤波法,非线性中值滤波法_第1张图片

(2)非线性中值滤波法,分别使用以下3种滤波模板进行滤波。

数字图像处理:python线性邻域滤波法,非线性中值滤波法_第2张图片

(3)简要分析不同模板对图像滤波的影响。

H1模板是(3,3)均值滤波

cv2.blur(img, (3,3))

H2模板是标准差=1.3 的 3*3 的整数形式的高斯滤波

Lena_GaussianBlur=cv2.GaussianBlur(img,(3,3),1.3)

非线性中值滤波法

方形窗口比较常见,直接用opencv库的cv2.medianBlur(img,3)函数

img表示当前的图片,3表示当前的方框尺寸

十字形窗口有大佬写了

菱形的不会!

中值滤波是一种典型的非线性滤波技术,在一定条件下可以克服线性滤波器(如均值滤波)带来的图像细节模糊。

优点:消除杂散噪声点而不会或较小程度地造成边缘模糊。

缺点:对于图像中含有较多点、线、尖角细节的,不适宜采用中值滤波。

import cv2
img=cv2.imread('LenaNoise.jpg')
#(1)均值滤波
Lena_blur = cv2.blur(img, (3,3))
cv2.imshow('blur',Lena_blur)
#(1)标准差=1.3 的 3*3 的整数形式的高斯滤波
Lena_GaussianBlur=cv2.GaussianBlur(img,(3,3),1.3)
cv2.imshow('GaussianBlur',Lena_GaussianBlur)

#(2)非线性中值滤波法
#2.1十字模板
def medfilter (pic,scale=[3,3],pad = [0,0,0],type='cross'):
    '''
    中值滤波器
    pic 为被作用图片
    type  为中值窗口类型 可选参数为 'cross'
    scale 为窗口大小,如[3,3]
    pad   为填充方法 输入值为一维矩阵
    '''
    import numpy as np
    import cv2 as cv
#获取图像的长宽基本信息,以及边界填充上下左右的距离,并实现边界填充
    top_bottom = int((scale[1]-1)/2)
    left_right = int((scale[0]-1)/2)
    mednum = (scale[1]+scale[0])/2-1
    total_dim = np.shape(pic)
    pic_line = total_dim[0]
    pic_row  = total_dim[1] #列
    pic = cv.copyMakeBorder(pic,top_bottom,top_bottom,left_right,left_right,cv.BORDER_CONSTANT,value = pad)
#通过双重for循环进行十字框架的游走,以当前元素为中心点进行四周发散,形成十字框架,并排序后赋予新的像素值

    def crossfilt(pic = pic ,pic_line = pic_line,pic_row = pic_row):
        for i in range(pic_line):
            for j in range(pic_row):
                mask = [pic[i,j], pic[i+1,j], pic[i-1,j], pic[i,j+1], pic[i,j-1]]
                pic[i,j] = np.sort(mask)[int(mednum)]
#判断图像模式大于2则为RGB模式,小于等于2则为灰度模式
    if len(total_dim)>2:
        r,g,b = cv.split(pic)
        r,g,b = medfilter(r),medfilter(g),medfilter(b)
        pic = cv.merge([r,g,b])
    elif len(total_dim)<=2:
        crossfilt(pic)
    return pic

B = medfilter(img)
cv2.imshow('cross_shaped',B)

#2.2 方形中值滤波
median= cv2.medianBlur(img,3)
cv2.imshow('median',median)

cv2.waitKey(0)
cv2.destroyAllWindows()

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