在OpenCV中将HSV转换为灰度图像

9

我是OpenCV的新手,正在学习分水岭算法。但我遇到了一个问题。

为了使用分水岭,我必须将图像颜色转换为灰度。当我使用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后,色调=蓝色,饱和度=绿色,亮度=红色,我可以使用BGR2GRAY运算符将其从HSV转换为灰度。

这两个输出图像是不同的。我能像这样将HSV转换为灰度吗?

//这与LAB颜色空间类似吗?


1
CV_HSV2GRAY怎么样?不好意思,这种东西不存在。你不能直接将HSV转换为灰度。 - guneykayim
没有选项CV_HSV2GRAY,谢谢guneykayim。 - Amateur
你为什么想要转换它?HSV是一种颜色表示法,用于图像处理中的分析。不要误会我的意思,但我很好奇你为什么想要这个函数。 - Øystein W.
我正在使用分水岭算法进行图像分割,其中有一步是将彩色图像转换为灰度图像。在BGR中没有问题,但在HSV空间(也许在LAB中也是如此),我没有任何想法。我不知道我像上面的代码那样做是否正确? - Amateur
4个回答

26

将HSV转换为灰度图像并不是必要的:你已经拥有了它。你可以通过将HSV图像分成三个通道并选择第三个通道作为灰度图像来完成此操作:

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();

非常感谢,使用Lab空间也是一样的。我只需选择L通道(channel[0])来进行灰度处理。 - Amateur
1
@Amateur 如果这个答案解决了你的问题,请考虑接受它。 - beaker

3
hsv1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)

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

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

欢迎来到stackoverflow。除了提供答案外,考虑给出解决问题的摘要。 - jtate

1
在HSV颜色空间中,V通道的定义是max(R, G, B),但在灰度图像中,亮度的定义是mean(R, G, B)。 在RGB2HSV转换中,我们使用以下公式来计算S和V通道:
V = max(R, G, B)
S = (max(R, G, B) - min(R, G, B)) / max(R, G, B)

如果S为零,max(R,G,B)等于min(R,G,B),它们等于mean(R,G,B)。因此,如果满足此条件,则V通道等于灰度值。否则,它们是不同的。 一种方法是将图像转换为RGB,然后将其转换为GRAY。但是,如果您正在寻找更直接的方法,可以使用下面的图片: HSV2RGB converion 因此,灰度值是mean(R,G,B),您可以通过以下方式计算:
gray = m + (c + x) / 3

你可以通过图像中的公式计算出m、c和x。


0

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

仅考虑第三个通道可能会产生您意想不到的灰度值,因为饱和度越来越高的颜色(例如RGB 0,0,255)在通过取hsv通道的值转换为灰度图像后将呈现为纯白色。

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

显然,将其转换为BGR然后转换为灰度图像可能是更好的选择。


BGR到灰度的公式不是在数学上产生V通道吗?当你将24位压缩成8位时,根据定义,除饱和像素外还有许多东西是无法解决的。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接