use*_*280 4 java bufferedimage colors image-processing
我希望在Java中实现一个读取图像的功能,并能够检测出红色,蓝色,绿色,黄色等阴影,作为卫星图像分析程序的一部分.因此,例如在标准卫星图像中,蓝色将是水,因此我希望程序读取多少像素是蓝色,然后它可以说x%的图像是水.
我知道通过读取每个像素的RGB值可以使用整个逻辑语句,但有更简单的方法吗?否则将有数百个if语句需要很长时间才能写入,但也需要很长时间才能执行.理想情况下ID就像这样:
if (pixelValue = red) {
redCounter++;
}
Run Code Online (Sandbox Code Playgroud)
这显然非常简单,但它可以节省必须经历每个可能的RGB组合,红色,蓝色,绿色,黄色,紫色等,这些都是某些彩色图像中存在的所有颜色.
提前致谢.
Mar*_*o13 19
无论如何你必须阅读每个像素.你可以这样做
int rgb = bufferedImage.getRGB(x,y);
Run Code Online (Sandbox Code Playgroud)
或者,您可以从图像中获取数据缓冲区并直接获取像素作为int[]数组(如注释中所述),但请注意,这可能会在以后渲染此图像时对性能产生一些影响.
下一步是检测像素是否具有某种颜色.说到照片,比较一下
if (rgb == Color.BLUE.getRGB()) { ... }
Run Code Online (Sandbox Code Playgroud)
没有意义:在大多数情况下,像素不会是完全蓝色.相反,您可以通过将RGB值转换为HSB颜色空间来分析RGB值的色调.所以你可以做点什么
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);
Run Code Online (Sandbox Code Playgroud)
然后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();
}
Run Code Online (Sandbox Code Playgroud)
使用a NavigableMap及其floorEntry和ceilingEntry方法也可以避免使用这些嵌套的if语句,但if语句在这里可能更容易理解.