1、数字图像的空间域滤波和频域滤波备课讲稿数字图像的空间域滤波和频域滤波数字图像的空间域滤波和频域滤波一、实验环境Pycharm2018.2,Anaconda3-5.3二、实验内容与要求1. 平滑空间滤波:1) 读出一幅图像,给这幅图像分别加入椒盐噪声和高斯噪声后并与前一张图显示在同一图像窗口中。2) 对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所形成的效果,要求在同一窗口中显示。3) 进行低通滤波,显示处理后的图像。4) 显示均值处理后的图像。5) 对加入椒盐噪声的图像分别采用均值滤波法,和中值滤波法对有噪声的图像做处理,要求在同一窗口中显示结果。2. 锐化空间滤波1) 读出bl
2、urry_moon.tif这幅图像,采用33的拉普拉斯算子w = 1, 1, 1; 1 8 1; 1, 1, 1对其进行滤波。2) 编写函数w = genlaplacian(n),自动产生任一奇数尺寸n的拉普拉斯算子,如55的拉普拉斯算子w = 1 1 1 1 1 1 1 1 1 1 1 1 -24 1 1 1 1 1 1 1 1 1 1 1 13) 分别采用55,99,1515和2525大小的拉普拉斯算子对blurry_moon.tif进行锐化滤波,并利用式完成图像的锐化增强,观察其有何不同,要求在同一窗口中显示。4) 采用不同的梯度算子对blurry_moon.tif进行锐化滤波,并比较其
3、效果。3. 傅立叶变换1) 读出woman.tif这幅图像,对其进行快速傅立叶变换,分别显示其幅度图像和相位图像。仅对相位部分进行傅立叶反变换后查看结果图像。2) 仅对幅度部分进行傅立叶反变换后查看结果图像。3) 将图像的傅立叶变换F置为其共轭后进行反变换,比较新生成图像与原始图像的差异。三、实验过程1. 平滑空间滤波:1) 读出一幅图像,给这幅图像分别加入椒盐噪声和高斯噪声后并与前一张图显示在同一图像窗口中。椒盐噪声:def salt_pepperNoise(src): dst = src.copy() num = 1000 # 1000个噪声点 ndim = np.ndim(src) ro
4、w, col = np.shape(src)0:2 for i in range(num): x = np.random.randint(0, row) # 随机生成噪声点位置 y = np.random.randint(0, col) indicator = np.random.randint(0, 2) # 灰度图像 if ndim = 2: if indicator = 0: dstx, y = 0 else: dstx, y = 255 # 彩色图像 elif ndim = 3: if indicator = 0: dstx, y, : = 0 else: dstx, y, : = 2
5、55 return dst高斯噪声:def addGaussianNoise(image,sigma): mean = 0.0 row, col ,ch= image.shape gauss = np.random.normal(mean, sigma, (row, col,ch) gauss = gauss.reshape(row, col,ch) noisy = image + gauss return noisy.astype(np.uint8)2) 对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所形成的效果,要求在同一窗口中显示。加入椒盐噪声后图像的滤波: img1 =c
6、v2.imread(D:mote.jpg,0)img=img1100:300src =salt_pepperNoise(img)cv2.imshow(origin,src)dst = cv2.blur(src,(3,3) #均值滤波模板cv2.imshow(blur,dst)dst1 = cv2.medianBlur(src,5) #中值滤波cv2.imshow(medianBlur,dst1)dst2 = cv2.GaussianBlur(src,(3,3),0) #高斯滤波cv2.imshow(GaussianBlur,dst2)cv2.waitKey(0)cv2.destroyAllWi
7、ndows()3) 进行低通滤波,显示处理后的图像。 import cv2import numpy as npdef function(img): h,w=img.shape newimg=np.zeros(h,w),np.uint8) img2=np.fft.fft2(img) fshift = np.fft.fftshift(img2) st=fshift.copy() h,w=fshift.shape sh=h/2 sw=w/2 r=40 for i in range(h): for j in range(w): if (sh - i) * (sh - i) + (sw - j) * (
8、sw - j) = r * r: newimgi, j = 255 tmp = 1 else: tmp = 0 sti, j = tmp * fshifti, j sl=np.fft.ifftshift(st) x2=np.fft.ifft2(sl) x3=np.uint8(np.real(x2) return newimg,x3img=cv2.imread(D:mote.jpg,0)img1,img2=function(img)cv2.imshow(image,img)cv2.imshow(low pass filtering,img2)cv2.waitKey(0)4) 显示均值处理后的图像
9、。代码: import cv2import matplotlib.pyplot as pltimg = cv2.imread(D:mote.jpg,0) #直接读为灰度图像blur = cv2.blur(img,(3,5)#模板大小3*5plt.subplot(1,2,1),plt.imshow(img,gray)#默认彩色,另一种彩色bgrplt.title(img)plt.xticks(), plt.yticks()plt.subplot(1,2,2),plt.imshow(blur,gray)plt.title(blur)plt.xticks(), plt.yticks()plt.sho
10、w()5) 对加入椒盐噪声的图像分别采用均值滤波法,和中值滤波法对有噪声的图像做处理,要求在同一窗口中显示结果。代码:import cv2import matplotlib.pyplot as pltimg = cv2.imread(D:/img/salt.jpg,0) #直接读为灰度图像blur = cv2.blur(img,(3,5)#模板大小3*5mid =cv2.medianBlur(img,5)plt.subplot(1,2,1),plt.imshow(mid,gray) plt.title(medianBlur)plt.xticks(), plt.yticks()plt.subpl
11、ot(1,2,2),plt.imshow(blur,gray)plt.title(blur)plt.xticks(), plt.yticks()plt.show()2. 锐化空间滤波1) 读出一幅图像,采用33的拉普拉斯算子w = 1, 1, 1; 1 8 1; 1, 1, 1对其进行滤波。# 定义函数,实现拉普拉斯算子def Laplace(src): template = np.ones(3, 3), dtype=np.float32) # 模板 template1, 1 = -8.0 addBorder = cv2.copyMakeBorder(src, 1, 1, 1, 1, cv2.
12、BORDER_REFLECT_101) row, col = src.shape dst = np.zeros(row, col), dtype=np.int16) for i in range(row): for j in range(col): temp = addBorder i:i+3, j:j+3 dsti, j = np.sum(template*temp) return dst2) 编写函数w = genlaplacian(n),自动产生任一奇数尺寸n的拉普拉斯算子,如55的拉普拉斯算子w = 1 1 1 1 1 1 1 1 1 1 1 1 -24 1 1 1 1 1 1 1 1
13、 1 1 1 1import numpy as npimport pandas as pdimport cv2from scipy import ndimagekernel_5x5=np.array(1,1,1,1,1, 1,1,1,1,1, 1,1,-24,1,1, 1,1,1,1,1, 1,1,1,1,1)img = cv2.imread(D:mote.jpg, 0) k5 = ndimage.convolve(img, kernel_5x5) cv2.imshow(5x5, k5) cv2.waitKey()cv2.destroyAllWindows()3) 分别采用55,99,1515
14、和2525大小的拉普拉斯算子对blurry_moon.tif进行锐化滤波,并利用式 完成图像的锐化增强,观察其有何不同,要求在同一窗口中显示。代码: import cv2img=blurred = cv2.imread(D:mote.jpg,0)#55,99,1515和2525blurred1 =cv2.GaussianBlur(img, (5,5), 0)blurred2 =cv2.GaussianBlur(img, (9,9), 0)blurred3 =cv2.GaussianBlur(img, (15,15), 0)blurred4 =cv2.GaussianBlur(img, (25,
15、25), 0)img5x5 = img - blurred1img9x9 = img - blurred2img15x15 = img - blurred3img25x25 = img - blurred4cv2.imshow(5x5,img5x5 )cv2.imshow(9x9,img9x9 )cv2.imshow(15x15,img15x15)cv2.imshow(25x25,img25x25 )cv2.waitKey(0)随着属性值的增大,图像锐化增强4) 采用不同的梯度算子对blurry_moon.tif进行锐化滤波,并比较其效果。代码: import numpy as npimpor
16、t cv2src = cv2.imread(D:mote.jpg,0) #sobel算法x =cv2.Sobel(src,cv2.CV_16S,1,0)y =cv2.Sobel(src,cv2.CV_16S,0,1)absX =cv2.convertScaleAbs(x)absY =cv2.convertScaleAbs(y)dst =cv2.addWeighted(absX,0.5,absY,0.5,0)cv2.imshow(Sobel,dst)#拉布拉斯算子lap =cv2.Laplacian(src,cv2.CV_16S,3)dst1 =cv2.convertScaleAbs(lap)c
17、v2.imshow(Laplacian,dst1)#Canny算子can =cv2.Canny(src,30,120)s= src-cansrc1 =cv2.GaussianBlur(s,(3,3),0)cv2.imshow(can,src1 )cv2.waitKey(0)3. 傅立叶变换1) 读出woman.tif这幅图像,对其进行快速傅立叶变换,分别显示其幅度图像和相位图像。仅对相位部分进行傅立叶反变换后查看结果图像。2) 仅对幅度部分进行傅立叶反变换后查看结果图像。3) 将图像的傅立叶变换F置为其共轭后进行反变换,比较新生成图像与原始图像的差异。代码: import cv2import
18、numpy as npimport matplotlib.pyplot as pltimg = cv2.imread(D:mote.jpg,0)f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布fshift = np.fft.fftshift(f) s1 = np.log(np.abs(f)s2 = np.log(np.abs(fshift)ph_f = np.angle(f)ph_fshift = np.angle(fshift)plt.subplot(221),plt.imshow(s1,gray),plt.title(original magnitude)plt.subplot(222),plt.imshow(s2,gray),plt.title(center magnitude)plt.subplot(223),plt.imshow(ph_f,gray),plt.title(original phase)plt.subplot(224),plt.imshow(ph_fshift,gray),plt.title(center phase)plt.show()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1