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

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/9/23 4:54:42
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/23 8:01:55
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/23 8:02:11
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/9/23 8:01:38
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/23 8:01:21
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/23 8:02:28

日新闻

周新闻