仓库:MuZiCul/GLR(原创)· 语言:Java (仅依赖 AWT) · 定位:计算图片中"绿色视觉率"(植被覆盖估算)
一个 Java 应用程序:把图片每个像素从 RGB 转到 HLS 色彩空间,判断落在绿色范围内的像素占比,输出"绿色视率"百分比。常用于植被覆盖率估算、绿化检测等场景。
GLR.java 只有一个静态方法:
public class GLR {
public static void GLRsingle(String imgPath, double sf){
double proportion = RGB2HLS.GetRGB(imgPath, sf);
System.out.println("The green visual rate is:" + proportion*100 + "%");
}
public static void main(String[] args) {
GLRsingle("C:\\Users\\Obama\\IdeaProjects\\demo\\...\\greenTest1.png", 0.2);
}
}
路径和缩放因子硬编码在
main()中——这是项目明确的改进点(README 也承认)。
RGB2HLS.GetRGB())public static double GetRGB(String imgPath, double sf){
BufferedImage bufferedImage = ImageUtil.reSize(new File(imgPath), sf, sf);
int height = bufferedImage.getHeight();
int width = bufferedImage.getWidth();
for (int y = 0; y < height; y++){
for (int x = 0; x < width; x++){
Color color = new Color(bufferedImage.getRGB(x, y));
HLS hls = rgb2Hls(color.getRed(), color.getGreen(), color.getBlue());
gg += GetGreen(hls); // 命中绿色 +1
rr++; // 总像素 +1
}
}
return (float) gg / (float) rr;
}
缩放优先:先按缩放因子 sf(如 0.2)缩小图片再逐像素遍历,大幅降低大图处理开销。
public static HLS rgb2Hls(int r, int g, int b) {
float dr = (float) r / 255, dg = (float) g / 255, db = (float) b / 255;
float cmax = Math.max(Math.max(dr, dg), db);
float cmin = Math.min(Math.min(dr, dg), db);
float cdes = cmax - cmin;
float hh, ll, ss;
ll = (cmax + cmin) / 2; // L:亮度 = (max+min)/2
if (cdes > 0) {
// S:饱和度(亮度 ≤ 0.5 与 > 0.5 公式不同)
if (ll <= 0.5) ss = (cmax - cmin) / (cmax + cmin);
else ss = (cmax - cmin) / (2 - cmax - cmin);
if (ll == 0) ss = 0;
// H:色相(按 max 分量所在通道分段计算)
if (cmax == dr) hh = (0 + (dg - db) / cdes) * 60;
else if (cmax == dg) hh = (2 + (db - dr) / cdes) * 60;
else hh = (4 + (dr - dg) / cdes) * 60;
}
...
}
逐像素的标准 HLS 转换数学:L=(max+min)/2,S 分亮度两段计算,H 按主色通道分三段、每段乘 60 度。
README 中给出的判定范围:
| 分量 | 范围 | 含义 |
|---|---|---|
| Hue (H) | 52–152 | HLS 中的绿色区间 |
| Saturation (S) | 0.13–1.0 | 排除灰白(低饱和) |
| Lightness (L) | 0.1–0.9 | 排除纯黑/纯白(极端亮度) |
这是项目的核心设计思想:
(0,255,0) 和 (50,200,50) 差异大,但 HLS 中色相接近GLR/
└── src/main/java/com/example/GLR/
├── GLR.java # 主入口(硬编码路径 + 缩放因子)
├── RGB2HLS.java # RGB→HLS 转换 + 绿色检测 + 主统计
├── ImageUtil.java # 图片缩放工具
└── inputImg/ # 示例测试图像
一个小的图像处理工具。我选了 HLS 而非 RGB 做颜色判定,因为抗光照、阈值直观。自定义实现 RGB→HLS 转换(而非调库)也让算法过程完全透明,适合学习。
README 里声明了仅供教育和实验用途,已知局限我也列出来了。想进阶的话,加上命令行参数(picocli)、批处理、结果导出 CSV 就很实用了。