Java颜色检测
我希望在Java中实现一项功能,该功能可以读取图像并能够检测红色,蓝色,绿色,黄色等阴影,作为卫星图像分析程序的一部分。因此,例如在标准卫星图像中,蓝色将是水,因此我希望程序读取多少像素是蓝色的,然后它可以说图像的x%是水。
我知道通过读取每个像素的RGB值可以使用整个逻辑语句负载,但是有没有更简单的方法呢?否则,将有数百个if语句,这些语句将花费很长时间来编写,但执行起来也会很长。理想情况下,id像这样:
if (pixelValue = red) { redCounter++;
}
这显然很简单,但是省去了遍历每种可能的RGB组合(红色,蓝色,绿色,黄色,紫色等)的麻烦,这些组合都是某些彩色图像中存在的颜色。
提前致谢。
回答:
无论如何,您都必须阅读每个像素。你可以用
int rgb = bufferedImage.getRGB(x,y);
或者,您可以从图像中获取数据缓冲区,并直接以int[]
数组的形式获取像素(如注释中所述),但是请注意,这可能在以后渲染此图像时对性能产生一些影响。
下一步将是检测像素是否具有某种颜色。说到照片,比较像
if (rgb == Color.BLUE.getRGB()) { ... }
没有任何意义:大多数情况下,像素不会 完美 呈现蓝色。相反,您可以通过将RGB值转换为HSB颜色空间来分析其色调。所以你可以做类似的事情
float hsb[] = new float[3];int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb ) & 0xFF;
Color.RGBtoHSB(r, g, b, hsb);
然后,hsb
阵列将包含颜色的色相,饱和度和亮度。这些值为0到1之间的值。将色相乘以360将获得颜色的“色调”:
饱和度和亮度可用于检测“接近黑色”或“接近白色”的像素。因此,您的最终分析可能大致如下:
if (hsb[1] < 0.1 && hsb[2] > 0.9) nearlyWhite();else if (hsb[2] < 0.1) nearlyBlack();
else {
float deg = hsb[0]*360;
if (deg >= 0 && deg < 30) red();
else if (deg >= 30 && deg < 90) yellow();
else if (deg >= 90 && deg < 150) green();
else if (deg >= 150 && deg < 210) cyan();
else if (deg >= 210 && deg < 270) blue();
else if (deg >= 270 && deg < 330) magenta();
else red();
}
这些嵌套if语句也可以通过使用来避免NavigableMap
其floorEntry
和ceilingEntry
方法,但如果语句可能是更容易明白这里。
以上是 Java颜色检测 的全部内容, 来源链接: utcz.com/qa/398603.html