OpenCV操作像素

 在了解了图像的基础知识和OpenCV的基础知识和操作以后,接下来我们要做的就对像素进行操作,我们知道了图像的本质就是一个矩阵,那么一个矩阵中存储了那么多的像素,我们如何来操作呢?下面通过几个例子来看看像素的操作。

这个是原图,接下来的例子都是对这个图片进行操作的。

访问像素出现雪花效果

我们需要有雪花的效果,这里的雪花其实就是一个个白色的点,白色在像素值是255,所以我们的思路就是在一个图像上面的矩阵中的一些像素值转成值为255的,如果是彩色的图像的话就是三个通道,那么就是分别对三个通道的值都转为255,三通道在OpenCV里面是按照蓝绿红的顺序排布的。

  • 代码实现
  #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <random>  // Add white noise to an image void white(cv::Mat image, int n) {      // C++11 random number generator     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) { // color image             // 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;             // or simply:             // image.at<cv::Vec3b>(j, i) = cv::Vec3b(255, 255, 255);         }     } }  int main() {     // open the image     cv::Mat image= cv::imread("boldt.jpg",1);      // call function to add noise     white(image,3000);      // display result     cv::namedWindow("Image1");     cv::imshow("Image1",image);      // write on disk     cv::imwrite("salted.bmp",image);      cv::waitKey();      // test second version     cv::Mat image2= cv::imread("boldt.jpg",0);//0表示灰度图      white(image2, 500);      cv::namedWindow("Image2");     cv::imshow("Image2",image2);      cv::waitKey();      return 0; } 
  • 效果

指针遍历像素:减少图像中颜色的数量

彩色图像由三通道像素组成,每个通道表示红、绿、蓝三原色中一种颜色的亮度值,每个数值都是8位无符号字符类型,因此颜色总数为 256×256×256,即超过 1600 万种颜色。

所以有时候为了降低分析的复杂性,需要减少图像中颜色的数量。

一种实现方法是把RGB空间细分到大小相等的方块中。例如,如果把每种颜色数量减少到 1/8,那么颜色总数就变为 32×32×32。将旧图像中的每个颜色值划分到一个方块,该方块的中间值就是新的颜色值;新图像使用新的颜色值,颜色数就减少了。

所以在这里的减少图像中颜色的数量的思路的步骤是:

  • 假设 N 是减色因子,将图像中每个像素的值除以 N(这里假 定使用整数除法,不保留余数)。

  • 然后将结果乘以 N,得到 N 的倍数,并且刚好不超过原始像素 值。

  • 加上 N / 2,就得到相邻的 N 倍数之间的中间值。

  • 对所有 8 位通道值重复这个过程,就会得到 (256 / N) × (256 / N) × (256 / N)种可能的颜色值。

  #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>  void reduceColor(cv::Mat image, 

                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信