实验二 图像滤波
一、 实验目的
利用opencv编写实现下图的图像滤波
二、 实验过程
利用opencv python实现图像滤波
(1)在python安装opencv库
如果安装了python,直接安装:pip install opencv-python
安装numpy包:pip install numpy
测试是否安装成功:python命令行输入import cv2,没有报错即成功
(2)编写代码
import cv2
import numpy as np
from PIL import Image,ImageDraw,ImageFont
img = cv2.imread('E:\\test14.bmp')
#图片显示文字
def show_message(img,str,color):
pil_img1 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
pilimg1 = Image.fromarray(pil_img1) #将数组类型转成图片格式
draw = ImageDraw.Draw(pilimg1) #在PIL图片上打印汉字
font = ImageFont.truetype("simhei.ttf",20,encoding="utf-8")
draw.text((0,0),str,color,font=font)
img_1 = cv2.cvtColor(np.array(pilimg1),cv2.COLOR_RGB2BGR) #将图片转成cv2.inshow()可以显示的数组格式
return img_1
#均值滤波
img1 = cv2.blur(img,(5,5))
cv2.imshow("img1",show_message(img1,"均值滤波",(255,0,0)))
#中值滤波
img2 = cv2.medianBlur(img,5)
cv2.imshow("img2",show_message(img2,"中值滤波",(255,0,0)))
#高斯滤波
img3 = cv2.GaussianBlur(img,(5,5),0)
cv2.imshow("img3",show_message(img3,"高斯滤波",(255,0,0)))
#高斯边缘检测
edged = cv2.Laplacian(img, cv2.CV_16S, ksize=5)
img4 = cv2.convertScaleAbs(edged)
cv2.imshow("edged",show_message(img4,"高斯边缘检测",(0,255,0)))
cv2.waitKey(0)
cv2.destroyAllWindows()
三、 运行结果
四、 问题及解决方法
(1)用putText()出现无法在图像上显示中文
解决方法:
因为不能直接用cv2在图片上显示中文,需要借助PIL这个包,如果没有安装,运行:pip install pillow
(2)运行报错,且显示不出图片
解决办法:
可能是没有导入PIL相应的模块,需要在前面输入“from PIL import Image,ImageDraw,ImageFont”
(3)ksize=3时高斯边缘检测显示的图像如下:
解决方法:
将ksize的值改为5后得到正确结果如下图,ksize的值是算子的大小,即卷积核的大小,必须为1,3,5,7。参数ksize越大即卷积核越大时,算子对图像梯度的变化越敏感。
五、 实验总结
这次实验主要是利用opencv实现图像滤波,在做实验的过程中,我的收获如下:
- 理论知识方面
我了解了一些滤波处理方式,滤波处理分为两大类:线性滤波和非线性滤波,线性滤波有均值滤波,高斯滤波,非线性滤波有中值滤波。
(1) 图像滤波:在尽量保证图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作。
(2) 均值滤波:用一片图像区域的各个像素的均值来代替原图像中的各个像素值。它的缺点是不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
(3) 中值滤波:是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
(4) 高斯滤波:高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。 - 代码方面
我尝试把在图片上显示文字写成了一个函数,这样通过调用,精简了代码。并且熟悉了图像滤波的函数。