我想在 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);
答案 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;