Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenCV选择灰色范围_Java_Opencv - Fatal编程技术网

Java OpenCV选择灰色范围

Java OpenCV选择灰色范围,java,opencv,Java,Opencv,阅读这些教程(&)后,我可以了解如何使用HSV图像或OpenCVMat的色调值提取任何颜色范围,包括红色、绿色、蓝色和黄色。但是,该值无法描述我需要选择的灰色。那么,是否有任何方法可以使用OpenCV提取图像的灰度像素?在HSV/HSL颜色空间中,灰度像素的特征是饱和度为零或非常接近零,因此测试将通过灰度到白色像素来区分黑色。然后,值/亮度将告诉您从黑色到白色的比例到底有多远,低亮度/值表示深灰色,而高亮度/值表示浅灰色 在RGB颜色空间中,灰色像素的特征是所有三个颜色分量相等,即R=G=B.经

阅读这些教程(&)后,我可以了解如何使用
HSV
图像或
OpenCV
Mat的色调值提取任何颜色范围,包括红色、绿色、蓝色和黄色。但是,该值无法描述我需要选择的灰色。那么,是否有任何方法可以使用
OpenCV
提取图像的灰度像素?

在HSV/HSL颜色空间中,灰度像素的特征是饱和度为零或非常接近零,因此测试将通过灰度到白色像素来区分黑色。然后,值/亮度将告诉您从黑色到白色的比例到底有多远,低亮度/值表示深灰色,而高亮度/值表示浅灰色


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

经过几个注释,并且知道:

  • 要从HSV图像通道中获得白色到深灰色,您应该同时具有以下值
    Hue 0到360
    Sat 0到10
    Val 50到100
    (检查以测试您自己的颜色范围)

  • 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);
Mat hueMask1=new Mat();
Mat satMask2=新Mat();
Mat valMask3=新Mat();
Mat white2GrayMask=新Mat();
Imgproc.cvtColor(图像,图像,Imgproc.COLOR_BGR2HSV);
列出频道\u HSV=new ArrayList();
Core.split(图像、频道和HSV);
Core.inRange(通道获取(0)、新标量(0)、新标量(180)、hueMask1);
Core.inRange(通道获取(1)、新标量(0)、新标量(20)、satMask2);
Core.inRange(通道获取(2)、新标量(70)、新标量(255)、valMask3);
按位_和(hueMask1、satMask2、white2GrayMask);
按位_和(white2GrayMask、valMask3、white2GrayMask);

也许可以看看这里的讨论:谢谢@Peter,虽然这不是答案,但它给了我一个想法,感谢您提供的宝贵信息。我真的知道所有这些,但仍然没有解决问题。我在问如何使用OPENCV实现灰色选择!!您可以安全地省略
hueMask1
,因为正如您自己所说,所有色调都在0到180之间。