机器视觉——图像滤波

 利用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:\Windows\Fonts\simhei.ttf", size=14)

font1 = ImageFont.truetype("C:\Windows\Fonts\simhei.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()等函数,也知道了该如何解决中文文本信息乱码的情况。不断地尝试是解决问题提高知识储量和相关知识熟练度的捷径。

猜你喜欢

转载自www.cnblogs.com/zhangmingfeng/p/12895517.html