【OpenCV自学(二)】添加椒盐噪声

时间:2024-03-26 13:32:54

OpenCV基础操作

--添加椒盐噪声--

毛耀升 || 2018. 06. 05

一、设计简介

为图像人为得加上椒盐噪声,椒盐噪声分纯白(盐)以及纯黑(椒)噪声点;

为添加噪声,建议声明实现椒盐噪声产生函数,其参数应包括:椒盐噪声作用的对象(一般为Mat类对象),椒盐噪声产生的数目(人为设定或者机器产生);

椒盐噪声产生需要加入三个随机数产生函数rand(),其一确定椒噪声或是盐噪声;其二、三产生椒盐噪声的处于二值图像矩阵上的点的位置(x,y);

注意:考虑到调用的图像可能是灰度图也可以是多彩图,对于椒盐噪声产生函数应当加入判断图像类型的操作,对灰度图和多彩图采用不同的加噪模式

二、设计环境

IDE:Visual Studio 2015

Library:OpenCV 3.4.1

三、设计效果

【OpenCV自学(二)】添加椒盐噪声

【OpenCV自学(二)】添加椒盐噪声

由于椒盐块并不大,需要放大图片才能看清

四、代码以及讲解

必要流、库以及命名空间

#include"stdafx.h"

#include<iostream>

#include<string>

usingnamespace std;

#include"opencv2/highgui.hpp"

#include"opencv2/core.hpp"

usingnamespace cv;

不再赘述

椒盐噪声产生函数

voidSPNoice(Matimg, intn) {

    //  椒盐噪声需要循环进行反复赋值,循环次数一般人工输入确定

    //  循环变量仅用于循环,不用于赋值的移位等功用

    inttypeOfNoice = 0; //  定义噪声种类变量,默认为0(椒噪声),1表示盐噪声

    intCrow = 0;

    intCcol = 0;

    while(n > 0) {

       //  第一个随机数产生函数用于确定椒盐噪声种类

       typeOfNoice= rand() % 2;   //  确定输出仅有1和0两个结果  

       //  使用两个随机数产生函数获取被修改的图像矩阵对应位置

       Crow= rand() % img.rows;

       Ccol= rand() % img.cols;

       //  使用at模板函数进入图像矩阵,修改矩阵参数,即加入噪声

       //  加入判断,如果图像的类别为单通道(灰度图),仅处理一个通道的数据即可

       if (img.type()== CV_8UC1) {

           if(typeOfNoice == 0)

              img.at<uchar>(Crow, Ccol) = 0;

           elseif(typeOfNoice== 1)

              img.at<uchar>(Crow, Ccol) = 255;

       }

       //  如果是3通道图,则处理像素的三元数据(BGR)

       elseif (img.type()== CV_8UC3) {

           if(typeOfNoice == 0) {

              img.at<Vec3b>(Crow, Ccol)[0] = 0;

              img.at<Vec3b>(Crow, Ccol)[1] = 0;

              img.at<Vec3b>(Crow, Ccol)[2] = 0;

           }

           elseif(typeOfNoice == 1)

              img.at<Vec3b>(Crow, Ccol)[0] = 255;

              img.at<Vec3b>(Crow, Ccol)[1] = 255;

              img.at<Vec3b>(Crow, Ccol)[2] = 255;

       }

       n--;

    }

}

说明请直接见注释内容

五、举一反三

【赋值法添加椒盐噪声】

函数返回类型为void类型,即为直接操作型函数,为了特殊要求,也可以返回Mat类型,能获得更加直观的结果,当然,中间会涉及到临时变量、保留原图等内容(一般返回Mat类型应当是不修改原图,方便对比用的),细心即可

由于椒盐颗粒过小,如果不进行仔细分辨,将不以看出,建议将椒盐噪声对应位置周边一定边长的矩形均进行赋值加入噪声,方便观察(当然,这样是否符合实际噪声特性,有待考究)

【关于Mat类的属性】

在调用Mat类的at()函数时报错了,错误原因在于没有根据Mat类的参数属性(type)别设置赋值方法,先结合以往所学以及网络查询,列出以下Mat类常用的参数属性

data: uchar型的指针。Mat类分为了两个部分:矩阵头和指向矩阵数据部分的指针,data就是指向矩阵数据的指针

dims:矩阵的维度,例如5*6矩阵是二维矩阵,则dims=2,三维矩阵dims=3

rows: 行数

cols: 列数

size:矩阵的大小,size(cols,rows),如果矩阵的维数大于2,则是size(-1,-1)

channels:矩阵元素拥有的通道数

type:表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)

depth:矩阵中元素的一个通道的数据类型,这个值和type是相关的

elemSize:矩阵一个元素占用的字节数,

elemSize1:矩阵元素一个通道占用的字节数

step、step1等

六、参考、引用内容

本报告系列主要参考书目《OpenCV By Example》中文版——《OpenCV实例详解》

椒盐噪声代码参考文:《OpenCV从入门到放弃(五):像素!》https://blog.csdn.net/xierhacker/article/details/52493746

Mat类属性参考文:《OpenCV2:Mat属性type,depth,step》

https://www.cnblogs.com/wangguchangqing/p/4016179.html

报告模板采用Microsoft Office Word 2013自带模板

全文字体采用 YaHei Consolas Hybrid

封面页眉页尾图片源自百度

七、设计心得

本次设计中,因为少考虑了Mat类型的属性type值,导致at函数的使用出现了问题,但是比较幸运的是,参考内容中出现了修改方式,为调整提供了便利。