OpenCV 图像平滑处理

news2024/11/16 22:43:11

        本文是OpenCV图像视觉入门之路的第10篇文章,本文详细的在图像上面进行了图像均值滤波、方框滤波 、高斯滤波、中值滤波、双边滤波、2D卷积等操作。

OpenCV 图像平滑处理目录

1 均值滤波

2 方框滤波       

3 高斯滤波

4 中值滤波

5 双边滤波

6 2D卷积(自定义卷积核实现卷积)


1 均值滤波

        OpenCV 中的简单滤波(例如均值滤波或中值滤波)可能会使图像变得模糊,因为它们会平滑图像中的细节和边缘。如果滤波的程度过强,则可能会导致图像失真,使其看起来更差。因此,滤波的程度需要适当地控制,以获得最佳效果。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    # 均值滤波 
    # 简单的平均卷积操作
    img_blur1 = cv2.blur(img1, (3, 3))  # 使用3*3的卷积核
    img_blur2 = cv2.blur(img1, (30, 30))  # 使用30*30的卷积核

    cv2.imshow("blur1", img_blur1)  # 显示叠加图像 dst
    cv2.imshow("blur2", img_blur2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

2 方框滤波        

        方框滤波是一种图像平滑技术,在 OpenCV 中可以使用。方框滤波的主要作用是对图像进行去噪和平滑处理,使图像变得更加平滑,减少图像的锯齿状、噪声等不规则的部分。在图像处理中,方框滤波通常作为预处理步骤,以提高图像的质量和处理效果。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    # 方框滤波
    # 基本和均值一样,可以选择归一化
    img_box1 = cv2.boxFilter(img1, -1, (3, 3), normalize=True)
    img_box2 = cv2.boxFilter(img1, -1, (2, 2), normalize=False)


    cv2.imshow("box1", img_box1)  # 显示叠加图像 dst
    cv2.imshow("box2", img_box2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

3 高斯滤波

        高斯滤波是图像处理中一种常用的平滑处理方法。在使用OpenCV处理图像时,高斯滤波可以用于减少图像中的噪声和模糊不清的细节。此外,它还可以用于图像的边缘检测和图像分割,因为高斯滤波能够保留图像的主要特征,同时去除小的干扰。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    # 高斯滤波
    # 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
    img_aussian1 = cv2.GaussianBlur(img1, (5, 5), 0, 0)
    img_aussian2 = cv2.GaussianBlur(img1, (5, 5), 13, 13)

    cv2.imshow("aussian1", img_aussian1)  # 显示叠加图像 dst
    cv2.imshow("aussian2", img_aussian2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

4 中值滤波

        OpenCV 中值滤波是一种图像去噪方法,它通过在图像上选择一个掩码,并将其中的每个像素与周围像素值进行比较,以计算该像素的新值。新值是该像素周围像素值的中位数。这样,中值滤波能够有效去除图像中的噪声和椒盐噪声,使图像更清晰、更加稳定。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    # 中值滤波
    # 相当于用中值代替
    img_median1 = cv2.medianBlur(img1, 3)  # 中值滤波
    img_median2 = cv2.medianBlur(img1, 9)  # 中值滤波

    cv2.imshow("median1", img_median1)  # 显示叠加图像 dst
    cv2.imshow("median2", img_median2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

5 双边滤波

        双边滤波是一种图像模糊技术,它在保持图像边缘清晰的同时,对图像中的噪声进行有效去除。双边滤波算法通过比较图像上相邻像素的颜色差异和空间差异来确定每个像素的权重,从而决定每个像素的最终颜色值。在OpenCV中,双边滤波算法可用于处理图像的模糊、去噪、抗抖动等问题。

        均值滤波、方框滤波、高斯滤波、中值滤波都是只单纯的考虑了像素点之间的空间信息而进行滤波的方式,这些方式都或多或少都会模糊图像的边缘信息,就是把图像里面的边缘线条弄模糊了,就是在去除图像噪音的同时把图像也弄模糊了,造成图像边界信息的部分丢失,这是这些方法的一个共同的缺点。
双边滤波就可以很好的规避这个缺点。因为双边滤波不仅考虑了像素的空间信息(距离越远权重越小)同时还考虑了像素的色彩信息(色彩差别越大,权重越小),这样就可以很好的去除噪声还可以较好的保护边缘信息,所以双边滤波器也是一个保边去噪的滤波器。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    img_bilateralFilter1 = cv2.bilateralFilter(img1, 15, 150, 1000)
    img_bilateralFilter2 = cv2.bilateralFilter(img1, 3, 255, 1000)

    cv2.imshow("bilateralFilter2", img_bilateralFilter2)  # 显示叠加图像 dst
    cv2.imshow("bilateralFilter1", img_bilateralFilter1)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

6 2D卷积(自定义卷积核实现卷积)

        OpenCV 中的 2D 卷积的作用是图像滤波,它可以用来消除图像中的噪声、提取图像的特征、边缘检测等。它通过对图像中的每一个像素与一个固定的卷积核进行卷积操作来实现这些目的。

        如果上面的均值滤波卷积核、方框滤波卷积核、高斯滤波卷积核、中值滤波卷积核、双边滤波卷积核都不能满足我们对图像的处理要求,此时我们就需要一个更加灵活的核——即我们自定义一个我们想要的核。如何实现呢?opencv中的cv2.filter2D()函数可以帮助我们实现:
cv2.filter2D(img, ddepth, kernel, anchor, delta, borderType)
img:要处理的原图
ddepth: 默认-1,表示与原图图像相同的深度
kernel: 卷积核,是一个单通道的数组。如果想处理彩图时,让每个通道使用不同的核,就必须先将彩图分解后再使用不同的核去卷积操作。
anchor: 默认值是(-1,-1),默认计算的结果位于核的中心位置。
delta:这个参数可写可不写。如果写,表示在卷积操作时,对应位置相乘相加后再加一个偏置,这个偏置就是delta。
borderType: 边界处理方式,一般用默认值即可。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    kernel = np.ones((9, 9), np.float32) / 81  # 在实际中我们可以定义更复杂的卷积核,以实现自定义滤波操作
    img_kernel1 = cv2.filter2D(img1, -1, kernel)  # 这个滤波器就相当于均值滤波

    kernel = np.ones((18, 18), np.float32) / 81  # 在实际中我们可以定义更复杂的卷积核,以实现自定义滤波操作
    img_kernel2 = cv2.filter2D(img1, -1, kernel)  # 这个滤波器就相当于均值滤波
    

    cv2.imshow("kernel1", img_kernel1)  # 显示叠加图像 dst
    cv2.imshow("kernel2", img_kernel2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子技术——分立MOS放大电路

电子技术——分立MOS放大电路 有了前两节的学习,即三种放大器配置和偏置方法之后,我们可以通过现成的分立晶体管、电阻、电容等搭建分立MOS放大电路。 DC偏置基本结构 在本节我们选用的DC偏置基本结构是如图所示的源极恒流源的偏置方案,下图…

用#define宏实现Add函数

✋作者:阿润菜菜 📖专栏:C语言 我们知道#define宏是一种非常暴力的替换,宏定义会在程序编译预处理阶段在调用宏的位置进行文本内容的直接替换,因此我们在使用宏定义实现Add加法函数时就要注意一些可能会报错的问题。 …

第九层(10):STL之函数对象

文章目录前情回顾函数对象概念特点谓词概念内建函数对象分类算术仿函数关系仿函数逻辑仿函数下一座石碑🎉welcome🎉 ✒️博主介绍:一名大一的智能制造专业学生,在学习C/C的路上会越走越远,后面不定期更新有关C/C语法&a…

你是如何学习 Java 的?

每一个行业中能成为大佬的人,一定都有他自己一套具有独到见解的方法...... 这个问题我很有发言权,从刚毕业做Java实习生月薪2k,到现在干了5年Java开发月薪43k,一直都在保持不断学习的状态。以我个人的经验来看,一个程…

视频分割新范式:视频感兴趣物体实例分割 VOIS

1. 背景视频中物体分割是视频理解的基础算法,也是对淘宝商品视频分析和加工所依赖的重要能力。传统的视频分割任务一般分为两种类型:一种是VOS(Video Object Segmentation),该任务需要在第一帧给出物体的初始分割标注&…

Linux系列 目录和文件管理

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 简介 本章重点 一.检查文本内容 ​编辑 1.cat命令——显示并…

MySQL分表查询之Merge存储引擎实现

概念介绍 MySQL 分表之后怎么进行联合查询?用有表数量限制的 union all,还是汇总到一张表再查询,亦或用Sphinx( 高性能SQL全文检索引擎 )? 在这篇文章里,介绍使用 Merge [mɜːrdʒ] 存储引擎…

浅读人月神话(2)

读书笔记:今日翻书浅读,从《为什么巴比伦塔会失败》开始至《干将莫邪》结束,巴比伦塔的建造对当下项目推进有广泛借鉴意义,今天这几个章节在PMBOK中有一些可以互相对照学习的内容,《为什么巴比伦塔会失败?》…

荔枝派 zero 使用 Jlink 调试

Jlink 所谓硬件版本,就是这个调试器的硬件是第几代,我手上的这个是 V8 所谓固件版本,就是这个调试器主芯片中内置的软件是什么版本,我刷入的是 J-Link ARM V8 compiled Nov 28 2014 13:44:46 所谓 Jlink 工具版本,就…

记录--原生 canvas 如何实现大屏?

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 可视化大屏该如何做?有可能一天完成吗?废话不多说,直接看效果,线上 Demo 地址 lxfu1.github.io/large-scree…。 看完这篇文章(这个项目)&#xff…

在线支付系列【13】微信支付之签名验签流程分析

有道无术,术尚可求,有术无道,止于术。 文章目录前言签名生成签名验证总结前言 在上篇文档中,我们简单实现了对接微信支付的几个接口。了解到wechatpay-apache-httpclient框架自动实现了签名和验签,接下来跟踪下源码&a…

LeetCode-136. 只出现一次的数字

目录题目分析哈希集位运算题目来源 https://leetcode.cn/problems/single-number/ 题目分析 题目有个条件可谓相当重要,即凡重复的元素最多重复一次(原话:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个…

详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

文章目录1. 描述1.1 MybatisPlusInterceptor1.2 InnerInterceptor2. 实现2.1 不带条件的分页查询2.2 带条件的分页查询2.3 简述Page类3. 注意事项1. 描述 1.1 MybatisPlusInterceptor 我们在开发的过程中,经常会遇到分页操作,其分为逻辑分页和物理分页…

Gif动态图片如何用静图制作?教你静图合成动图的方法

gif动图如何制作?相信对于gif动图大家都不陌生,在平时的聊天软件中、公众号文章中都可以看到。那么,要如何制作gif动图呢?下面,就给教大家两个在线gif制作(https://www.gif.cn/)的方法&#xff…

综合案例【商品管理系统-Java基础版】(附完整源码)

Java语言的一个超级简易的商品管理系统,适合初学者练手 源码包无法上传至资源(blog已经超级完整啦)如果还是需要完整源码src包可私分享 目录1 项目分析1.1 用户模块(普通用户、管理员用户)1.1.1前端系统(普…

FluentReader为什么称之为高颜值的rss阅读器

Fluent Reader 这是一款 RSS 阅读器。对于很多年轻的网友来说,RSS 这个名词可能有点陌生。简单来说只要某个网站支持 RSS,你订阅了 RSS 后,一旦网站更新了内容,就会推送到你面前。这时候,我们就需要一款像 Fluent Rea…

全屋智能三国志

刚刚过去的春节假期,对我来说,是一个收集现实素材、感应社会变化的好机会。也确实发现了不少新趋势,一个结论是:智能家居正在酝酿新一轮的市场浪潮。以央视春晚作为切口,每年央视春晚的广告投放,都一定程度…

vscode 配置 plantuml

1、首先安装 plantuml 插件 2、安装 java 开发环境 如果是 mac 系统,直接执行 brew install java ,然后按照下图执行下提示中的命令即可 如果是 windows 系统,需要去官网下载 java jdk,安装好之后添加运行路径到 path 中 https://…

基于 ShardingSphere 的分布式数据库负载均衡架构搭建实战

本文主要分为 3 部分,将依次介绍: 基于 ShardingSphere 的分布式数据库「负载均衡架构搭建」要点结合实际的「用户问题案例」,介绍引入「负载均衡」的影响介绍并展示 ShardingSphere 分布式数据库在云上的「一站式解决方案」 文章目录Shardi…

LED背光车载驱动IC 可支持48通道

特性电源电压范围-VDD:3.3V~5.5V-VLED:27V(max)48 个恒流输出通道- 通道恒流输出范围 0~50mA一 通道间电流输出偏差小于3%- 芯片间电流输出偏差小于 3%Low Knee Voltage:0.55V小于20mA0.6V 大于20mA最大支持4扫,内嵌行控制信号通道灰度实现-支持 PWM/PAMPWM驱动 -灰…