OpenCV4(C++)—— 图像噪声与图像滤波

news2024/11/16 12:39:23

文章目录

  • 前言
    • 一、图像噪声
    • 1、椒盐噪声
    • 2、高斯噪声
  • 二、图像滤波


前言

图像噪声是图像在摄取或传输时所受的随机信号干扰,表现为图像信息或者像素亮度的随机变化。目前最常见的两者噪声是椒盐噪声和高斯噪声。


一、图像噪声

1、椒盐噪声

  椒盐噪声又被称作脉冲噪声,它会随机改变图像中的像素值,是由相机成像、图像传输、解码处理等过程产生的黑白相间的亮暗点噪声,其样子就像在图像上随机的撒上一些盐粒和黑椒粒,因此被称为椒盐噪声。
  OpenCV中没有专门增加椒盐噪声的函数,可根据原理自行编写。

大致步骤:

  1. 确定添加椒盐噪声的位置。椒盐噪声会随机出现在图像中任何一个位置,可以通过随机数函数生成两个随机数,分别用于确定椒盐噪声产生的行和列。
  2. 确定噪声的种类。不仅椒盐噪声的位置是随机的,噪声点是黑色的还是白色的也是随机的,因此可以再次生成随机数,通过判断随机数的奇偶性确定该像素是黑色噪声点还是白色噪声点。
  3. 修改图像像素灰度值。判断图像通道数,通道数不同的图像中像素表示白色的方式也不相同。也可以根据需求只改变多通道图像中某一个通道的数值。

代码如下(示例):

#include <opencv2/opencv.hpp>
#include <random>
#include<iostream>  

using namespace std;

void addSaltAndPepperNoise(cv::Mat& image, double noiseRatio)
{
    // 生成随机数并初始化
    std::random_device rd;  // 获取随机数种子
    std::mt19937 gen(rd()); // 使用mt19937作为随机数引擎
    std::uniform_real_distribution<> distribution(0.0, 1.0);  // 创建随机数分布器,将用于生成介于0.0和1.0之间的随机数

    // 计算图像中的像素总数和要添加噪声的像素数量
    int numPixels = image.total();
    int numNoisePixels = static_cast<int>(numPixels * noiseRatio);

    for (int i = 0; i < numNoisePixels; ++i)
    {
        // 1、确定添加椒盐噪声的位置:每次迭代中,代码生成两个随机数,即随机的行索引row和列索引col
        int row = distribution(gen) * image.rows;
        int col = distribution(gen) * image.cols;

        // 2、确定噪声的种类
        // 3、修改像素灰度值
        if (image.channels() == 1)  // 灰度图像
        {
            // 使用distribution(gen) < 0.5生成一个随机数,如果该随机数小于0.5,则将像素值设置为0,否则设置为255
            image.at<uchar>(row, col) = (distribution(gen) < 0.5) ? 0 : 255;
        }
        else if (image.channels() == 3)  // 彩色图像
        {  // 如果图像是彩色图像,则在选定位置处创建一个cv::Vec3b类型的向量
            image.at<cv::Vec3b>(row, col) = cv::Vec3b(
                (distribution(gen) < 0.5) ? 0 : 255,
                (distribution(gen) < 0.5) ? 0 : 255,
                (distribution(gen) < 0.5) ? 0 : 255
            );
        }
    }
}

int main()
{
    cv::Mat img0 = cv::imread("C:/Users/Opencv/temp/wn.png", 0);
    cv::imshow("原图", img0);
    // 添加椒盐噪声
    double noiseRatio = 0.05;
    addSaltAndPepperNoise(img0, noiseRatio);
  
    cv::imshow("椒盐噪声", img0);
    cv::waitKey(0);
    cv::destroyAllWindows();

	return 0;
}

在这里插入图片描述

在这里插入图片描述
从结果来看,灰度图像加上椒盐噪声,就是多了黑、白两种点。彩色图像加椒盐噪声,多了黑、白、红、蓝、绿等多种点,因为示例代码中,每个通道的像素都是随机的,可以是[0,0,0]、[255,0,0]、[0,255,255]等,若只想要黑、白点,就设定三个通道的随机数一样即可。

2、高斯噪声

  高斯噪声又称为正态噪声,在噪声图像的统计直方图上呈正态分布。OpenCV4中同样没有专门为图像添加高斯噪声的函数,根据原理自行编写。
  椒盐噪声是在随机位置上生成0或255这种像素点进行替换,而高斯噪声是在区域内,即所有像素点,进行像素叠加,所以大致步骤:

  1. 首先需要创建一个与图像尺寸、数据类型以及通道数相同的Mat类变量
  2. 在该Mat类变量产生符合高斯分布的随机数
  3. 将原图像和含有高斯分布的随机数矩阵按一定权重相加

代码如下(示例):

#include <opencv2/opencv.hpp>
#include <random>
#include<iostream>  
using namespace std;

