阅读了这些教程(this和this)之后,我可以弄清楚如何提取任何颜色范围,包括 Red , Green , Blue 和 Yellow ,使用HSV
图像或OpenCV
Mat的Hue值。但是,此值无法描述我需要选择的灰色。那么,有什么方法可以使用OpenCV
提取图像的灰度像素吗?
答案 0 :(得分:1)
在HSV / HSL色彩空间中,灰色像素的特征是饱和度为零或非常接近于零,因此测试会将黑色像素从灰色像素区分为白色像素。然后,“值/亮度”将告诉您实际上从黑色到白色的比例尺,“低亮度/值”是深灰色,而“高亮度/值”则是浅灰色。
在RGB色彩空间中,灰色像素的特征在于所有三个颜色分量相等,即R = G = B。
答案 1 :(得分:0)
经过几次笔记,并知道:
要在HSV图像通道中获得白色到深灰色的颜色,您应该同时使用以下值Hue 0 to 360
,Sat 0 to 10
和Val 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);