【OpenCV C++Python】(五)图像平滑(模糊)

文章目录

  • 图像平滑
    • 均值滤波
    • 高斯滤波
    • 中值滤波
    • 双边滤波(Bilateral Filtering )
  • Python
  • C++

图像线性平滑空间滤波(加权均值滤波器,几何均值滤波,谐波均值滤波,逆谐波均值滤波),非线性平滑空间滤波(中值滤波,最大值滤波,最小值滤波)MATLAB自写函数实现

图像平滑

图像平滑,又称图像模糊,是一种简单而常用的图像处理操作,常用于图像去噪。

为了进行平滑操作,我们将对图像使用滤波。最常见的滤波器是线性的,其输出的像素值(即 g ( i , j ) ) g(i,j)) g(i,j))为输入像素值(即 f ( i + k , j + l ) f(i+k,j+l) f(i+k,j+l))的加权和,可以将滤波操作用卷积操作表示:

在这里插入图片描述

h ( k , l ) h (k,l) h(k,l)叫做核(kernel)。

下面简单介绍OpenCV中常用的滤波方法,包括均值滤波、高斯滤波中值滤波和双边滤波。

均值滤波

均值滤波的核为:
在这里插入图片描述

输出的每个像素是它的核覆盖的所有像素的平均值。

OpenCV提供了函数cv.blur()cv.boxFilter()实现均值滤波。cv.blur()的主要参数有:

  • src:输入图像;它可以有任意数量的通道,但类型应该是CV_8U, CV_16U, CV_16S, CV_32F或CV_64F。
  • dst:与src大小和类型相同的输出图像。
  • ksize:核的大小。
  • anchor:表示锚点(计算的像素)相对于整个核邻域的位置。如果为负值,则核的中心被视为锚点。默认值Point(-1,-1)
  • borderType:在图像边界补充像素,防止核的某些元素位于图像之外,有以下补充类型(BORDER_WRAP除外,默认为BORDER_DEFAULT )。等价于:
boxFilter(src, dst, src.type(), ksize, anchor, true, borderType)

高斯滤波

二维高斯函数可以表示:
在这里插入图片描述
其中 μ μ μ为均值(峰值), σ 2 σ^2 σ2为方差。

根据高斯函数得到的核示例:

3x35x5
1 16 [ 1 2 1 2 4 2 1 2 1 ] \frac{1}{16}\left[\begin{array}{lll}1 & 2 & 1 \\2 & 4 & 2 \\1 & 2 & 1\end{array}\right] 161 121242121 1 159 × [ 2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2 ] \frac{1}{159} \times\left[\begin{array}{ccccc}2 & 4 & 5 & 4 & 2 \\4 & 9 & 12 & 9 & 4 \\5 & 12 & 15 & 12 & 5 \\4 & 9 & 12 & 9 & 4 \\2 & 4 & 5 & 4 & 2\end{array}\right] 1591× 245424912945121512549129424542

高斯滤波是线性的,通过高斯核与输入图像的卷积进行计算,在OpenCV中可以通过函数cv.GaussianBlur()实现。

主要参数有:

  • src:源图像
  • dst:目标图像
  • ksize:需要两个参数,分别表示高和宽。wh必须是奇数和正数,否则将使用sigmaXsigmaY按照OpenCV内置的函数计算。
  • sigmaX:表示 x x x中的标准差,如果值为0,则按照OpenCV内置的函数由核大小计算 σ x σ_x σx
  • sigmaY:表示 y y y的标准差。写入0表示 σ y σ_y σy由核大小计算。
  • borderType:与均值滤波相同。

中值滤波

中值滤波器遍历图像的每个元素,并将每个像素替换为核区域内所有像素的中值。
中值滤波通过函数cv.medianBlur()完成的。主要参数有:

  • src:源图像
  • dst:目标图像,必须与src类型相同
  • ksize:核的大小。因为我们使用的是方形窗口,所以只有一个参数。另外,还必须是奇数。

双边滤波(Bilateral Filtering )

高斯滤波它在滤除图像中噪声信号的同时,也会对图像中的边缘信息进行平滑。 双边滤波则可以缓解这个问题。

