在没有CV_RGB2GRAY

时间:2017-01-06 08:27:52

标签: opencv

我想在 opencv 中将 colorBGR 图片转换为灰度,而不使用直接命令 CV_RGB2GRAY 。在这里,我上传了我的代码,它给了我一个蓝色的图像,这不是一个正确的灰色输出图像。请检查下面的代码并告诉我哪里出错了,或者你可以给我另一个解决方案,将彩色图像转换为灰色输出图像而不用 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);

2 个答案:

答案 0 :(得分:3)

如果您打算通过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()函数中获取此参数为零时,它将加载强度为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);   
            }
        }

它会为您提供灰度图像。

答案 1 :(得分:1)

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

此外,当您在灰度图像中写入值时,需要使用uchar而不是Vec3b,因为灰度图像中的每个像素仅由一个无符号字符值组成,而不是一个3值的向量。

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

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

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