最近看了好多图像识别的例子,但是发现基本全是用Python写的,但是我们这里的需求是使用Java来写,至此,随手写几个函数,发出来供大家参考!

目录

1.RGB & HSV & HLS英文全称及解释

2.RGB转HSV

3.HSV转RGB

4.RGB HSV HLS三种色彩模式转换(C语言实现)

5.RGB转HLS并获取绿视绿(JAVA语言实现)


1.RGB & HSV & HLS英文全称及解释

        RGB - Red, Green, Blue,是工业界的一种颜色标准。

        HSV - Hue, Saturation, Value,是根据颜色的直观特性。

        HLS - HTTP Live Streaming,Apple的动态码率自适应技术。

2.RGB转HSV

  max=max(R,G,B) min=min(R,G,B) if R = max, H = (G-B)/(max-min) if G = max, H = 2 + (B-R)/(max-min) if B = max, H = 4 + (R-G)/(max-min) H = H * 60 if H < 0, H = H + 360 V=max(R,G,B) S=(max-min)/max

3.HSV转RGB

 if s = 0 R=G=B=V else H /= 60; i = INTEGER(H) f = H - i a = V * ( 1 - s ) b = V * ( 1 - s * f ) c = V * ( 1 - s * (1 - f ) ) switch(i) case 0: R = V; G = c; B = a; case 1: R = b; G = v; B = a; case 2: R = a; G = v; B = c; case 3: R = a; G = b; B = v; case 4: R = c; G = a; B = v; case 5: R = v; G = a; B = b;

4.RGB HSV HLS三种色彩模式转换(C语言实现)