原理推荐阅读:https://blog.csdn.net/u013921430/article/details/84532068

使用cv.bilateralFilter()实现双边滤波,参数有:

  • src:源图像
  • dst:目标图像
  • d:每个像素邻域的直径。
  • sigmaColor:颜色空间的标准差。
  • sigmaSpace:坐标空间的标准差。d<=0时,dsigmaSpace成正比。
  • borderType :与均值滤波相同

Python

import sys
import cv2 as cv
import numpy as np#  Global Variables
DELAY_CAPTION = 1500
DELAY_BLUR = 100
MAX_KERNEL_LENGTH = 31
src = None
dst = None
window_name = 'Smoothing Demo'def main(argv):cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE)# Load the source imageimageName = argv[0] if len(argv) > 0 else 'lena.jpg'global srcsrc = cv.imread(cv.samples.findFile(imageName))if src is None:print('Error opening image')print('Usage: smoothing.py [image_name -- default ../data/lena.jpg] \n')return -1if display_caption('Original Image') != 0:return 0global dstdst = np.copy(src)if display_dst(DELAY_CAPTION) != 0:return 0# 均值滤波if display_caption('Homogeneous Blur') != 0:return 0for i in range(1, MAX_KERNEL_LENGTH, 2):dst = cv.blur(src, (i, i))if display_dst(DELAY_BLUR) != 0:return 0# 高斯滤波if display_caption('Gaussian Blur') != 0:return 0for i in range(1, MAX_KERNEL_LENGTH, 2):dst = cv.GaussianBlur(src, (i, i), 0)if display_dst(DELAY_BLUR) != 0:return 0# 中值滤波if display_caption('Median Blur') != 0:return 0for i in range(1, MAX_KERNEL_LENGTH, 2):dst = cv.medianBlur(src, i)if display_dst(DELAY_BLUR) != 0:return 0# 双边滤波if display_caption('Bilateral Blur') != 0:return 0for i in range(1, MAX_KERNEL_LENGTH, 2):dst = cv.bilateralFilter(src, i, i * 2, i / 2)if display_dst(DELAY_BLUR) != 0:return 0#  Donedisplay_caption('Done!')return 0def display_caption(caption):global dstdst = np.zeros(src.shape, src.dtype)rows, cols, _ch = src.shapecv.putText(dst, caption,(int(cols / 4), int(rows / 2)),cv.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255))return display_dst(DELAY_CAPTION)def display_dst(delay):cv.imshow(window_name, dst)c = cv.waitKey(delay)if c >= 0: return -1return 0if __name__ == "__main__":main(sys.argv[1:])

C++

#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;
Mat src; Mat dst;
char window_name[] = "Smoothing Demo";
int display_caption( const char* caption );
int display_dst( int delay );
int main( int argc, char ** argv )
{namedWindow( window_name, WINDOW_AUTOSIZE );const char* filename = argc >=2 ? argv[1] : "lena.jpg";src = imread( samples::findFile( filename ), IMREAD_COLOR );if (src.empty()){printf(" Error opening image\n");printf(" Usage:\n %s [image_name-- default lena.jpg] \n", argv[0]);return EXIT_FAILURE;}if( display_caption( "Original Image" ) != 0 ){return 0;}dst = src.clone();if( display_dst( DELAY_CAPTION ) != 0 ){return 0;}if( display_caption( "Homogeneous Blur" ) != 0 ){return 0;}for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){blur( src, dst, Size( i, i ), Point(-1,-1) );if( display_dst( DELAY_BLUR ) != 0 ){return 0;}}if( display_caption( "Gaussian Blur" ) != 0 ){return 0;}for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){GaussianBlur( src, dst, Size( i, i ), 0, 0 );if( display_dst( DELAY_BLUR ) != 0 ){return 0;}}if( display_caption( "Median Blur" ) != 0 ){return 0;}for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){medianBlur ( src, dst, i );if( display_dst( DELAY_BLUR ) != 0 ){return 0;}}if( display_caption( "Bilateral Blur" ) != 0 ){return 0;}for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){bilateralFilter ( src, dst, i, i*2, i/2 );if( display_dst( DELAY_BLUR ) != 0 ){return 0;}}display_caption( "Done!" );return 0;
}
int display_caption( const char* caption )
{dst = Mat::zeros( src.size(), src.type() );putText( dst, caption,Point( src.cols/4, src.rows/2),FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );return display_dst(DELAY_CAPTION);
}
int display_dst( int delay )
{imshow( window_name, dst );int c = waitKey ( delay );if( c >= 0 ) { return -1; }return 0;
}

