OpenCV访问像素值,若要访问矩阵中的每个独立元素,只需要指定它的行号和列号即可。返回的对应元素可以是单个数值,也可以是多通道图像的数值向量。
准备工作
为了说明如何直接访问像素值,我们将创建一个简单的函数,用它在图像中加入椒盐噪声(salt-and-pepper noise)。顾名思义,椒盐噪声是一个专门的噪声类型,它随机选择一些像素,把它们的颜色替换成白色或黑色。如果通信时出错,部分像素的值在传输时丢失,就会产生这种噪声。这里只是随机选择一些像素,把它们设置为白色。
如何实现
创建一个接受输入图像的函数,在函数中对图像进行修改。第二个参数是需要改成白色的像素数量。
void salt(cv::Mat image, int n) {
// C++11 的随机数生成器
std::default_random_engine generator;
std::uniform_int_distribution<int>
randomRow(0, image.rows -1);
std::uniform_int_distribution<int>
randomCol(0, image.cols -1);
int i, j;
for (int k=0; k<n; k++) {
// 随机生成图形位置
i= randomCol(generator);
j= randomRow(generator);
if (image.type() == CV_8UC1) { // 灰度图像
// 单通道8 位图像
image.at<uchar>(j, i)= 255;
} else if (image.type() == CV_8UC3) { // 彩色图像
// 3 通道图像
image.at<cv::Vec3b>(j, i)[0]= 255;
image.at<cv::Vec3b>(j, i)[1]= 255;
image.at<cv::Vec3b>(j, i)[2]= 255;
}
}
}
这个函数使用一个简单的循环,执行n次,每次都把随机选择的像素设置为255。这里用随机数生成器生成像素的列i
和行j
。请注意,这里使用了type方法来区分灰度图像和彩色图像。对于灰度图像,把单个的8位数值设置为255;对于彩色图像,需要把三个主颜色通道都设置为255才能得到一个白色像素。
现在你可以调用这个函数,并传入已经打开的图像。参考下面的代码:
// 打开图像
cv::Mat image= cv::imread("boldt.jpg",1);
// 调用函数以添加噪声
salt(image,3000);
// 显示结果
cv::namedWindow("Image");
cv::imshow("Image", image);
结果图像如下所示
评论前必须登录!
注册