利用openCV或其他工具编写程序实现对图片进行均值、中值、高斯滤波的操作。
实现过程
1、编写程序
目标图片如下
程序完整代码:
#-*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:WindowsFontssimhei.ttf", size=14)
font1 = ImageFont.truetype("C:WindowsFontssimhei.ttf", 20, encoding="utf-8")
#均值滤波
src=cv.imread('test2.jpg',0)
blur=cv.blur(src,(5,5))
cv.imshow('origin',src)
cv.imshow('blur',blur)
cv.waitKey(0)
#中值滤波
img=cv.imread('test2.jpg',0)
medianblur=cv.medianBlur(img,7)
cv.imshow('median',medianblur)
cv.waitKey(0)
#高斯滤波
img=cv.imread('test2.jpg',0)
for i in range(2000): #添加点噪声
temp_x = np.random.randint(0,img.shape[0])
temp_y = np.random.randint(0,img.shape[1])
img[temp_x][temp_y] = 255
gaussblur = cv.GaussianBlur(img,(7,7),0)
cv.imshow('gauss',gaussblur)
cv.waitKey(0)
#高斯边缘检测
x = cv.Sobel(gaussblur,cv.CV_16S,1,0)
y = cv.Sobel(gaussblur,cv.CV_16S,0,1)
absX = cv.convertScaleAbs(x)
absY = cv.convertScaleAbs(y)
cv.imshow("absX", absX)
cv.imshow("absY", absY)
dst = cv.addWeighted(absX,0.5,absY,0.5,0)
cv.imshow("Result", dst)
cv.waitKey(0)
#在图片上显示文本信息
#均值滤波
blur1=cv.cvtColor(blur,cv.COLOR_BGR2RGB)
pilblur=Image.fromarray(blur1)
str1 = '均值滤波'
draw = ImageDraw.Draw(pilblur) # 图片上打印
draw.text((5, 5), str1, (255, 0, 0), font=font1)
blurtext=cv.cvtColor(np.array(pilblur),cv.COLOR_RGB2BGR)
cv.imshow("blur",blurtext)
cv.waitKey(0)
#中值滤波
median1=cv.cvtColor(medianblur,cv.COLOR_BGR2RGB)
pilmedian=Image.fromarray(median1)
str3 = '中值滤波'
draw2 = ImageDraw.Draw(pilmedian) # 图片上打印
draw2.text((5, 5), str3, (255, 0, 0), font=font1)
mediantext=cv.cvtColor(np.array(pilmedian),cv.COLOR_RGB2BGR)
cv.imshow("median",mediantext)
cv.waitKey(0)
#高斯滤波
gauss1=cv.cvtColor(gaussblur,cv.COLOR_BGR2RGB)
pilgauss=Image.fromarray(gauss1)
str2 = '高斯滤波'
draw1 = ImageDraw.Draw(pilgauss) # 图片上打印
draw1.text((5, 5), str2, (255, 0, 0), font=font1)
gausstext=cv.cvtColor(np.array(pilgauss),cv.COLOR_RGB2BGR)
cv.imshow("gauss",gausstext)
cv.waitKey(0)
#高斯边缘检测
dst1=cv.cvtColor(dst,cv.COLOR_BGR2RGB)
pilcanny=Image.fromarray(dst1)
str4 = '高斯边缘检测'
draw3 = ImageDraw.Draw(pilcanny) # 图片上打印
draw3.text((5, 5), str4, (255, 0, 0), font=font1)
cannytext=cv.cvtColor(np.array(pilcanny),cv.COLOR_RGB2BGR)
cv.imshow("canny",cannytext)
cv.waitKey(0)
#原图像文本
src1=cv.cvtColor(src,cv.COLOR_BGR2RGB)
pilori=Image.fromarray(src1)
str5 = '原图像'
draw3 = ImageDraw.Draw(pilori) # 图片上打印
draw3.text((5, 5), str5, (255, 0, 0), font=font1)
srctext=cv.cvtColor(np.array(pilori),cv.COLOR_RGB2BGR)
cv.imshow("origin",srctext)
cv.waitKey(0)
运行结果
1、读取图片
2、均值滤波
3、中值滤波
4、高斯滤波
5、高斯边缘检测
问题及解决方法
1、在图片上显示文本信息
解决方法:本来准备通过matplotlib库实现,发现图片清晰度不高:
后来查资料发现可以通过pillow库实现,然后通过img.text()函数实现在窗口图片上显示文本的功能。
实验总结
这次实验最难的点就在于在图片上显示需要的文本信息,查阅资料后发现可以实现该功能的方法有很多,但我个人决定最简单的还是pillow库,这个库添加文本的函数简单易懂,只需要一句代码就可以解决问题。
通过这次不断的尝试添加文本信息让我掌握了如img.text()、plt.text()、plt.title()等函数,也知道了该如何解决中文文本信息乱码的情况。不断地尝试是解决问题提高知识储量和相关知识熟练度的捷径。