【问题标题】:OpenCV select gray color rangeOpenCV选择灰色范围
【发布时间】:2019-10-27 11:20:43
【问题描述】:

阅读这些教程(this & this)后,我可以弄清楚如何提取任何颜色范围,包括 RedGreenBlue 黄色,使用 HSV 图像或 OpenCV Mat 的色调值。但是,此值无法描述我需要选择的灰色。那么有没有什么方法可以使用OpenCV提取图像的灰度像素呢?

【问题讨论】:

标签: java opencv


【解决方案1】:

在 HSV/HSL 色彩空间中,灰色像素的特征是饱和度为零或非常接近于零,因此测试将区分黑色到灰色到白色像素。然后值/亮度将告诉您它们实际上从黑色到白色的范围有多远,低亮度/值是深灰色,而高亮度/值意味着浅灰色。

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

【讨论】:

  • 感谢您提供宝贵的信息。我真的知道所有这些,但仍然没有解决问题。我在问如何使用 OPENCV 实现灰度选择!!
【解决方案2】:

经过几次笔记,知道了:

    1234563自己的颜色范围)。
  • 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);

【讨论】:

  • 您可以放心地省略您的hueMask1,因为正如您自己所说,所有色调都在 0..180 范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多