参考:https://blog.csdn.net/lu597203933/article/details/16359461
为了构建计算机视觉应用程序,您必须能够访问图像内容,并最终修改或创建图像。即使是很简单的一副图像也可能包含数万个像素。从根本上说,图像是数值矩阵。这就是OpenCV 使用cv::Mat数据结构操作它们的原因。矩阵的每个元素代表一个像素。对于灰度图像(“黑白”图像),像素是无符号的8位值,其中0对应于黑色,55对应于白色。对于彩色图像,每个像素需要三个这样的值来表示通常的三原色通道{红色,绿色,蓝色}。因此,在这种情况下,矩阵元素具有三个值。
为了访问矩阵的每个单独元素,您只需指定其行号和列号。将返回逻辑上的像素。为啥是逻辑上的像素,因为对于灰度图,这个像素就是一个无符号数值。对于多通道图,这个像素就是一个向量。
#include "cv.h" #include "highgui.h" void salt(cv::Mat &image, int n) { for (int k = 0; k<n; k++) { int i = rand() % image.cols; int j = rand() % image.rows; if (image.channels() == 1) { // gray-level image image.at<uchar>(j, i) = 255; } else if (image.channels() == 3) { // color image image.at<cv::Vec3b>(j, i)[0] = 255; image.at<cv::Vec3b>(j, i)[1] = 255; image.at<cv::Vec3b>(j, i)[2] = 255; } } } int main(int argc, char** argv) { cv::Mat image = cv::imread("man.jpg"); salt(image, 3000); cv::namedWindow("Image"); cv::imshow("Image", image); cvWaitKey(0); return 0; }
椒盐噪点:是一种特殊类型的噪声,其中一些像素被白色或黑色像素取代。当在传输期间丢失某些像素的值时,这种类型的噪声可能发生在错误的通信中。
类cv::Mat包含几种访问图像不同属性的方法。
公共成员变量cols和rows为您提供图像中的列数和行数。对于元素访问,cv::Mat使用方法at(int y, int x)。但是,at方法返回的类型必须在编译时已知,并且由于cv::Mat可以包含任何类型的元素,因此程序员需要指定预期的返回类型。确定返回类型是程序员的责任 ,at方法不做任何类型转换。
图像由像素组成,对于灰度图是8位无符号数,对于彩色图是一个向量。image是cv::Mat类型
image.at<uchar>(j,i)= 255; image.at<cv::Vec3b>(j,i)[channel]= value;
<>内是各种类型的缩写,常见缩写如下Vec<T,n> T代表类型,n代表通道数
typedef Vec<uchar, 2> Vec2b; typedef Vec<uchar, 3> Vec3b; typedef Vec<uchar, 4> Vec4b; typedef Vec<short, 2> Vec2s; typedef Vec<short, 3> Vec3s; typedef Vec<short, 4> Vec4s; typedef Vec<ushort, 2> Vec2w; typedef Vec<ushort, 3> Vec3w; typedef Vec<ushort, 4> Vec4w; typedef Vec<int, 2> Vec2i; typedef Vec<int, 3> Vec3i; typedef Vec<int, 4> Vec4i; typedef Vec<int, 6> Vec6i; typedef Vec<int, 8> Vec8i; typedef Vec<float, 2> Vec2f; typedef Vec<float, 3> Vec3f; typedef Vec<float, 4> Vec4f; typedef Vec<float, 6> Vec6f; typedef Vec<double, 2> Vec2d; typedef Vec<double, 3> Vec3d; typedef Vec<double, 4> Vec4d; typedef Vec<double, 6> Vec6d;
前面,cv::Mat的对象在使用at方法访问像素的时候,需要指定返回类型。在已知矩阵类型的情况下,可以使用cv::Mat_类。他是cv::Mat的模板子类,cv::Mat_定义了一些额外的方法,但是没有思想你的数据类型。其使用方法如下
cv::Mat_<uchar> im2= image; // im2 refers to image im2(50,100)= 0; // access to row 50 and column 100
cv::Mat_对象在声明的时候就已经制定了类型,所以在使用st的方法的时候不需要指定返回类型。
https://blog.csdn.net/keetsky/article/details/52933908