当前位置 主页 > 网站技术 > 代码类 >

    opencv3/C++图像像素操作详解

    栏目:代码类 时间:2019-12-10 21:08

    RGB图像转灰度图

    RGB图像转换为灰度图时通常使用:

    进行转换,以下尝试通过其他对图像像素操作的方式将RGB图像转换为灰度图像。

    #include<opencv2/opencv.hpp>
    #include<math.h>
    using namespace cv;
    
    int main()
    {
     //像素操作
     Mat src,dst;
     src = imread("E:/image/image/daibola.jpg");
     if(src.empty())
     {
      printf("can not load image \n");
      return -1;
     }
    
     namedWindow("input");
     imshow("input",src);
    
     dst.create(src.size(), src.type());
    
     for(int row = 0; row < src.rows; row++)
     {
      for(int col = 0; col < src.cols; col++)
      {
       int b = src.at<Vec3b>(row, col)[0];
       int g = src.at<Vec3b>(row, col)[1];
       int r = src.at<Vec3b>(row, col)[2];
       dst.at<Vec3b>(row, col)[0] = max(r,max(g,b));
       dst.at<Vec3b>(row, col)[1] = max(r,max(g,b));
       dst.at<Vec3b>(row, col)[2] = max(r,max(g,b));
    
      }
     }
    
     namedWindow("output");
     imshow("output",dst);
     waitKey();
    
    }

    同理使用min(r,min(g,b))可以看到由于选择了较小的灰度值图像会明显变暗:

    图像线性增强

    通过对图像像素操作(线性变换),实现图像的线性增强。

    #include<opencv2/opencv.hpp>
    #include<math.h>
    using namespace cv;
    
    int main()
    {
     Mat src1, dst;
     src1 = imread("E:/image/image/im1.jpg");
     if(src1.empty())
     {
      printf("can not load im1 \n");
      return -1;
     }
     double alpha = 1.2, beta = 50;
     dst = Mat::zeros(src1.size(), src1.type());
     for(int row = 0; row < src1.rows; row++)
     {
      for(int col = 0; col < src1.cols; col++)
      {
       if(src1.channels() == 3)
       {
        int b = src1.at<Vec3b>(row, col)[0]; 
        int g = src1.at<Vec3b>(row, col)[1]; 
        int r = src1.at<Vec3b>(row, col)[2]; 
    
        dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta); 
        dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta); 
        dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta); 
       }
       else if (src1.channels() == 1)
       {
        float v = src1.at<uchar>(row, col); 
        dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
       }
      }
     }
    
     namedWindow("output",CV_WINDOW_AUTOSIZE);
     imshow("output", dst);
     waitKey();
     return 0;
    }

    掩膜操作调整图像对比度

    使用一个3×3掩模增强图像对比度:

    #include<opencv2/opencv.hpp>
    #include<math.h>
    using namespace cv;
    
    int main()
    {
     Mat src, dst;
     src = imread("E:/image/image/daibola.jpg");
     CV_Assert(src.depth() == CV_8U);
     if(!src.data)
     {
      printf("can not load image \n");
      return -1;
     }
    
     src.copyTo(dst);
     for(int row = 1; row<(src.rows - 1); row++)
     {
      const uchar* previous = src.ptr<uchar>(row - 1);
      const uchar* current = src.ptr<uchar>(row);
      const uchar* next = src.ptr<uchar>(row + 1);
      uchar* output = dst.ptr<uchar>(row);
      for(int col = src.channels(); col < (src.cols - 1)*src.channels(); col++)
      {
       *output = saturate_cast<uchar>(9 * current[col] - 2*previous[col] - 2*next[col] - 2*current[col - src.channels()] - 2*current[col + src.channels()]);
       output++;
      }
     }
    
     namedWindow("image", CV_WINDOW_AUTOSIZE);
     imshow("image",dst);
     waitKey();
     return 0;
    }