void RGB2HSV( uint16_t * h, uint16_t * s, uint16_t * v, uint8_t r, uint8_t g, uint8_t b)
{double rr, gg, bb;double hh, ss, vv;double cmax, cmin, cdes;rr = r;gg = g;bb = b;cmax = (rr > gg) ? rr : gg;if (bb > cmax) {cmax = bb;}cmin = (rr < gg) ? rr : gg;if (bb < cmin) {cmin = bb;}cdes = cmax - cmin;vv = cmax;if (cdes != 0) {ss = cdes * SCALE / cmax;if (cmax == rr) {hh = (gg - bb) * SCALE / cdes;}else if (cmax == gg) {hh = (bb - rr) * SCALE / cdes + 2 * H_SCALE;}else {hh = (rr - gg) * SCALE / cdes + 4 * H_SCALE;}}else if (cmax != 0) {ss = cdes * SCALE / cmax;hh = 0;}else {ss = 0;hh = 0;}if (hh < 0) {hh += 6 * H_SCALE;}*h = hh * H_GETA;*s = ss * H_GETA;*v = vv * H_GETA;
}void HSV2RGB( uint8_t *r, uint8_t *g, uint8_t *b, uint16_t h, uint16_t s, uint16_t v)
{double rr = 0, gg = 0, bb = 0;double hh, ss, vv;if (h == 6 * H_GETA * H_SCALE) {h = 0;}hh = (double)h / H_GETA;ss = (double)s / GETA;vv = (double)v / GETA;switch((int)(hh / H_SCALE)) {case 0:rr = SCALE;gg = hh;bb = 0;break;case 1:rr = 2 * H_SCALE - hh;gg = SCALE;bb = 0;break;case 2:rr = 0;gg = SCALE;bb = hh - 2 * H_SCALE;break;case 3:rr = 0;gg = 4 * H_SCALE - hh;bb = SCALE;break;case 4:rr = hh - 4 * H_SCALE;gg = 0;bb = SCALE;break;case 5:rr = SCALE;gg = 0;bb = 6 * H_SCALE - hh;break;}rr = (rr + (SCALE - rr) * (SCALE - ss) / SCALE) * vv / SCALE;gg = (gg + (SCALE - gg) * (SCALE - ss) / SCALE) * vv / SCALE;bb = (bb + (SCALE - bb) * (SCALE - ss) / SCALE) * vv / SCALE;*r = rr;*g = gg;*b = bb;if (*r > 255)*r = 255;if (*g > 255)*g = 255;if (*b > 255)*b = 255;
}void RGB2HLS( double *h, double *l, double *s, uint8_t r, uint8_t g, uint8_t b)
{double dr = (double)r/255;double dg = (double)g/255;double db = (double)b/255;double cmax = MAX(dr, MAX(dg, db));double cmin = MIN(dr, MIN(dg, db));double cdes = cmax - cmin;double hh, ll, ss;ll = (cmax+cmin)/2;if(cdes){if(ll <= 0.5)ss = (cmax-cmin)/(cmax+cmin);elsess = (cmax-cmin)/(2-cmax-cmin);if(cmax == dr)hh = (0+(dg-db)/cdes)*60;else if(cmax == dg)hh = (2+(db-dr)/cdes)*60;else// if(cmax == b)hh = (4+(dr-dg)/cdes)*60;if(hh<0)hh+=360;}elsehh = ss = 0;*h = hh;*l = ll;*s = ss;
}void HLS2RGB( uint8_t *r, uint8_t *g, uint8_t *b, double h, double l, double s)
{double cmax,cmin;if(l <= 0.5)cmax = l*(1+s);elsecmax = l*(1-s)+s;cmin = 2*l-cmax;if(s == 0){*r = *g = *b = l*255;}else{*r = HLS2RGBvalue(cmin,cmax,h+120)*255;*g = HLS2RGBvalue(cmin,cmax,h)*255;*b = HLS2RGBvalue(cmin,cmax,h-120)*255;}
}double HLS2RGBvalue(double n1,double n2, double hue)
{if(hue > 360)hue -= 360;else if(hue < 0)hue += 360;if(hue < 60)return n1+(n2-n1)*hue/60;else if(hue < 180)return n2;else if(hue < 240)return n1+(n2-n1)*(240-hue)/60;elsereturn n1;
}

5.RGB转HLS并获取绿视绿(JAVA语言实现)

RGB2HLS.java

package com.example.GLR;import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;public class RGB2HLS {static class HLS {float H, L, S;/*** 定义HLS返回类* @param H h* @param L l* @param S s*/public HLS(float H, float L, float S) {this.H = H;this.L = L;this.S = S;}}/*** 获取图片RGB* @param imgPath 文件路径* @param sf 压缩率* @return*/public static double GetRGB(String imgPath, double sf){BufferedImage bufferedImage;int r,g,b;int height,width;int gg = 0, rr= 0;bufferedImage= ImageUtil.reSize(new File(imgPath),sf,sf);assert bufferedImage != null;height = bufferedImage.getHeight();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));r=color.getRed();g = color.getGreen();b = color.getBlue();HLS hls = rgb2Hls(r,g,b);gg +=GetGreen(hls);rr++;}}return (float) gg / (float) rr;}/*** RGB2HLS** @param r r* @param g g* @param b b* @return*/public static HLS rgb2Hls(int r, int g, int b) {float dr = (float)r/(float)255;float dg = (float)g/(float)255;float db = (float)b/(float)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)/(float)2;if(cdes>0){if(ll <= 0.5)ss = (cmax-cmin)/(cmax+cmin);elsess = (cmax-cmin)/(2-cmax-cmin);if (ll==0)ss =0;if(cmax == dr) {hh = (0 + (dg - db) /  cdes) * 60;ss = 0;}else if(cmax == dg)hh = (2+(db-dr)/cdes)*60;elsehh = (4+(dr-dg)/cdes)*60;if(hh<0)hh+=360;}else {hh =ss = 0;}return new HLS(hh, ll, ss);}/*** 获取绿视率* @param hls hls* @return*/public static int GetGreen(HLS hls){float hh = hls.H;float ss = hls.S;float ll = hls.L;if ((57 <= hh && hh <= 152) && (0.13 <= ss && ss <=1) && (0.1 <= ll && ll <= 0.9)){return 1;}elsereturn 0;}
}

ImageUtil.java

package com.example.GLR;import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;public class ImageUtil {/*** @param srcImg  原图片* @param sx      缩放率* @param sy      缩放率* @return*/public static BufferedImage reSize(File srcImg, double sx, double sy) {String type = getImageType(srcImg);if (type == null || sx < 0 || sy < 0) {return null;}BufferedImage srcImage;try {srcImage = ImageIO.read(srcImg);} catch (IOException e) {e.printStackTrace();return null;}// targetW,targetH分别表示目标长和宽BufferedImage target;double width =  sx * srcImage.getWidth();double height =  sy * srcImage.getHeight();ColorModel cm = srcImage.getColorModel();WritableRaster raster = cm.createCompatibleWritableRaster((int) width, (int) height);boolean alphaPremultiplied = cm.isAlphaPremultiplied();target = new BufferedImage(cm, raster, alphaPremultiplied, null);Graphics2D g = target.createGraphics();// smoother than exlax:g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g.drawRenderedImage(srcImage, AffineTransform.getScaleInstance(sx, sy));g.dispose();return target;}/*** 获取文件后缀不带.** @param file 文件后缀名* @return*/private static String getImageType(File file) {if (file != null && file.exists() && file.isFile()) {String fileName = file.getName();int index = fileName.lastIndexOf(".");if (index != -1 && index < fileName.length() - 1) {return fileName.substring(index + 1);}}return null;}
}

GRL.java

package com.example.GLR;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\\src\\main\\java\\com\\example\\GLR\\inputImg\\greenTest1.png",0.2);}
}

