news 2026/6/8 17:30:58

opencv 中有关图像处理部分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
opencv 中有关图像处理部分

噪声介绍

图像在获取或者传输过程中会受到随机信号的干扰产生噪声。

椒盐噪声

随机出现的白色(盐)/ 黑色(椒)像素,属于脉冲噪声,幅值固定、位置随机。就像图像上散落的白点 / 黑点。“盐噪声”:像素值被置为 255(8 位图像,白色);“椒噪声”:像素值被置为 0(8 位图像,黑色);

void addSaltPepperNoise(Mat& src, Mat& dst, float noiseDensity) { // 深拷贝原图,避免修改原图像 dst = src.clone(); // 随机数生成器(C++11 推荐,比rand()更均匀) random_device rd; mt19937 gen(rd()); uniform_real_distribution<float> dist(0.0, 1.0); uniform_int_distribution<int> saltPepperDist(0, 1); // 0=椒噪声,1=盐噪声 // 遍历所有像素 for (int i = 0; i < dst.rows; i++) { for (int j = 0; j < dst.cols; j++) { // 随机判断是否添加噪声 if (dist(gen) < noiseDensity) { if (dst.channels() == 1) { // 灰度图 dst.at<uchar>(i, j) = saltPepperDist(gen) ? 255 : 0; } else if (dst.channels() == 3) { // 彩色图(BGR) Vec3b& pixel = dst.at<Vec3b>(i, j); pixel[0] = pixel[1] = pixel[2] = saltPepperDist(gen) ? 255 : 0; } } } } } noiseDensity 代表噪声密度(0~1),值越大噪声越明显; Mat spNoiseImg; addSaltPepperNoise(src, spNoiseImg, 0.05);

高斯噪声

噪声值服从正态分布,对每个像素的每个通道,叠加一个服从正态分布的随机值,需保证像素值在 [0,255] 范围内。

// 生成高斯噪声 void addGaussianNoise(Mat& src, Mat& dst, double mean = 0.0, double stddev = 20.0) { dst = src.clone(); // 正态分布随机数生成器 random_device rd; mt19937 gen(rd()); normal_distribution<double> gaussDist(mean, stddev); // 遍历所有像素 for (int i = 0; i < dst.rows; i++) { for (int j = 0; j < dst.cols; j++) { if (dst.channels() == 1) { // 灰度图 // 叠加噪声并限制范围 [0,255] int newValue = saturate_cast<uchar>(dst.at<uchar>(i, j) + gaussDist(gen)); dst.at<uchar>(i, j) = newValue; } else if (dst.channels() == 3) { // 彩色图 Vec3b& pixel = dst.at<Vec3b>(i, j); pixel[0] = saturate_cast<uchar>(pixel[0] + gaussDist(gen)); // B通道 pixel[1] = saturate_cast<uchar>(pixel[1] + gaussDist(gen)); // G通道 pixel[2] = saturate_cast<uchar>(pixel[2] + gaussDist(gen)); // R通道 } } } } // 【简化版】OpenCV内置函数生成高斯噪声(更高效) void addGaussianNoiseCV(Mat& src, Mat& dst, double stddev = 20.0) { dst = src.clone(); // 创建和原图同尺寸的高斯噪声矩阵 Mat noise(src.size(), src.type()); randn(noise, Scalar::all(0), Scalar::all(stddev)); // 均值0,标准差stddev // 叠加噪声(自动限制范围) add(dst, noise, dst, Mat(), src.type()); } stddev(标准差):控制噪声强度,常用值 10~50,值越大图像越模糊。

滤波方法

在这篇文章中介绍的很详细,我这里就不多赘述了:数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)_高斯滤波,均值滤波,中值滤波-CSDN博客

我这里介绍一下各个滤波方法的C++函数

均值滤波:

void blur(InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT); src 输入图像(Mat,支持单 / 多通道,8 位 / 浮点型) dst 输出图像(和输入尺寸、类型一致) ksize 滤波核尺寸(Size (w,h),如 Size (3,3) 表示 3×3 核,宽 / 高需为奇数) anchor 核的锚点(中心像素),默认 Point (-1,-1) 表示核中心 borderType 边界填充方式(默认 BORDER_DEFAULT 即可,无需修改 // 均值滤波示例 void meanFilterDemo(Mat& src) { Mat dst; // 3×3均值滤波(最常用) blur(src, dst, Size(3, 3)); // 5×5均值滤波(核越大,平滑效果越强,边缘越模糊) Mat dst5x5; blur(src, dst5x5, Size(5, 5)); // 显示结果 imshow("原图", src); imshow("3×3均值滤波", dst); imshow("5×5均值滤波", dst5x5); }

方框滤波:

void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor = Point(-1,-1), bool normalize = true, int borderType = BORDER_DEFAULT); ddepth 输出图像深度(-1 表示和输入一致,如 src 是 CV_8UC3,dst 也为 CV_8UC3) normalize 是否归一化:true = 归一化(等价均值滤波),false = 不归一化

