还是数字图像处理的作业。。。
对包含随机噪声的LenaNoise图像进行以下处理(可使用编程语言自带函数,以实验报告形式提交word文件):
(1)线性邻域滤波法,分别使用以下2种滤波模板进行滤波;
(2)非线性中值滤波法,分别使用以下3种滤波模板进行滤波。
(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()