zoukankan      html  css  js  c++  java
  • 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是开源的,比较方便。还有网络促进了社会进步,在网上我可以找到自己需要的东西,也可以自己去学习机器视觉方面的知识。总之对机器视觉有了更深的了解。

  • 相关阅读:
    Hadoop
    java获取系统指定时间年月日
    JS获取系统的指定定年月日
    nodetree中 前面复选框禁用插件
    JS生成指定长度的随机数
    Post的请求案例
    Ajax的简单请求案例
    from 表单提交
    Oracle中添加视图
    java double保留小数点的零的问题,java保留小数点问题
  • 原文地址:https://www.cnblogs.com/sunblingbling/p/12596051.html
Copyright © 2011-2022 走看看