opencv-python 实现均值、高斯、中值、双边滤波_opencv展示人手均值滤波,高斯滤波,中值滤波python-程序员宅基地

技术标签: 图像预处理  python  滤波  opencv-python  计算机视觉  opencv  

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


线性、非线性各种滤波器原理请看另外一篇文章:

opencv-python 详解线性和非线性滤波、模糊、卷积原理_RayChiu757374816的博客-程序员宅基地

图像滤波基本算法

 测试图片 :

实现代码:

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

__author__ = "raychiu"


# 均值滤波
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 BilateralFilter(source):
    img = cv2.bilateralFilter(source,9,75,75)
    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("BilateralFilter", 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("1.jpg")
    cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    cv2.imshow("input image", img)
    # BoxFilter(img)
    BilateralFilter(img)
    # blur(img)
    # medianBlur(img)
    # GaussianBlur(img)
    # Gaussian(img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

测试结果:

 

 

 

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/RayChiu757374816/article/details/119561512

智能推荐

pycharm代码上传到github_git commit为什么需要邮箱和名字、-程序员宅基地

文章浏览阅读6.5k次,点赞11次,收藏26次。一.准备工作Ⅰ.git下载和安装要连接GitHub,首先git是必不可少的,git的安装的基本使用很简单,这里并不是讲git使用的教程,所以只是提一下就略过了.Ⅱ.GitHub设置添加SSH Key这一步算是连接GitHub的最基本的一步了,git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以得先配好SSH key.1.创建一个SSH Key打开终端,windows下面可能叫做git ..._git commit为什么需要邮箱和名字、

B+Tree 在线模拟_在线体验b+tree-程序员宅基地

文章浏览阅读2.4k次,点赞8次,收藏9次。链接地址:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html_在线体验b+tree

缺失值的查找与替换_ggto05.net-程序员宅基地

文章浏览阅读5.6k次。X<-c(1,2,3,NA,5) y<-c(236,90,56,NA,7) z<-c(54,6558,5,21,5) x1<-data.frame(X,y,z) r<-c(NA,1,2,NA,NA)ee> ee X y z r1 1 236 54 NA2 2 90 6558 13 3 56 5 24 NA NA 21 NA5 5_ggto05.net

R判别分析_判别分析的应用案例r语言-程序员宅基地

文章浏览阅读377次。常用的判别分析方法是距离判别、贝叶斯判别和Fisher判别等。_判别分析的应用案例r语言

Maven基础(三)—— 依赖管理与生命周期_项目依赖管理生命周期-程序员宅基地

文章浏览阅读124次。1、依赖管理1、依赖配置依赖指当前项目运行所需的jar,一个项目可以设置多个依赖2、依赖传递将project03的坐标复制到project02的依赖中直接依赖:在当前项目中通过依赖配置建立的依赖关系间接依赖∶被资源的资源如果依赖其他资源,当前项目间接依赖其他资源路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的特殊优先:当同级配置了相同资源的不同_项目依赖管理生命周期

简单工厂模式和工厂方法模式_1、创建类student,teacher类, 2、使用简单工厂模式创建实例对象,通过反射实例化对-程序员宅基地

文章浏览阅读2.7w次,点赞12次,收藏27次。一:简单工厂模式 1,概念简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。顾名思义工厂就是生产东西的,有原料(参数),模子(对象)就能生产出很多个具有相同功能的对象啦。2,uml图 3,代码示例 class Program { static void Main(string[] args) {_1、创建类student,teacher类, 2、使用简单工厂模式创建实例对象,通过反射实例化对

随便推点

current_thread_info在ARM32和ARM64平台的不同点解析_arm64 thread_info-程序员宅基地

文章浏览阅读2.5k次。首先对current_thread_info不熟悉的同学可以先百度一下这是个什么东西?我们这里仅仅简单的提一下,current_thread_info用于获取当前进程的信息。ARM32平台相关定义#define THREAD_SIZE_ORDER 1#define THREAD_SIZE (PAGE_SIZE &lt;&lt; THREAD_SIZE_ORDER)union thr..._arm64 thread_info

阿里P8用这份402页多线程与架构设计笔记,征服你 吊打你_阿里线程框架-程序员宅基地

文章浏览阅读121次。前言随着计算机硬件的不断发展,CPU进入多核时代,并发运算因此也上升到了并行运算的高度,作为Java程序员,如何最大化地“压榨”CPU的资源,利用CPU超高的计算速度编写高效快速运行的程序,如何解决CPU与RAM之间速度不匹配的问题呢?今天分享一份《Java高并发编程详解多线程与架构设计》就会帮你解决这些问题,本书结合作者的实践经验,不仅介绍了高速缓存Cache、Cache Line、Java内存模型,以及现代CPU基本架构等相关知识,还深入讲解了Java跨平台的高并发解决方案。本书实._阿里线程框架

宝塔php伪静态规则,使用宝塔管理nginx伪静态规则配置方法技巧-程序员宅基地

文章浏览阅读1.8k次。我们网站使用的服务器环境一般有IIS、Apache、Tomcat、Nginx 等,他们各有优劣。一般虚拟空间使用IIS 和 Apache居多,这两个的配置都比较简单,IIS一般都安装了ISAPI_Rewrite 模块,可以直接使用和Apache一样的.htaccess文件来配置,直接将.htaccess文件上传到网站根目录即可。.htaccess 文件代码RewriteEngine OnRewri..._宝塔怎么添加htaccess规则

2023 Zblog对接微信小程序源码 附教程_博客小程序源码-程序员宅基地

文章浏览阅读189次。在HbuilderX中打开前端项目,依次点击 运行 =》 运行到小程序模拟器 =》微信开发者工具。必要工具:HbuilderX,微信开发者工具。_博客小程序源码

mysql组合索引与单列索引_假设有一张名为orders的订单表-程序员宅基地

文章浏览阅读1.1k次。1、组合索引能够避免回表查询:假设有一张订单表(orders),包含order_id和product_id二个字段。一共有31条数据。符合下面语句的数据有5条。执行下面的sql语句:select product_id from orderswhere order_id in (123, 312, 223, 132, 224);这条语句要mysql去根据order_id进行搜索,然后返回_假设有一张名为orders的订单表

python+jenkins持续集成输出html测试报告_jenkins + python + publish html reports-程序员宅基地

文章浏览阅读7k次。前言在jenkins上展示html的报告,需要添加一个HTML Publisher plugin插件,把生成的html报告放到指定文件夹,这样就能用jenkins去读出指定文件夹的报告了。一、构建后操作1.前面执行完测试用例后,可以用“添加构建后操作步骤”,读出html报告文件2.如果你的展开后有Publish THML reports这_jenkins + python + publish html reports

推荐文章

热门文章

相关标签