我是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相似?
答案 0 :(得分:11)
从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 :(得分:1)
hsv1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)
h, s, v1 = cv2.split(hsv1)
cv2.imshow("gray-image",v1)
答案 2 :(得分:0)
很遗憾,由于声誉不足,我无法发表评论。
单独使用第3个通道可能会给出您不期望的灰度值,因为颜色越来越饱和,作为一个极端的例子,RGB 0,0,255将通过取值hsv通道转换为灰度后显示为纯白色。 / p>
这肯定会影响分水岭(取决于图像内容),因为饱和的红色,绿色和蓝色在V声道中无法区分。
显而易见,转换为BGR然后灰度可能是一个更好的选择。
答案 3 :(得分:0)
在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,然后将其转换为灰色。但是,如果您寻求更直接的方法,则可以使用以下图片:
,因此灰度值为mean(R,G,B),您可以将其计算为:
gray = m + (c + x) / 3
您可以在其中根据图像中的公式计算m,c和x。