原始图像:

均值滤波(核大小递增:1,3,5,…31):

在这里插入图片描述

高斯滤波

在这里插入图片描述

中值滤波

在这里插入图片描述

双边滤波
在这里插入图片描述

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

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

相关文章

Linux下QT界面小程序开发

背景&#xff1a;需要在linux不同环境下可以测试我们的读卡器设备 搭建本地linux开发环境&#xff08;本来想VS里开发然后通过SSH的方式在linux下编译&#xff0c;但是工具链一直没搞起来&#xff0c;所以我是在ubuntu里安装的QT Creator工具直接开发的&#xff09;&#xff1b…

ARMday6作业

1&#xff0c;串口字符串收发现象实现图 2.串口控制灯亮灭 main.c #include "uart4.h"//封装延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}} }int strcmp(char *a1,char *a2) {int i0;while(a1[i]a2[i]){if(a1[i]\0){break;} i;}…

C# 主窗体中显示子窗体(MDI)

1.示例代码&#xff0c;假如主窗体为MainForm,有三个子窗体分别是&#xff1a;Form1&#xff0c;Form2&#xff0c;Form3 public partial class MainForm : Form {public MainForm(){InitializeComponent();}Form1 form1 new Form1(); //子窗体1Form2 form2 new Form2(); //…

【地图】腾讯地图 - InfoWindow 自定义信息窗口内容时,内容 html 嵌套混乱问题

目录 需求描述问题问题代码页面展示 解决原因解决办法解决代码页面展示 代码汇总注 需求描述 腾讯地图上画点位&#xff0c;点击点位展示弹框信息 问题 问题代码 // 打开弹框 openInfoWindow(position, content) {this.infoWindow new TMap.InfoWindow({map: this.map,posit…

windowsVMware虚拟机中扩展linux磁盘空间

1.虚拟磁盘扩容 VM中&#xff0c;关闭linux虚拟机&#xff0c;直接编辑虚拟机-硬盘-扩展磁盘容量 2.通过Gparted工具进行LINUX系统磁盘分区 未分区挂载前可以看到/挂载点下空间为20G&#xff1a; 通过虚拟机-快照-拍摄快照&#xff0c;操作前可拍摄快照&#xff08;便于恢复之前…

FPGA高速接口的学习途径,全套课程

​FPGA高速接口有哪些学习途径&#xff0c;这里不得不提下我们宸极教育FPGA课程&#xff0c; FPGA课程5.0 版&#xff1a;Xilinx体系高速接口项目实操&#xff0c;全新升级&#xff0c;课程完全根据企业招聘要求&#xff0c;项目实操设置&#xff0c;适应目前市场的求职招聘要…

FastJson序列化隐藏特性

针对训练模型控制台的web后端维护&#xff0c;新增了一个int类型的maxTokenLimit字段&#xff0c;表示调用GPT模型请求允许的TokenSize上限值。后端添加好之后&#xff0c;数据库里面这个字段项没有填充数值&#xff0c;默认是空&#xff0c;所以理论上当maxTokenLimit字段为空…

半加器___

1.原理 2.代码 2.1 half_adder.v module half_adder (input wire in_1 ,input wire in_2 ,output wire sum ,output wire count );assign {count,sum}in_1in_2;endmodule 2.2 tb_half_adder.v timescale 1ns/1nsmodule tb_half_adder();reg in_1; reg in_2;wire su…

ThreaTrace复现记录

1. 环境配置 服务器环境 需要10.2的cuda版本 conda环境 包的版本&#xff1a; python 3.6.13 pytorch 1.9.1 torch-cluster 1.5.9 torch-scatter 2.0.9 torch-sparse 0.6.12 torch-spline-conv 1.2.1 torch-geometric 1.4.3 环境bug 这里环境搭建好以后&#xff0c;就可以正…

