opencv 滤波 1. 卷积核卷积核就是一个小数字矩阵 在图像上滑动小数字矩阵和对应位置的像素做运算实现模糊、锐化、边缘检测。blur、GaussianBlur、medianBlur、filter2D全部底层都是卷积运算假设 3×3 卷积核滑动到图像某一块图像像素 卷积核kernel [10 20 30] [a b c] [40 50 60] [d e f] [70 80 90] [g h i]输出中心像素 10*a 20*b 30*c 40*d 50*e 60*f 70*g 80*h 90*i核窗口逐像素向右、向下滑动遍历整张图生成输出图像。2. 均值滤波void blur(InputArray src,InputArray dst,Size ksize,Point point Point(-1, -1),int borderType BORDER_DEFAULT);原理在图像上滑动一个矩形窗口卷积核把窗口内所有像素求算术平均值赋值给窗口中心输出像素。cv::Mat src,dst; src imread(test.jpg); cv::blur(src,dst,cv::Size(5,5));cv::Size(3,3) 卷积核大小必须奇数, size越大越模糊2. 高斯模糊void GaussianBlur(InputArray src,InputArray dst,Size ksize,double sigmaX,double sigmaY 0,int borderType BORDER_DEFAULT);Size 设置卷积核的大小必须是奇数 Size(0,0) 核大小有sigmaX自动计算sigmaXX方向高斯标准差数值越大模糊越强 sigmaX 0 ,sigmaX由Size()自动计算sigmaY: Y方向高斯标准差sigmaY传0就自动等于sigmaXMat src,dst; GaussianBlur(src,dst,Size(5,5),0); // sigmaX由size自动计算 GaussianBlue(src,dst,Size(0,0),4); // Size(0,0) 核大小由sigmaX 自动计算3. 中值滤波void medianBlur(InputArray src, InputArray dst, int ksize);原理取卷积窗口内像素中位数不是平均值。ksize 窗口大小取像素值必须是奇数cv::Mat src,dst; medianBlure(src, dst, 5);4. 双边滤波void bilateral(InputArray src,InputArray dst,int d,double sigmaColor,double sigmaSpace,int borderType BORDER_DEAFAULT);双边滤波保边缘的模糊美颜算法底层。❗不是固定卷积核权重是动态计算每一个位置的权重都不一样计算开销大。d滤波邻域直径。d 0程序自动根据sigmaSpace计算邻域大小推荐写 0sigmaColor颜色域标准差值越大允许相差更大的颜色参与平滑越大模糊越强。一般取值25 ~ 100sigmaSpace空间域标准差单位像素值越大参与计算的像素范围越大。一般取值25 ~ 100borderType边界填充默认即可不用修改实例代码mainwindow.cpp#include mainwindow.h #include ui_mainwindow.h #include QDebug MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { qDebug() __func__ __LINE__; ui-setupUi(this); initMainWindow(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::initMainWindow() { qDebug() __func__ __LINE__; ui-blurViewLabel-setFixedSize(723,399); ui-gaussianViewLabel-setFixedSize(723,399); ui-medianViewLabel-setFixedSize(723,399); ui-bilateralViewLabel-setFixedSize(723,399); QString imgPath R(D:\new_share\016_opencv\OpenCVFilter\1.jpg); Mat imgData imread(imgPath.toStdString()); // BGR 格式 cvtColor(imgData, imgData , COLOR_BGR2RGB); // 转为 RGB 格式 myImg imgData; blurImg QImage((const unsigned char*)imgData.data, imgData.cols, imgData.rows, static_castint(imgData.step),QImage::Format_RGB888).copy(); gaussianImg blurImg; medianImg blurImg; bilateralImg blurImg; imgShow(); } void MainWindow::imgShow() { qDebug() __func__ __LINE__; ui-blurViewLabel-setPixmap(QPixmap::fromImage(blurImg.scaled(ui-blurViewLabel-size()))); ui-gaussianViewLabel-setPixmap(QPixmap::fromImage(gaussianImg.scaled(ui-gaussianViewLabel-size()))); ui-medianViewLabel-setPixmap(QPixmap::fromImage(medianImg.scaled(ui-medianViewLabel-size()))); ui-bilateralViewLabel-setPixmap(QPixmap::fromImage(bilateralImg.scaled(ui-bilateralViewLabel-size()))); } void MainWindow::imgProc(int kernel) { qDebug() __func__ __LINE__; Mat imgSrc myImg; Mat imgBlurDst imgSrc.clone(); Mat imgGaussianDst imgSrc.clone(); Mat imgMedianDst imgSrc.clone(); Mat imgBilateralDst imgSrc.clone(); int value 1; value value kernel*2; blur(imgSrc,imgBlurDst,Size(value,value),Point(-1,-1)); GaussianBlur(imgSrc, imgGaussianDst, Size(value,value),0); medianBlur(imgSrc,imgMedianDst,value); bilateralFilter(imgSrc, imgBilateralDst, value, value*2.0, value/2.0); blurImg QImage((const unsigned char*)imgBlurDst.data, imgBlurDst.cols, imgBlurDst.rows, static_castint(imgBlurDst.step),QImage::Format_RGB888).copy(); gaussianImg QImage((const unsigned char*)imgGaussianDst.data, imgGaussianDst.cols, imgGaussianDst.rows, static_castint(imgGaussianDst.step), QImage::Format_RGB888).copy(); medianImg QImage((const unsigned char*)imgMedianDst.data, imgMedianDst.cols, imgMedianDst.rows, static_castint(imgMedianDst.step), QImage::Format_RGB888).copy(); bilateralImg QImage((const unsigned char*)imgBilateralDst.data, imgBilateralDst.cols, imgBilateralDst.rows, static_castint(imgBilateralDst.step), QImage::Format_RGB888).copy(); imgShow(); } void MainWindow::on_verticalSlider_valueChanged(int value) { qDebug() __func__ __LINE__; imgProc(value); }mainwindow.h#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include opencv2/opencv.hpp QT_BEGIN_NAMESPACE using namespace cv; namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); void initMainWindow(); void imgShow(); void imgProc(int kernel); private slots: void on_verticalSlider_valueChanged(int value); private: Ui::MainWindow *ui; Mat myImg; QImage blurImg; QImage gaussianImg; QImage medianImg; QImage bilateralImg; }; #endif // MAINWINDOW_H