JAVA编写RGB转HLS,RGB转HSV,HSV转RGB,RGB HLS HSV三种模式转换相关推荐

  1. Linux -- vi和vim编辑器(编写Hello.java程序,三种模式的转换,常用快捷键练习)

    文章目录 1. vi和vim编辑器 1.1 vi和vim编辑器介绍 1.2 vi和vim的三种常见模式 1.3 快速入门案例:使用`vim`开发一个`Hello.java`程序 1.3.1 建立 `H ...

  2. Java 判断密码是否是大小写字母、数字、特殊字符中的至少三种

    Java 判断密码是否是大小写字母.数字.特殊字符中的至少三种public class CheckPassword {//数字public static final String REG_NUMBER ...

  3. Java动物类enjoy方法打印_Java反射学习-2 - 获取Class对象的三种方式

    1 packagecn.tx.reflect;2 3 importjava.lang.reflect.Constructor;4 importjava.lang.reflect.Field;5 imp ...

  4. java list移除符合条件的元素_java List删除指定元素的三种方法

    java List删除指定元素有3种方法,分别是普通for循环,增强for循环以及原生的Iterator迭代器循环来删除list中指定的某个元素,非常的简单. 1:普通for循环遍历list,并删除指 ...

  5. RGB HSV HLS三种色彩模式转换(C语言实现)

    Android项目上处理图像的代码(注释全部去掉) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...

  6. 如何在IDEA上编写Spark程序?(本地+集群+java三种模式书写代码)

    本篇博客,Alice为大家带来关于如何在IDEA上编写Spark程序的教程. 文章目录 写在前面 准备材料 图解WordCount pom.xml 本地执行 集群上运行 Java8版[了解] 写在前面 ...

  7. java快速寻找一个数组的最大值或最小值, min, max,三种方法

    java 中 寻找一个数组中的最大值或最小,除了自己专门编写一个 min 或 max 函数外,还有几种方式方便使用. 1. 使用 stream 将一个数组放进 stream 里面,然后直接调用 str ...

  8. java基于jxl.jar包生成Excel文件到指定目录和服务器下载两种模式的使用方法

    导入jxl包 import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableCe ...

  9. java输出链表的值_[剑指offer] 从尾到头打印链表(三种方法) java

    一.每次把新遍历的链表值放到list索引为0的位置,实现逆序. public class Solution { public ArrayList printListFromTailToHead(Lis ...

最新文章

  1. 2018-4-8蚁群算法---包子阳《智能优化算法以及Matlab实现》第五章
  2. Oracle: 三、Oracle的隐藏事务与视图的创建
  3. GraphPad Prism 教程,如何在坐标上放置2条生存曲线
  4. DjangoORM增删改查
  5. mysql 备份成文件的脚本_Mysql自动全量备份脚本
  6. 【JEECG Docker安装】CentOS6下docker的安装和使用
  7. 小程序进入页面图片渲染会拉伸闪下变形优化bug
  8. idea新建web项目并配置运行教程
  9. Python实现对nginx日志access.log统计
  10. 拓端tecdat|R语言Copula的贝叶斯非参数估计
  11. 一封没有读出来的感谢信,勾勒出蔡文胜30年创业史!
  12. 微信小程序 组件传值(二) triggerEvent 子传父
  13. 183名中国学者入选2016全球高引作者榜 | 数据分析
  14. empty怎么发音_empty怎么读什么意思
  15. FITC-TAT-Smad7-HA融合蛋白,荧光素标记TAT-Smad7-HA融合蛋白
  16. 【黑客编程】手把手教你编写POC
  17. Spark 提交执行源码学习
  18. Gooxi国产化服务器专题介绍之海光服务器
  19. futuretask java 并发请求_【Java并发】Runnable、Callable、Future、FutureTask
  20. Linux(6)RedHat7 基本命令五-hwclock(clock)命令详解

热门文章

  1. breed web控制台——刷老毛子(padavan)路由器固件
  2. 美图大数据平台架构实践
  3. 微信公众号文章采集获取方案附接口说明-文章阅读点赞在看数获取工具接口
  4. 地暖品牌:保利地暖管道系统介绍
  5. 【灵性的觉醒】复活节的精神之旅
  6. [siggraph13]《使命召唤:黑色行动2》的光照技术
  7. 关于区块链及其与物联网的集成-挑战与机遇
  8. MinIO实现分布式文件服务
  9. python产生随机密码
  10. 万字总结 Python 构建指南与设计模式概览