void addGaussianNoise(cv::Mat& image, double mean, double stddev)
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::normal_distribution<> distribution(mean, stddev); // 创建一个正态分布对象distribution,用于生成高斯分布的随机数,其参数为均值mean和标准差stddev

    cv::Mat noise;
    if (image.channels() == 1) {
        noise = cv::Mat(image.size(), CV_32F);
        for (int i = 0; i < image.rows; i++) {
            for (int j = 0; j < image.cols; j++) {
                float& pixel = noise.at<float>(i, j);
                pixel = distribution(gen);
            }
        }
    }
    else if (image.channels() == 3) {
        noise = cv::Mat(image.size(), CV_32FC3);
        for (int i = 0; i < image.rows; i++) {
            for (int j = 0; j < image.cols; j++) {
                cv::Vec3f& pixel = noise.at<cv::Vec3f>(i, j);
                pixel[0] = distribution(gen);
                pixel[1] = distribution(gen);
                pixel[2] = distribution(gen);
            }
        }
    }

    cv::Mat noisyImage;
    image.convertTo(noisyImage, noise.type());
    cv::addWeighted(noisyImage, 1.0, noise, 1.0, 0.0, noisyImage); // 按照权重系数1:1相加,偏置为0

    noisyImage.convertTo(image, image.type());
}

int main()
{
    cv::Mat img0 = cv::imread("C:/Users/Opencv/temp/wn.png",0);
    cv::imshow("原图", img0);

     // 添加高斯噪声
    double mean = 10;
    double stddev = 20;
    addGaussianNoise(img0, mean, stddev);

    cv::imshow("高斯噪声", img0);
    cv::waitKey(0);
    cv::destroyAllWindows();

	return 0;
}

在这里插入图片描述

在这里插入图片描述


注:目前OpenCV中虽然没有直接进行添加噪声的函数,但其他库是有的,如torchvision的transforms,skimage库的skimage.util.random_noise(image, mode=‘gaussian’, seed=None, clip=True, **kwargs)等。

二、图像滤波

图像滤波的简单介绍:Link

OpenCV中虽然没有直接进行添加噪声的函数,但提供了滤波函数。图像滤波大致分为两种:线性滤波和非线性滤波。
  线性滤波中有方框滤波、均值滤波、高斯滤波。因为进行的是类似于卷积的线性计算,所以定义为线性滤波。
  非线性滤波中有中值滤波和双边滤波。

使用方式就不介绍了,比较简单。一般高斯噪声用线性滤波处理,椒盐噪声用非线性滤波处理

注:滤波器(即卷积核)是一个矩阵形式,而矩阵可分成一个列向量和一个行向量相乘。
在这里插入图片描述
所以滤波操作也可以分开进行。在高斯滤波中经常应用,分为X方向滤波和Y方向滤波。

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

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

相关文章

中科大 Epc 综合英语备考 之 单词篇

Lesson 1 ENGLISH — A WORLD LANGUAGE单词表课后练习同义替换选词填空 Lesson 2 MY LACK OF GUMPTION单词表课后练习同义替换选词填空 Lesson 3 WINNING ISNT EVERYTHING单词表课后练习同义替换选词填空 Lesson 5 PRIVATE SPACE单词表课后练习同义替换选词填空 Lesson 9 THE M…

【常见错误】SVN提交项目时,出现了这样的提示:“XXX“ is scheduled for addition, but is missing。

SVN提交项目时&#xff0c;出现了这样的提示&#xff1a;“XXX“ is scheduled for addition, but is missing。 原因是&#xff1a;之前用SVN提交过的文件/文件夹&#xff0c;被标记为"addition"状态&#xff0c;等待被加入到仓库。虽然你把这个文件删除了&#xf…

centos / oracle Linux 常用运维命令讲解

目录 1.shell linux常用目录&#xff1a; 2.命令格式 3.man 帮助 4.提示符 5.echo输出字符串或变量值 6.date显示及设置系统的时间或日期 7.重启系统 8.关闭系统 9.登录注销 10.wget 下载文件 11.ps 查看系统的进程 12.top动态监视进程信息和系统负载等信息 13.l…

OpenAI科学家谈GPT-4的潜力与挑战

OpenAI Research Scientist Hyung Won Chung 在首尔国立大学发表的一场演讲。 模型足够大&#xff0c;某些能力才会显现&#xff0c;GPT-4 即将超越拐点并在其能力上实现显着跳跃。GPT-3 和 GPT-4 之间的能力仍然存在显着差距&#xff0c;并且尝试弥合与当前模型的差距可能是无…

NPU上PyTorch模型调优问题案例

在昇腾AI处理器上训练PyTorch框架模型时&#xff0c;可能由于算子在CPU上的下发速度、动态shape等问题&#xff0c;导致性能降低&#xff0c;那么本期就分享几个关于PyTorch模型调优的典型案例&#xff0c;给出调优思路及具体的调优方法&#xff1a; 1、NPU亲和优化器替换调优…