高斯滤波:

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT); sigmaX X 方向标准差(必须指定),控制权重衰减速度 sigmaY Y 方向标准差(默认 0,表示和 sigmaX 相同) ksize 滤波核尺寸(必须是奇数,如 Size (3,3)、Size (5,5)),若设为 Size (0,0),OpenCV 会根据 sigmaX 自动计算核大小 // 高斯滤波示例 void gaussianFilterDemo(Mat& src) { Mat dst1, dst2; // 情况1:3×3核,sigmaX=1.5(常用参数) GaussianBlur(src, dst1, Size(3, 3), 1.5); // 情况2:5×5核,sigmaX=2.0(平滑更强) GaussianBlur(src, dst2, Size(5, 5), 2.0); // 显示结果 imshow("原图", src); imshow("3×3高斯滤波(sigma=1.5)", dst1); imshow("5×5高斯滤波(sigma=2.0)", dst2); }

中值滤波:

void medianBlur(InputArray src, OutputArray dst, int ksize); src 输入图像:支持单通道 / 三通道(彩色图),8 位 / 16 位 / 32 位浮点型(注意:彩色图是对每个通道单独做中值滤波) dst 输出图像:尺寸、类型和输入完全一致 ksize 滤波核尺寸:必须是大于 1 的奇数(如 3、5、7),表示邻域的边长(3=3×3 邻域)

图像金字塔

图像金字塔在这里也介绍的很详细:数字图像处理(21): 图像金字塔(高斯金字塔 与 拉普拉斯金字塔)_数字图像处理21-CSDN博客,这里只说明它的C++函数用法。

向下采样

pyrDown() 不是简单的直接缩放,而是遵循 “先平滑、后下采样” 的金字塔构建规则。先用 5×5 高斯核对原图进行高斯滤波,再剔除偶数行和偶数列(宽高各减半,像素数变为原图的 1/4)。
600×400 图像 → 300×200 图像,801×601 图像 → 401×301 图像。

void pyrDown(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT); dstsize 输出图像尺寸(默认空) borderType 边界填充方式(默认 BORDER_DEFAULT,无需修改)

向上取样

先将图像宽高各翻倍,在偶数行 / 列插入 0 值(相当于图像放大但像素值为空),再用 5×5 高斯核对插值后的图像滤波(填充 0 值位置的像素,使图像平滑)。

void pyrUp(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 17:28:42

Umi-OCR完全指南:免费离线OCR工具从入门到精通

Umi-OCR完全指南&#xff1a;免费离线OCR工具从入门到精通 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库。 …

作者头像 李华
网站建设 2026/6/8 17:28:40

小米平板5 Windows驱动包:让Android平板变身Windows工作站

小米平板5 Windows驱动包&#xff1a;让Android平板变身Windows工作站 【免费下载链接】MiPad5-Drivers https://github.com/Project-Aloha/windows_oem_xiaomi_nabu 项目地址: https://gitcode.com/gh_mirrors/mi/MiPad5-Drivers 想要将你的小米平板5从Android系统转变…

作者头像 李华
网站建设 2026/6/8 17:18:17

【信息科学与工程学】【物理/化学科学和工程技术】知识体系081 磁学04

编号 类型 磁学领域关联 子领域 核心数学方程式/算法模型 模型逐步推理思考的数学方程式及数字/数值 参数列表 时序数学方程式和时序周期变化和稳态/非稳态 关联知识 加工工具/机床/装备及厂商及加工工艺及各类时序流程和各类注意事项 Q136 磁记录技术 能量辅助记录…

作者头像 李华
网站建设 2026/6/8 17:17:59

【信息科学与工程学】【物理/化学科学和工程技术】知识体系073——电学基础07

覆盖混合信号设计、信号/电源完整性、先进封装、可测性设计和系统级设计等关键领域。 编号 类型 应用领域 具体场景/子问题 核心数学方程式/算法模型 逐步推理思考的数学方程式及数字/数值 关键电学参数与物理约束 应用中的时序、状态与连续性 实现挑战与设计权衡 关联…

作者头像 李华