zoukankan      html  css  js  c++  java
  • 机器视觉——图像滤波

     利用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()等函数,也知道了该如何解决中文文本信息乱码的情况。不断地尝试是解决问题提高知识储量和相关知识熟练度的捷径。

  • 相关阅读:
    cunda 常用命令,删除,创建,换源
    kivy画板
    基础易忘记
    关于tkinter
    airtest常用指令
    在kivy中加图片
    QQ消算轰炸,我好无聊真的
    自动华键盘使用
    自动化键盘,python
    canvas中的优先级,.after最前,before最底,canvas中间,部件在布局下面
  • 原文地址:https://www.cnblogs.com/zhangmingfeng/p/12895517.html
Copyright © 2011-2022 走看看