OpenCV访问像素值

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);

结果图像如下所示

OpenCV访问像素值

赞(0)

评论 抢沙发

评论前必须登录!