压力测试+接口测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因 为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是…

2023 年度,最受人欢迎的低代码开发平台大盘点

在介绍之前&#xff0c;先给大家讲解一下&#xff0c;当前低代码领域主要发展的2个方向 一、低代码开发平台 面向大中小型企业&#xff0c;写少了代码&#xff0c;提供一系列低代码引擎&#xff0c;表单设计器、流程设计器、大屏设计器&#xff0c;支持通过可视化组件少量代码…

配置OSPF包文分析和验证

.2.2实验2&#xff1a;配置OSPF包文分析和验证 [1] 实验目的 通过抓包分析OSPF的包文实现OSPF区域认证的配置 实验拓扑 实验拓扑图如图1-3所示。 图1-3 配置OSPF包文分析和验证 实验步骤 IP地址的配置、运行OSPF的步骤与实验1相同&#xff0c;此处略。[2] 在R1的g0/0/0抓包…

配电室远程运维平台:现代化的电力管理解决方案

随着科技进步和电力行业的发展&#xff0c;配电室正在逐渐实现远程运维&#xff0c;这一创新技术趋势带来的改变&#xff0c;无疑提升了电力配送的效率和精确性。 力安科技电易云配电室远程运维平台&#xff0c;通过在高低压配电柜、变压器、一级/二级配电柜、配电箱、电缆…

今天面试招了个18K的人,从字节出来的果然都有两把刷子···

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试中&#xff0c;不…

[小林coding]4.1TCP三次握手四次挥手笔记_1012

1.tcp头部格式&#xff1a; 序列号&#xff1a;用来解决网络包收发的顺序问题 确认应答号&#xff1a;解决丢包问题&#xff08;一般都是1&#xff09; 2.建立一个 TCP 连接是需要客户端与服务端达成上述三个信息的共识 Socket&#xff1a;由 IP 地址和端口号组成&#xff08;…

1000个已成功入职的软件测试工程师简历范文模板(含真实简历)

如果你想学习自动化测试&#xff0c;那么下面这套视频应该会帮到你很多 如何逼自己1个月学完自动化测试&#xff0c;学完即就业&#xff0c;小白也能信手拈来&#xff0c;拿走不谢&#xff0c;允许白嫖.... 最后我这里给你们分享一下我所积累和整理的一些文档和学习资料&#…

云原生Kubernetes:K8S集群版本升级

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 &#xff08;1&#xff09;概念 搭建K8S集群的方式有很多种&#xff0c;比如二进制&#xff0c;kubeadm…

2023年【公路水运工程施工企业安全生产管理人员】考试总结及公路水运工程施工企业安全生产管理人员模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【公路水运工程施工企业安全生产管理人员】考试总结及公路水运工程施工企业安全生产管理人员模拟考试题库&#xff0c;包含公路水运工程施工企业安全生产管理人员考试总结答案和解析及公路水运工程施工企业安全…

Kotlin-Java 互操作指南

官网地址 https://developer.android.google.cn/kotlin/interop?hlzh-cn 脑图

外汇天眼:6个常见网络投资诈骗迹象,如发现任何一个,务必小心!

在这个数字时代&#xff0c;随着外汇和加密货币市场的不断发展&#xff0c;网络投资已经成为一种广受欢迎的理财方式。然而&#xff0c;近年来&#xff0c;诈骗犯罪也在不断增加&#xff0c;给社会带来了巨大的财务损失。尽管投资诈骗的手法各式各样&#xff0c;但它们都可以追…

2023年全球及中国光伏硅片行业产量、市场竞争格局及趋势分析[图]

随着硅片企业建厂扩建&#xff0c;我国硅片产能逐步增长&#xff0c;光伏硅片产能逐渐向中国集中。2022年&#xff0c;我国光伏硅片产能约650.3GW&#xff0c;同比增长59.7%&#xff1b;2023年1-6月&#xff0c;我国光伏硅片产量超过253.4GW&#xff0c;同比增长65.8%&#xff…

一道桥牌明手题的思路与分析

题目 S先出&#xff0c;要求NS全大 分析 剩下6吨牌&#xff0c;可以确保大的有五吨&#xff08;h2吨&#xff0c;d2吨&#xff0c;c1吨&#xff09; 我们需要额外发展一顿出来&#xff0c;哪一顿呢&#xff1f; s、d和c都有机会&#xff0c;那么我们不妨先让WE陷入被挤的境地…

射频识别技术(RFID)在智能制造模具管理中的应用

背景介绍 模具是工业生产的核心装备&#xff0c;被誉为“工业之母”&#xff0c;广泛应用于机械、汽车、轻工、电子、化工、冶金、建材等各个行业&#xff0c;是制造加工企业的重要资产&#xff0c;然而&#xff0c;传统的人工纸质记录方式已无法满足模具管理的需求&#xff0…

在Android平板上使用code-server公网远程Ubuntu服务器编程

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…