OpenCV选择灰色范围

时间:2019-06-12 21:43:20

标签: java opencv

阅读了这些教程(thisthis)之后,我可以弄清楚如何提取任何颜色范围,包括 Red Green Blue Yellow ,使用HSV图像或OpenCV Mat的Hue值。但是,此值无法描述我需要选择的灰色。那么,有什么方法可以使用OpenCV提取图像的灰度像素吗?

2 个答案:

答案 0 :(得分:1)

在HSV / HSL色彩空间中,灰色像素的特征是饱和度为零或非常接近于零,因此测试会将黑色像素从灰色像素区分为白色像素。然后,“值/亮度”将告诉您实际上从黑色到白色的比例尺,“低亮度/值”是深灰色,而“高亮度/值”则是浅灰色。

在RGB色彩空间中,灰色像素的特征在于所有三个颜色分量相等,即R = G = B。

答案 1 :(得分:0)

经过几次笔记,并知道:

  • 要在HSV图像通道中获得白色到深灰色的颜色,您应该同时使用以下值Hue 0 to 360Sat 0 to 10Val 50 to 100(检查this page来测试您自己的颜色范围。

  • OpenCV inRange 功能不支持处理此类HSV颜色组合。

我决定单独在每个通道上应用该范围,然后将3个蒙版的交集放入最终蒙版,该蒙版将代表我的目标白色至深灰色。

请注意,在OpenCV中,H的值介于0到180之间,S和V的值介于0到255之间。因此,您需要将范围映射到这些限制内。

这是我的代码:

Mat hueMask1 = new Mat();
Mat satMask2 = new Mat();
Mat valMask3 = new Mat();
Mat white2GrayMask = new Mat();

Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2HSV);
List<Mat> channels_HSV = new ArrayList<>();
Core.split(image,channels_HSV);

Core.inRange(channels_HSV.get(0),new Scalar(0),new Scalar(180),hueMask1);
Core.inRange(channels_HSV.get(1),new Scalar(0),new Scalar(20),satMask2);
Core.inRange(channels_HSV.get(2),new Scalar(70),new Scalar(255),valMask3);

Core.bitwise_and(hueMask1,satMask2,white2GrayMask);
Core.bitwise_and(white2GrayMask,valMask3,white2GrayMask);