在学习图像处理时,会经常要存取图像中某元素的值,所以一定要明白opencv中读取和修改图像像素值是如何进行的,也是非常必要的。
一张图像是由一数值组成的矩阵,在opencv中用cv::Mat类来表示图像。矩阵中的每一个元素代表一个像素。对于灰度图像,像素由8位无符号数来表示,其中0代表黑色,255代表白色。对于彩色图像,每个像素需要3个8位无符号数来表示三个颜色(r/g/b)。因此彩色图像中的像素是一个三元数(向量vector)。
存取像素值方法,需要在代码中指定元素所在的行和列。程序会返回相应的元素,对于单通道图像,返回值是单个数值,对于多通道图像,返回值则是一组向量(vector)。
opencv中可以使用Mat类中的at成员函数来读取/修改像素值。
下面写对图像加椒盐噪声的例子来说明opencv中图像像素修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
void salt(Mat& image, int n) { for (int i = 0; i < n; i++) { int k = rand() % image.cols; int j = rand() % image.rows; if (image.channels() == 1) { //判断单通道灰度图 image.at<uchar>(j, k) = 0xFF; } else if(image.channels() == 3){//判断多通道彩色图 image.at<Vec3b>(j, k)[0] = 255; image.at<Vec3b>(j, k)[1] = 255; image.at<Vec3b>(j, k)[2] = 255; } } } void OnBnClickedButton23() { Mat image = imread("Lena.bmp"); cv::imshow("Image", image); salt(image, 3000); //加入随机椒盐噪声 imshow("加噪点后图像", image); } |
加椒盐噪点实际测试结果如下:
通过以上代码和上面的讲解相信,对于opencv中修改单个像素值有了了解。其中比较重要的是要判断图像是灰度或彩色,这样at函数会做不一样的实例化。