图像遍历主要有三种方法,本节主要介绍和比较这三种方法。
一:简单存取像素值
首先介绍一个名词—椒盐噪点:它是一种特殊的噪点,它随机的将图像中的部分像素设置为白色或者黑色。
Code:
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void salt(Mat &image, int n)
{
for(int k = 0; k < n; k++)
{
rand();
int i = rand() % image.cols;
int j = rand() % image.rows;
if(image.channels() == 1)
{
image.at<uchar>(j,i) = 255;
}
else if(image.channels() == 3)
{
image.at<Vec3b>(j,i)[0] = 255;
image.at<Vec3b>(j,i)[1] = 255;
image.at<Vec3b>(j,i)[2] = 255;
}
}
}
void salt2(Mat_<Vec3b> image, int n) // 这个只针对彩色三通道的图片
{
for(int k = 0; k < n; k++)
{
rand();
int i = rand() % image.cols;
int j = rand() % image.rows;
if(image.channels() == 3)
{
image(j,i)[0] = 255;
image(j,i)[1] = 255;
image(j,i)[2] = 255;
}
}
}
int main()
{
Mat image = imread("F:\\huangrong.jpg", 1);
salt(image, 3000);
namedWindow("image");
imshow("image", image);
waitKey(0);
return 0;
}
Explaination:
(1) rand()是随机数生成函数。
(2)image.at<Vec3b>(j,i)[0] = 255;
成员函数at(inty, int x)可以用来存取图像元素,但必须在编译时期知道它的数据类型,这样的函数被称为模板函数,即需要指定操作成员的类型at<uchar>(y,x)
Opencv 中的类型Vec3b是由三个uchar组成的向量,可以通过操作符[]来获取。
(3)Mat_<Vec3b> image; image(j,i)[0] =255;
Mat_是Mat的一个模板子类。在事先知道矩阵类型的情况下,使用Mat_可以带来一些便利。这个类定义了一些额外的成员方法,但没有定义成员变量。它重载了操作符(),允许我们可以通过它直接存取矩阵元素。
Resu