MySql实战--深入浅出索引(下)

在开始这篇文章之前&#xff0c;我们先来看一下这个问题&#xff1a; 在下面这个表T中&#xff0c;如果我执行 select * from T where k between 3 and 5&#xff0c;需要执行几次树的搜索操作&#xff0c;会扫描多少行&#xff1f; 下面是这个表的初始化语句。 图1 InnoDB的索…

【IEEE】Multimodal Machine Learning: A Survey and Taxonomy

不废话&#xff0c;先上思维导图&#xff0c;哈哈哈&#xff01; 论文题目Machine Learning: A Survey and Taxonomy作者Tadas Baltrusaitis , Chaitanya Ahuja , and Louis-Philippe Morency状态已读完会议或者期刊名称IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE IN…

【创建进程】fork函数与写时拷贝

文章目录 fork函数fork如何返回两个值&#xff08;fork的工作原理&#xff09;如何解释父子进程相互输出printf 写时拷贝 fork函数 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 fork函…

Linux - 应用层HTTPS、传输层TCP/IP模型中典型协议解析

目录 应用层&#xff1a;自定制协议实例 HTTP协议首行头部空行正文http服务器的搭建 HTTPS协议 传输层UDP协议TCP协议 应用层&#xff1a; 应用层负责应用程序之间的沟通—程序员自己定义数据的组织格式 应用层协议&#xff1a;如何将多个数据对象组织成为一个二进制数据串进行…

ES集群部署指引

文章目录 引言I 清除last_run_metadata_path数据。II 配置IP2.1 CentOS系统的IP参数2.2 shell脚本-静态网络配置III 公司工作电脑的IP多号段配置3.1 Mac电脑3.2 windows系统see alsomac Rootlees 内核保护措施引言 申请两台Linux机器,存储1年的航迹数据,需要4T的存储空间。 E…

【算法刷题 | 二叉树 03】3.22 二叉树的层序遍历02(5题:在每个树行中找最大值,填充每个节点的下一个右侧节点指针,二叉树的最大深度,最小深度)

文章目录 5.6 515_在每个树行中找最大值5.6.1问题5.6.2解法&#xff1a;层序遍历 5.7 116_填充每个节点的下一个右侧节点指针5.7.1问题5.7.2解法&#xff1a;层序遍历 5.8 116_填充每个节点的下一个右侧节点指针||5.8.1问题5.8.2解法&#xff1a;层序遍历 5.9 104_二叉树的最大…

Transformer的前世今生 day02(神经网络语言模型、词向量)

神经网络语言模型 使用神经网络的方法&#xff0c;去完成语言模型的两个问题&#xff0c;下图为两层感知机的神经网络语言模型&#xff1a; 假设词典V内有五个词&#xff1a;“判断”、“这个”、“词”、“的”、“词性”&#xff0c;且要输出P(w_next | “判断”、“这个”、…

揭秘最热门AI写作软件,看看有哪些值得推荐的AI写作神器

在快节奏的现代生活中&#xff0c;我们常常面临各种压力&#xff0c;例如工作、学习等。因此&#xff0c;一款能够提高写作效率的工具变得尤为重要。那么&#xff0c;有没有什么AI写作软件是比较好用的呢&#xff1f;下面小编给大家推荐几款热门的写作软件。 一.爱制作AI写作 …

什么是分布式

一个系统 各组件分别部署在不同服务器。彼此通过网络通信和协调的系统。 可以指多个不同组件分布在网络上互相协作&#xff0c;比如说电商网站也可以一个组件的多个副本组成集群&#xff0c;互相协作如同一个组件&#xff0c;比如数据存储服务中为了数据不丢失而采取的多个服务…

AI时代,Matter如何融入与服务中国智能家居市场,助力中国企业出海?

随着智能家居产业的飞速发展&#xff0c;丰富多样的智能家居产品为消费者带来了便利的同时&#xff0c;因为不同品牌、不同产品之间的协议与标准不统一&#xff0c;导致消费者体验产生割裂&#xff0c;本来想买个“智能”家居&#xff0c;结果买了个“智障”家居&#xff0c;这…

SQL日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…