数字图像的空间域滤波和频域滤波备课讲稿.docx
《数字图像的空间域滤波和频域滤波备课讲稿.docx》由会员分享,可在线阅读,更多相关《数字图像的空间域滤波和频域滤波备课讲稿.docx(14页珍藏版)》请在冰豆网上搜索。
数字图像的空间域滤波和频域滤波备课讲稿
数字图像的空间域滤波和频域滤波
数字图像的空间域滤波和频域滤波
一、实验环境
Pycharm2018.2,Anaconda3-5.3
二、实验内容与要求
1.平滑空间滤波:
1)读出一幅图像,给这幅图像分别加入椒盐噪声和高斯噪声后并与前一张图
显示在同一图像窗口中。
2)对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所形成的效果,
要求在同一窗口中显示。
3)进行低通滤波,显示处理后的图像。
4)显示均值处理后的图像。
5)对加入椒盐噪声的图像分别采用均值滤波法,和中值滤波法对有噪声的图像做处
理,要求在同一窗口中显示结果。
2.锐化空间滤波
1)读出blurry_moon.tif这幅图像,采用3×3的拉普拉斯算子w=[1,1,1;1–81;1,1,
1]对其进行滤波。
2)编写函数w=genlaplacian(n),自动产生任一奇数尺寸n的拉普拉斯算子,如5×5
的拉普拉斯算子
w=[11111
11111
11-2411
11111
11111]
3)分别采用5×5,9×9,15×15和25×25大小的拉普拉斯算子对blurry_moon.tif进
行锐化滤波,并利用式
完成图像的锐化增强,观察其有何不同,要求在同一窗口中显示。
4)采用不同的梯度算子对blurry_moon.tif进行锐化滤波,并比较其效果。
3.傅立叶变换
1)读出woman.tif这幅图像,对其进行快速傅立叶变换,分别显示其幅度图像和相位
图像。
仅对相位部分进行傅立叶反变换后查看结果图像。
2)仅对幅度部分进行傅立叶反变换后查看结果图像。
3)将图像的傅立叶变换F置为其共轭后进行反变换,比较新生成图像与原始图像的差
异。
三、实验过程
1.平滑空间滤波:
1)读出一幅图像,给这幅图像分别加入椒盐噪声和高斯噪声后并与前一张图显示在同一图像窗口中。
椒盐噪声:
defsalt_pepperNoise(src):
dst=src.copy()
num=1000#1000个噪声点
ndim=np.ndim(src)
row,col=np.shape(src)[0:
2]
foriinrange(num):
x=np.random.randint(0,row)#随机生成噪声点位置
y=np.random.randint(0,col)
indicator=np.random.randint(0,2)
#灰度图像
ifndim==2:
ifindicator==0:
dst[x,y]=0
else:
dst[x,y]=255
#彩色图像
elifndim==3:
ifindicator==0:
dst[x,y,:
]=0
else:
dst[x,y,:
]=255
returndst
高斯噪声:
defaddGaussianNoise(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
returnnoisy.astype(np.uint8)
2)对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所形成的效果,
要求在同一窗口中显示。
加入椒盐噪声后图像的滤波:
img1=cv2.imread("D:
\\mote.jpg",0)
img=img1[100:
300]
src=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.destroyAllWindows()
3)进行低通滤波,显示处理后的图像。
importcv2
importnumpyasnp
deffunction(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
foriinrange(h):
forjinrange(w):
if((sh-i)*(sh-i)+(sw-j)*(sw-j))<=r*r:
newimg[i,j]=255
tmp=1
else:
tmp=0
st[i,j]=tmp*fshift[i,j]
sl=np.fft.ifftshift(st)
x2=np.fft.ifft2(sl)
x3=np.uint8(np.real(x2))
returnnewimg,x3
img=cv2.imread('D:
\\mote.jpg',0)
img1,img2=function(img)
cv2.imshow("image",img)
cv2.imshow("lowpassfiltering",img2)
cv2.waitKey(0)
4)显示均值处理后的图像。
代码:
importcv2
importmatplotlib.pyplotasplt
img=cv2.imread('D:
\\mote.jpg',0)#直接读为灰度图像
blur=cv2.blur(img,(3,5))#模板大小3*5
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.title('img')
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(blur,'gray')
plt.title('blur')
plt.xticks([]),plt.yticks([])
plt.show()
5)对加入椒盐噪声的图像分别采用均值滤波法,和中值滤波法对有噪声的图像做处
理,要求在同一窗口中显示结果。
代码:
importcv2
importmatplotlib.pyplotasplt
img=cv2.imread('D:
/img/salt.jpg',0)#直接读为灰度图像
blur=cv2.blur(img,(3,5))#模板大小3*5
mid=cv2.medianBlur(img,5)
plt.subplot(1,2,1),plt.imshow(mid,'gray')
plt.title('medianBlur')
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(blur,'gray')
plt.title('blur')
plt.xticks([]),plt.yticks([])
plt.show()
2.锐化空间滤波
1)读出一幅图像,采用3×3的拉普拉斯算子w=[1,1,1;1–81;1,1,
1]对其进行滤波。
#定义函数,实现拉普拉斯算子
defLaplace(src):
template=np.ones((3,3),dtype=np.float32)#模板
template[1,1]=-8.0
addBorder=cv2.copyMakeBorder(src,1,1,1,1,cv2.BORDER_REFLECT_101)
row,col=src.shape
dst=np.zeros((row,col),dtype=np.int16)
foriinrange(row):
forjinrange(col):
temp=addBorder[i:
i+3,j:
j+3]
dst[i,j]=np.sum(template*temp)
returndst
2)编写函数w=genlaplacian(n),自动产生任一奇数尺寸n的拉普拉斯算子,如5×5
的拉普拉斯算子
w=[11111
11111
11-2411
11111
11111]
importnumpyasnp
importpandasaspd
importcv2
fromscipyimportndimage
kernel_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)分别采用5×5,9×9,15×15和25×25大小的拉普拉斯算子对blurry_moon.tif进
行锐化滤波,并利用式完成图像的锐化增强,观察其有何不同,要求在同一窗口中显示。
代码:
importcv2
img=blurred=cv2.imread("D:
\\mote.jpg",0)
#5×5,9×9,15×15和25×25
blurred1=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,25),0)
img5x5=img-blurred1
img9x9=img-blurred2
img15x15=img-blurred3
img25x25=img-blurred4
cv2.imshow("5x5",img5x5)
cv2.imshow("9x9",img9x9)
cv2.imshow("15x15",img15x15)
cv2.imshow("25x25",img25x25)
cv2.waitKey(0)
随着属性值的增大,图像锐化增强
4)采用不同的梯度算子对blurry_moon.tif进行锐化滤波,并比较其效果。
代码:
importnumpyasnp
importcv2
src=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)
cv2.imshow("Laplacian",dst1)
#Canny算子
can=cv2.Canny(src,30,120)
s=src-can
src1=cv2.GaussianBlur(s,(3,3),0)
cv2.imshow("can",src1)
cv2.waitKey(0)
3.傅立叶变换
1)读出woman.tif这幅图像,对其进行快速傅立叶变换,分别显示其幅度图像和相位
图像。
仅对相位部分进行傅立叶反变换后查看结果图像。
2)仅对幅度部分进行傅立叶反变换后查看结果图像。
3)将图像的傅立叶变换F置为其共轭后进行反变换,比较新生成图像与原始图像的差
异。
代码:
importcv2
importnumpyasnp
importmatplotlib.pyplotasplt
img=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('originalmagnitude')
plt.subplot(222),plt.imshow(s2,'gray'),plt.title('centermagnitude')
plt.subplot(223),plt.imshow(ph_f,'gray'),plt.title('originalphase')
plt.subplot(224),plt.imshow(ph_fshift,'gray'),plt.title('centerphase')
plt.show()