在OpenCV中将HSV转换为灰度

问题描述 投票:4回答:3

我是OpenCV的新手。我正在学习分水岭算法的分段,我有一个问题。

我必须使用Watershed将图像颜色转换为图像灰度。当我使用色彩空间BGR,没有问题,但空间HSV,我不确定下面的代码是否正确。

Mat im = imread("./Image/118035.jpg", CV_LOAD_IMAGE_COLOR);

Mat imHSV;
cvtColor(im, imHSV, CV_BGR2HSV);
imshow("HSV", imHSV);

cvtColor(imHSV, imHSV, CV_BGR2GRAY);
imshow("HSV to gray", imHSV);


imshow("BGR", im);
cvtColor(im, im, CV_BGR2GRAY);
imshow("BGR to gray", im);

我认为,在从BGR转换为HSV后,Hue =蓝色,饱和度=绿色,值=红色,我可以使用运算符BGR2GRAY从HSV转换为灰度。

2图像输出不同,我可以将HSV转换为灰度吗?

//与彩色空间LAB相似吗?

opencv grayscale hsv
3个回答
13
投票

从HSV到灰色的转换不是必需的:您已经拥有它。您可以通过将HSV图像分成3并选择第3个通道来选择V通道作为灰度图像:

Mat im = imread("C:/local/opencv248/sources/samples/c/lena.jpg", CV_LOAD_IMAGE_COLOR);

Mat imHSV;
cvtColor(im, imHSV, CV_BGR2HSV);
imshow("HSV", imHSV);

//cvtColor(imHSV, imHSV, CV_BGR2GRAY);
Mat hsv_channels[3];
cv::split( imHSV, hsv_channels );
imshow("HSV to gray", hsv_channels[2]);

imshow("BGR", im);
cvtColor(im, im, CV_BGR2GRAY);
imshow("BGR to gray", im);

waitKey();

1
投票
hsv1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)

h, s, v1 = cv2.split(hsv1)

cv2.imshow("gray-image",v1)

0
投票

很遗憾,由于声誉不足,我无法发表评论。

单独使用第3个通道可能会给出您不期望的灰度值,因为颜色越来越饱和,作为一个极端的例子,RGB 0,0,255将通过取值hsv通道转换为灰度级而显示为纯白色。

这肯定会影响分水岭(取决于图像内容),因为饱和的红色,绿色和蓝色在V通道中不会被区分。

显而易见,转换为BGR然后转换为灰度可能是更好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.