相关新闻

最新新闻

[Freebuff] 一款Free Token的编码工具,更好的Vibe Coding

[Freebuff] 一款Free Token的编码工具,更好的Vibe Coding

前言 Freebuff 是一款基于命令行界面的编码工具,无需订阅、API 密钥或令牌费用即可使用。可以选择以下模型: DeepSeek V4 Pro 和 FlashMiniMax M3GPT-5.6 Luna 一、多智能体架构 Freebuff 最大的技术特色不是"又换了个大模型套壳"&#xff…

2026/8/8 7:33:47
深入解析AQS:Java并发编程核心框架原理与应用实践

深入解析AQS:Java并发编程核心框架原理与应用实践

1. 项目概述:为什么AQS是Java并发编程的“定海神针”?如果你写过Java并发程序,用过ReentrantLock、Semaphore或者CountDownLatch,那你其实已经在和AQS打交道了。AQS,全称AbstractQueuedSynchronizer,是Java…

2026/8/8 7:33:47
2026年同济MBA“菁英智汇“见面交流会是什么?交流会流程和真题有哪些?

2026年同济MBA“菁英智汇“见面交流会是什么?交流会流程和真题有哪些?

2027年入学的考生中,不少人对同济MBA的"菁英智汇"见面交流会既好奇又陌生:它到底是不是面试?流程如何?会问什么?这篇文章基于同济官方公开信息,把这个前置环节讲清楚,帮你做到心里有底…

2026/8/8 7:33:47
嵌入式电源管理实战:从LDO/DCDC选型到PCB布局的工程避坑指南

嵌入式电源管理实战:从LDO/DCDC选型到PCB布局的工程避坑指南

1. 从“能用”到“好用”:电源管理组件的价值再认识在嵌入式开发和硬件系统设计里,电源管理组件(Power Management Unit, PMU)常常被看作一个“后勤部门”。很多工程师,尤其是刚入行的朋友,会觉得它无非就是…

2026/8/8 7:33:47
【独家干货】心血管研究AAV载体选型指南

【独家干货】心血管研究AAV载体选型指南

核心摘要行业核心痛点:射血分数保留型心力衰竭(HFpEF)治疗策略缺乏,心脏衰老是关键病理基础,基因治疗需解决靶向递送与特异性表达的难题。经典方案验证:复旦大学附属中山医院团队利用AAV9载体成功实现在体心…

2026/8/8 7:33:47
Windows下C++/Qt医学图像开发环境搭建与DCMTK集成实战

Windows下C++/Qt医学图像开发环境搭建与DCMTK集成实战

1. 项目概述与核心痛点最近在折腾一个基于C和Qt的医学图像应用软件,从零开始搭环境到编译运行,整个过程可以说是一步一个坎。医学图像处理这个领域,对库的依赖和环境配置要求相当苛刻,远不是写个“Hello World”那么简单。DCMTK、…

2026/8/8 7:28:47