python opencv图像的均值滤波、中值滤波和高斯滤波
一、实验目的
掌握opencv如何实现图像的均值滤波、中值滤波和高斯滤波。
二、实验内容
1.题目描述
对图片test.png进行图像的均值滤波、中值滤波和高斯滤波,还有高斯边缘检测,下面是test.png原图片。
下面需要达到的效果:
2.实现过程
通过对老师发给的代码进行分析,再在百度上搜索分析,代码如下:
import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont __author__ = "sunjingjing" #均值滤波 def blur(source): img = cv2.blur(source, (10,10)) cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 图片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小 draw.text((0, 0), "均值滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体 # PIL图片转cv2 图片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("blur", cv2charimg) #中值滤波 def medianBlur(source): img= cv2.medianBlur(source, 3) cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 图片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小 draw.text((0, 0), "中值滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体 # PIL图片转cv2 图片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("medianBlur", cv2charimg) #方框滤波 def BoxFilter(source): img = cv2.boxFilter(source, -1, (5,5), normalize=1) cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 图片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小 draw.text((0, 0), "方框滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体 # PIL图片转cv2 图片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("boxFilter", cv2charimg) #高斯滤波 def GaussianBlur(source): img = cv2.GaussianBlur(source, (3,3), 0) cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 图片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小 draw.text((0, 0), "高斯滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体 # PIL图片转cv2 图片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("GaussianBlur", cv2charimg) #高斯边缘检测 def Gaussian(source): sobelX = cv2.Sobel(source,cv2.CV_64F,1,0)#x方向的梯度 sobelY = cv2.Sobel(source,cv2.CV_64F,0,1)#y方向的梯度 sobelX = np.uint8(np.absolute(sobelX))#x方向梯度的绝对值 sobelY = np.uint8(np.absolute(sobelY))#y方向梯度的绝对值 img = cv2.bitwise_or(sobelX,sobelY)# cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 图片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小 draw.text((0, 0), "高斯边缘检测", "green", font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体 # PIL图片转cv2 图片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("GaussianBlur", cv2charimg) if __name__ == "__main__": #加载图片 img = cv2.imread("test2.png") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) blur(img) medianBlur(img) GaussianBlur(img) # Gaussian(img) cv2.waitKey(0) cv2.destroyAllWindows()
3.运行结果
4.问题及解决方法
问题:没有办法将中文写在图片上,一有中文就乱码
解决方法:在百度上搜索,发现要写上中文,要设置汉字的字体颜色和坐标将汉字沾在图片上。也就是下面这几行代码
三、实验总结
通过这次的作业,我发现opencv真的没有xavis 好用,xavis短短几行代码,但在python或C语言中就需要很多行,不过opencv是开源的,比较方便。还有网络促进了社会进步,在网上我可以找到自己需要的东西,也可以自己去学习机器视觉方面的知识。总之对机器视觉有了更深的了解。