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短短几行代码,但在pythonC语言中就需要很多行,不过opencv是开源的,比较方便。还有网络促进了社会进步,在网上我可以找到自己需要的东西,也可以自己去学习机器视觉方面的知识。总之对机器视觉有了更深的了解。

posted @ 2020-03-30 00:00  水晶bingbing  阅读(7135)  评论(0编辑  收藏  举报