OpenCV遍历彩色图像、灰度图像的像素值方法

原文链接:https://blog.csdn.net/mooneve/article/details/53001677

应用:将彩色图像转为灰度图像输出


方法一 使用at<Vec3b>(i, j) 和at<uchar>(i, j)



    
    
  1. void main()
  2. {
  3. //读入彩色图像
  4. Mat img = imread( “fruits.jpg”);
  5. imshow( “原图”, img);
  6. int rows = img.rows;
  7. int cols = img.cols;
  8. //生成和img同样大小的空白灰度图像
  9. Mat grayImg = Mat(rows, cols, CV_8U);
  10. for ( int i = 0; i < rows; i++)
  11. {
  12. for ( int j = 0; j < cols; j++)
  13. {
  14. //彩色图像获取到单个像素
  15. Vec3b pix = img.at<Vec3b>(i,j);
  16. //获取到RGB分量的值。
  17. uchar B = pix[ 0];
  18. uchar G = pix[ 1];
  19. uchar R = pix[ 2];
  20. //或者使用下面的方法
  21. //uchar B = img.at<Vec3b>(i, j)[0];
  22. //uchar G = img.at<Vec3b>(i, j)[1];
  23. //uchar G = img.at<Vec3b>(i, j)[2];
  24. //计算灰度值,然后赋值给灰度图中的像素
  25. grayImg.at<uchar>(i,j) = R * 0.299 + G * 0.587 + B * 0.114; //灰度著名心理学公式
  26. }
  27. }
  28. imshow( “灰度图”, grayImg);
  29. waitKey( 0);
  30. }

方法二 使用ptr函数和指针 (高效)


    
    
  1. void main()
  2. {
  3. //读入彩色图像
  4. Mat img = imread( "fruits.jpg");
  5. imshow( "原图", img);
  6. int rows = img.rows;
  7. int cols = img.cols;
  8. //生成和img同样大小的空白灰度图像
  9. Mat grayImg = Mat(rows, cols, CV_8U);
  10. for ( int i = 0; i < rows; i++)
  11. {
  12. //获取图像每一行的首地址
  13. Vec3b *p = img.ptr<Vec3b>(i); //彩色图 //p指向地址
  14. uchar *p2 = grayImg.ptr<uchar>(i); //灰度图 //*p指向内容
  15. for ( int j = 0; j < cols; j++)
  16. {
  17. //每次迭代获取图像列的地址
  18. Vec3b &pix = *p++; //彩色图 //pix指向内容
  19. uchar &pix2 = *p2++; //灰度图 //&pix指向地址
  20. pix2 = pix[ 0] * 0.114 + pix[ 1] * 0.587 + pix[ 2] * 0.299;
  21. }
  22. }
  23. imshow( "灰度图", grayImg);
  24. waitKey( 0);
  25. }


原文链接:https://blog.csdn.net/mooneve/article/details/53001677

应用:将彩色图像转为灰度图像输出


方法一 使用at<Vec3b>(i, j) 和at<uchar>(i, j)



  
  
  1. void main()
  2. {
  3. //读入彩色图像
  4. Mat img = imread( “fruits.jpg”);
  5. imshow( “原图”, img);
  6. int rows = img.rows;
  7. int cols = img.cols;
  8. //生成和img同样大小的空白灰度图像
  9. Mat grayImg = Mat(rows, cols, CV_8U);
  10. for ( int i = 0; i < rows; i++)
  11. {
  12. for ( int j = 0; j < cols; j++)
  13. {
  14. //彩色图像获取到单个像素
  15. Vec3b pix = img.at<Vec3b>(i,j);
  16. //获取到RGB分量的值。
  17. uchar B = pix[ 0];
  18. uchar G = pix[ 1];
  19. uchar R = pix[ 2];
  20. //或者使用下面的方法
  21. //uchar B = img.at<Vec3b>(i, j)[0];
  22. //uchar G = img.at<Vec3b>(i, j)[1];
  23. //uchar G = img.at<Vec3b>(i, j)[2];
  24. //计算灰度值,然后赋值给灰度图中的像素
  25. grayImg.at<uchar>(i,j) = R * 0.299 + G * 0.587 + B * 0.114; //灰度著名心理学公式
  26. }
  27. }
  28. imshow( “灰度图”, grayImg);
  29. waitKey( 0);
  30. }

方法二 使用ptr函数和指针 (高效)


  
  
  1. void main()
  2. {
  3. //读入彩色图像
  4. Mat img = imread( "fruits.jpg");
  5. imshow( "原图", img);
  6. int rows = img.rows;
  7. int cols = img.cols;
  8. //生成和img同样大小的空白灰度图像
  9. Mat grayImg = Mat(rows, cols, CV_8U);
  10. for ( int i = 0; i < rows; i++)
  11. {
  12. //获取图像每一行的首地址
  13. Vec3b *p = img.ptr<Vec3b>(i); //彩色图 //p指向地址
  14. uchar *p2 = grayImg.ptr<uchar>(i); //灰度图 //*p指向内容
  15. for ( int j = 0; j < cols; j++)
  16. {
  17. //每次迭代获取图像列的地址
  18. Vec3b &pix = *p++; //彩色图 //pix指向内容
  19. uchar &pix2 = *p2++; //灰度图 //&pix指向地址
  20. pix2 = pix[ 0] * 0.114 + pix[ 1] * 0.587 + pix[ 2] * 0.299;
  21. }
  22. }
  23. imshow( "灰度图", grayImg);
  24. waitKey( 0);
  25. }


猜你喜欢

转载自blog.csdn.net/mars_xiaolei/article/details/81221874