【问题标题】:Convert color image into grey in opencv without CV_RGB2GRAY在没有CV_RGB2GRAY的opencv中将彩色图像转换为灰色
【发布时间】:2017-01-06 17:52:31
【问题描述】:

我想在opencv中将colorBGR图像转换为灰度,而不使用直接命令CV_RGB2GRAY。在这里我上传了我的代码,它给了我一个蓝色的图像,这不是一个正确的 grey 输出图像。请检查下面的代码并告诉我哪里出错了,或者你可以给我另一种解决方案,将彩色图像转换为 grey 输出图像而不使用 CV_RGB2GRAY。 提前致谢。

Mat image=imread("Desktop\\Sample input\\ip1.png");
Mat grey( image.rows,image.cols, CV_8UC3);
for(int i=0;i<image.rows;i++)
        {
            for(int j=0;j<image.cols;j++)
            {
                 int blue = image.at<Vec3b>(i,j)[0];
                 int green = image.at<Vec3b>(i,j)[1];
                 int red = image.at<Vec3b>(i,j)[2];

                grey.at<Vec3b>(i,j) = 0.114*blue+0.587*green+ 0.299*red ;   
            }
        }
  imshow("grey image",grey);

【问题讨论】:

    标签: opencv


    【解决方案1】:

    如果你打算通过imread()函数转换你正在拍摄的图像,你可以直接将图像作为灰度图像的输入

    Mat image = imread("Desktop\\Sample input\\ip1.png",CV_LOAD_IMAGE_GRAYSCALE);
    

    或者,通过

    Mat image = imread("Desktop\\Sample input\\ip1.png",0);
    

    这是因为 CV_LOAD_IMAGE_GRAYSCALE 对应于常数 0。并且当 imread() 函数中将此参数设为 0 时,它将加载强度为 1 的图像。 如果想将任何图像转换为灰度,那么输出图像图像应该像

    Mat grey = Mat::zeros(src_image.rows, src_image.cols, CV_8UC1);
    

    由于灰度图像只有一个通道,然后您可以像这样转换图像:

    for(int i=0;i<image.rows;i++)
            {
    
                for(int j=0;j<image.cols;j++)
                {
                     int blue = image.at<Vec3b>(i,j)[0];
                     int green = image.at<Vec3b>(i,j)[1];
                     int red = image.at<Vec3b>(i,j)[2];
    
                    grey.at<uchar>(i, j) = (uchar) (0.114*blue + 0.587*green + 0.299*red);   
                }
            }
    

    它会给你灰度图像。

    【讨论】:

    • 对我来说效果很好
    【解决方案2】:

    在您的代码中,grey Mat 有 3 个通道。对于灰度图像,您只需要 1 个通道 (8UC1)。

    另外,当您在灰度图像中写入值时,您需要使用uchar 而不是Vec3b,因为灰度图像中的每个像素仅由一个 unsigned char 值组成,而不是 3 的向量价值观。

    所以,你需要替换这些行:

    Mat grey(image.rows, image.cols, CV_8UC1);
    

    grey.at<uchar>(i, j) = 0.114*blue + 0.587*green + 0.299*red;
    

    【讨论】:

    • 很好发现 - 比我的回答更完整。
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多