`

java识别照片是彩色还是黑白照

阅读更多
 酷
RGB与HSB  
rgb三个分量的值相等时即为灰度图,值的大小体现了图的灰度。
彩图的颜色就是通过rgb值的差异进行体现的,rgb不等值的情况,只说明这不是完全的灰度图,
或者叫做彩色饱和度不高的彩图,只是肉眼分辨不出来。
为此,要将rgb模式转换为hsb模式再去判断,其中:h色相,s饱和度,b对比度。
转换为hsb后,判断饱和度,如果s<10%即可认为是灰度图,至于这个阈值是10%还是15%,需要根据实际情况来做判断;

 

 

RGB与HSB是什么 
1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为:
2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色.
H(Hue):表示颜色的类型(例如红色,绿色或者黄色).取值范围为0—360.其中每一个值代表一种颜色.
S(Saturation):颜色的饱和度.从0到1.有时候也称为纯度.(0表示灰度图,1表示纯的颜色)
B(Brightness or Value):颜色的明亮程度.从0到1.(0表示黑色,1表示特定饱和度的颜色)

 

RGB到HSV(HSB)的转换 公式

 

 

HSV(HSB)到RGB的转换公式 写道
 

 

代码:

/**
	 * rgb2hsb 单独 RGB转HSB
	 * @param rgbR
	 * @param rgbG
	 * @param rgbB
	 * @return float[]
	 */
	
	public static float[] rgb2hsb(int rgbR, int rgbG, int rgbB) {  
	    assert 0 <= rgbR && rgbR <= 255;  
	    assert 0 <= rgbG && rgbG <= 255;  
	    assert 0 <= rgbB && rgbB <= 255;  
	    int[] rgb = new int[] { rgbR, rgbG, rgbB };  
	    float[] hsb = new float[5];
	    Arrays.sort(rgb);  
	    int max = rgb[2];  
	    int min = rgb[0];  
	  
	    float hsbB = max / 255.0f;  
	    float hsbS = max == 0 ? 0 : (max - min) / (float) max;  
	  
	    float hsbH = 0;  
	    if (max == rgbR && rgbG >= rgbB) {  
	        hsbH = (rgbG - rgbB) * 60f / (max - min) + 0;  
	    } else if (max == rgbR && rgbG < rgbB) {  
	        hsbH = (rgbG - rgbB) * 60f / (max - min) + 360;  
	    } else if (max == rgbG) {  
	        hsbH = (rgbB - rgbR) * 60f / (max - min) + 120;  
	    } else if (max == rgbB) {  
	        hsbH = (rgbR - rgbG) * 60f / (max - min) + 240;  
	    }  
	    hsb[0] = hsbH;
	    hsb[1] = hsbS;
	    hsb[2] = hsbB;
	    return hsb;  
	}  
	  
	/**
	 * hsb2rgb  单独 HSB转RGB
	 * @param h
	 * @param s
	 * @param v
	 * @return int[]
	 */
	public static int[] hsb2rgb(float h, float s, float v) {  
	    assert Float.compare(h, 0.0f) >= 0 && Float.compare(h, 360.0f) <= 0;  
	    assert Float.compare(s, 0.0f) >= 0 && Float.compare(s, 1.0f) <= 0;  
	    assert Float.compare(v, 0.0f) >= 0 && Float.compare(v, 1.0f) <= 0;  
	  
	    float r = 0, g = 0, b = 0;  
	    int i = (int) ((h / 60) % 6);  
	    float f = (h / 60) - i;  
	    float p = v * (1 - s);  
	    float q = v * (1 - f * s);  
	    float t = v * (1 - (1 - f) * s);  
	    switch (i) {  
	    case 0:  
	        r = v;  
	        g = t;  
	        b = p;  
	        break;  
	    case 1:  
	        r = q;  
	        g = v;  
	        b = p;  
	        break;  
	    case 2:  
	        r = p;  
	        g = v;  
	        b = t;  
	        break;  
	    case 3:  
	        r = p;  
	        g = q;  
	        b = v;  
	        break;  
	    case 4:  
	        r = t;  
	        g = p;  
	        b = v;  
	        break;  
	    case 5:  
	        r = v;  
	        g = p;  
	        b = q;  
	        break;  
	    default:  
	        break;  
	    }  
	    return new int[] { (int) (r * 255.0), (int) (g * 255.0),  
	            (int) (b * 255.0) };  
	}  
	

 

 

  

读取一张图片的RGB值  

/**
	 * 读取一张图片的RGB值  
	 * @param image
	 * @return
	 * @throws Exception
	 */
    public static ArrayList<int[]> getImagePixel(File imagefile) throws Exception {  
       
//        File file = new File(image);  
        BufferedImage bi = null;  
        ArrayList<int[]> rgblist = new ArrayList<int[]>();
        try {  
            bi = ImageIO.read(imagefile);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        int width = bi.getWidth();  //返回 BufferedImage 的宽度。
        int height = bi.getHeight();  //返回 BufferedImage 的高度。
        int minx = bi.getMinX();  //返回此 BufferedImage 的最小 x 坐标。
        int miny = bi.getMinY();  //返回此 BufferedImage 的最小 y 坐标。
        System.out.println("width=" + width + ",height=" + height + ".");  
        System.out.println("minx=" + minx + ",miniy=" + miny + ".");  
 //循环遍历添加至list中       
        for (int i = minx; i < width; i++) {  
            for (int j = miny; j < height; j++) {  
            	int[] rgb = new int[5];  //rgb数组
                int pixel = bi.getRGB(i, j); // 下面三行代码将一个数字转换为RGB数字  
                rgb[0] = (pixel & 0xff0000) >> 16;  //AB位
                rgb[1] = (pixel & 0xff00) >> 8;  	//CD位
                rgb[2] = (pixel & 0xff); 			//EF位
                rgb[3] = i;	// x 坐标。
                rgb[4] = j;	//y 坐标。
                rgblist.add(rgb);
//                System.out.println("i=" + i + ",j=" + j + ":(" + rgb[0] + ","  
//                        + rgb[1] + "," + rgb[2] + ")");  
            }  
        }  
        return rgblist;
    }  
 

 源码下载:CheckImageColor.zip

0
1
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java车牌识别

    Java车牌识别技术是一种在计算机视觉领域中的应用,主要用于自动识别图像中的车辆牌照信息。这个Java实现的车牌识别软件提供了一个基础的参考框架,虽然可能不适用于实际生产环境,但可以作为学习和研究的基础。 ...

    GIB 8114的规则,检测器,checker

    GIB 8114的规则,检测器,checker

    Sunny+duan-大模型安全挑战与实践:构建+AI+时代的安全防线.pdf

    Con北京站聚焦技术落地与前沿趋势,核心方向包括: ​​AI工程化​​:端侧推理、RAG增强、多模态生成成为主流; ​​云原生深水区​​:混合云治理、湖仓一体架构、可观测性技术持续迭代; ​​安全与效能​​:大模型安全防御、研发流程标准化、平台工程价值凸显; ​​行业融合​​:物流、金融、社交等领域的技术跨界创新案例丰富。 大会为开发者提供了从理论到实践的全景视角,推动技术向生产力转化。

    shotcut22.06.23.exe

    shotcut22.06.23

    李志伟-端侧大模型的安全建设:如何在算力与保障之间找到平衡.pdf

    Con北京站聚焦技术落地与前沿趋势,核心方向包括: ​​AI工程化​​:端侧推理、RAG增强、多模态生成成为主流; ​​云原生深水区​​:混合云治理、湖仓一体架构、可观测性技术持续迭代; ​​安全与效能​​:大模型安全防御、研发流程标准化、平台工程价值凸显; ​​行业融合​​:物流、金融、社交等领域的技术跨界创新案例丰富。 大会为开发者提供了从理论到实践的全景视角,推动技术向生产力转化。

    基于MATLAB/Simulink的电动汽车转弯制动ABS与DYC联合控制模型

    内容概要:本文详细介绍了利用MATLAB/Simulink构建的电动汽车转弯制动模型,该模型集成了防抱死系统(ABS)和直接横摆力矩控制(DYC)。模型采用7自由度设置,涵盖车身纵向、横向、横摆运动以及四个车轮的旋转自由度。文中重点讨论了轮胎魔术公式的实现、滑移率观测器的设计、滑模控制的应用及其参数调试,并展示了双移线工况下的仿真结果。结果显示,在启用联合控制系统后,车身横摆角显著降低,制动距离缩短,证明了系统的有效性。 适合人群:从事汽车电子控制、自动驾驶技术研发的工程师和技术爱好者。 使用场景及目标:适用于研究电动汽车在极端驾驶条件下(如急转弯、紧急制动)的安全性和稳定性控制策略。目标是提高车辆操控性能,确保行驶安全。 其他说明:建议读者关注模型中的关键参数选择和调试技巧,尤其是轮胎模型参数、滑模控制参数以及电机响应延迟等方面的内容。此外,模型提供了丰富的参考资料,便于深入理解和优化控制算法。

    3dmax插件032-阵列多物体.ms

    3dmax插件

    基于PyTorch的MobileNetV1-UNet图像分割项目:快速部署与高效训练

    内容概要:本文介绍了一个基于PyTorch框架的MobileNetV1-UNet图像分割项目,涵盖了从模型构建、训练到预测的完整流程。该项目利用MobileNetV1的深度可分离卷积作为编码器,结合UNet的经典跳跃连接进行解码,实现了轻量级且高效的语义分割。项目中包含了详细的代码实现,如深度可分离卷积、解码器模块、训练脚本、预测脚本以及数据预处理方法。此外,还介绍了如何应对数据集不均衡的问题,优化训练过程,并提供了一些实用的小技巧,如动态学习率调整、数据增强和后处理方法。最终,项目在街景分割任务中表现出色,能够在较低硬件配置下实现高速推理。 适合人群:具有一定深度学习基础的研究人员和开发者,特别是对图像分割感兴趣的从业者。 使用场景及目标:适用于需要快速搭建图像分割系统的场景,如医疗影像分析、自动驾驶、安防监控等领域。目标是帮助用户快速上手并应用于实际项目中,提高开发效率。 其他说明:项目已准备好完整的数据集和预训练模型,用户只需解压即可开始训练和预测。代码经过精心优化,在常见GPU上能够稳定运行,适合初学者和有一定经验的开发者使用。

    信捷触摸屏与士林变频器Modbus通讯实战指南:硬件接线、参数配置及常见问题解决方案

    内容概要:本文详细介绍了信捷触摸屏与士林变频器通过Modbus RTU协议进行通讯的方法和注意事项。首先,强调了正确的硬件接线方法,如使用双绞线并在适当情况下增加120Ω终端电阻。其次,详细解释了参数配置的具体步骤,包括波特率、站号、数据格式等设置。接着,提供了读写频率和其他重要参数的代码实现,并指出了常见的地址偏移和数据格式转换问题。最后,针对通讯超时等问题提出了具体的排查方法和解决方案。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些负责触摸屏与变频器通讯调试工作的人员。 使用场景及目标:帮助工程师快速定位和解决信捷触摸屏与士林变频器之间的通讯问题,提高工作效率,减少调试时间和成本。 其他说明:文中还提供了一些实用的小技巧,如使用Modscan工具进行初步测试,以及通过报文抓取法分析通讯数据,有助于更好地理解和解决问题。

    Delphi 12.3控件之TextShaping4Delphi-main.zip

    Delphi 12.3控件之TextShaping4Delphi-main.zip

    LabVIEW 2018纯软件波形发生器:基于事件结构与生产者-消费者模式的多波形生成与噪声叠加

    内容概要:本文详细介绍了使用LabVIEW 2018构建一个纯软件波形发生器的方法。该波形发生器能够生成四种基本波形(正弦波、方波、三角波、锯齿波),并且可以通过参数设置进行实时调整。此外,还可以向波形中加入噪声,模拟真实环境中的信号。文中详细解释了波形生成的核心算法、噪声叠加的技术细节以及波形显示的优化方法。通过事件结构和生产者-消费者模式实现了高效的参数联动和实时波形更新。 适合人群:对LabVIEW有一定了解的工程师和技术爱好者,尤其是从事信号处理和仿真工作的专业人士。 使用场景及目标:适用于需要生成各种波形用于实验、教学或产品研发的场合。主要目标是帮助用户掌握LabVIEW中波形生成的基本原理和技术细节,提高波形生成的灵活性和实用性。 其他说明:文中提供了许多调试经验和优化技巧,如参数联动、噪声合成、波形图刷新等方面的注意事项,有助于用户更好地理解和应用LabVIEW进行波形生成。

    FPGA图像处理:MIPI CSI-2接收、Debayer转换及USB3.0 UVC传输的实现与优化

    内容概要:本文详细介绍了基于Lattice MachXO3LF-690 FPGA的MIPI相机系统的实现,涵盖MIPI CSI-2接收、Debayer转换、RGB转YUV以及USB3.0 UVC传输等多个关键技术环节。首先,MIPI CSI-2接收部分通过状态机解析RAW10数据流并进行字节对齐,确保数据正确传输。其次,Debayer模块采用梯度插值法和乒乓缓存结构,优化资源利用率并提高处理速度。接着,RGB转YUV模块使用定点数运算代替浮点运算,减少逻辑资源消耗。最后,FX3014的UVC传输部分实现了动态帧率控制和带宽管理,确保不同分辨率下的稳定传输。文中还分享了多个调试经验和优化技巧,如动态FIFO控制、帧率控制策略等。 适合人群:具备一定FPGA开发经验的工程师和技术爱好者,特别是对图像处理和高速数据传输感兴趣的读者。 使用场景及目标:适用于希望深入了解FPGA图像处理流程的技术人员,帮助他们掌握从传感器数据接收、图像处理到USB传输的全流程实现方法,提升系统性能和稳定性。 其他说明:文中提供了详细的Verilog代码片段和架构图解,便于读者理解和实践。此外,还提到了一些常见的调试问题及其解决方案,有助于加速项目开发进程。

    基于LabVIEW的多设备并行控制系统设计与实现

    内容概要:本文详细介绍了使用LabVIEW开发的一个多设备并行控制系统,主要应用于工业自动化领域。系统能够同时控制六台烘干设备,并支持不停机扩展新设备。核心技术包括利用子面板(Subpanel)实现动态加载设备界面,通过Modbus TCP/IP协议与PLC通信,以及采用事件结构实现控制权切换等功能。文中还分享了一些调试经验和性能优化技巧,如内存管理和通信稳定性等方面的问题及其解决方案。 适合人群:对LabVIEW编程有一定基础,从事工业自动化控制系统的开发人员和技术爱好者。 使用场景及目标:适用于需要在同一上位机上同时监控和控制多台设备的应用场合,旨在提高操作效率,减少人工干预,确保系统稳定性和扩展性。 其他说明:文中提到的一些具体实现细节和技术难点对于理解和掌握LabVIEW编程非常有帮助,尤其是关于多实例并行处理的部分。此外,作者还提到了一些常见的错误案例及其修正方法,有助于读者规避类似问题。

    1.6 技能提升:设计一份个人简历.rp

    1.6 技能提升:设计一份个人简历.rp

    MATLAB/Simulink仿真:交直流微电网中光伏、蓄电池、风机的并离网切换与虚拟同步发电机技术

    内容概要:本文详细介绍了如何在MATLAB/Simulink环境中对交直流微电网进行仿真,涵盖了光伏、风机和蓄电池的建模方法及其在不同运行模式下的控制策略。具体包括光伏系统的MPPT控制、风机的变桨距控制、蓄电池的充放电管理、并离网切换的逻辑控制以及虚拟同步发电机技术的应用。通过这些仿真实验,可以深入理解微电网的工作原理和技术难点,为实际工程应用提供了宝贵的参考。 适合人群:从事电力系统、新能源技术和自动化控制领域的研究人员和工程师,尤其是对微电网仿真感兴趣的初学者和有一定经验的研发人员。 使用场景及目标:适用于高校科研项目、企业技术研发部门等场合,旨在帮助用户掌握微电网仿真技术,优化系统设计,提高微电网的稳定性和可靠性。 其他说明:文中提供了大量具体的MATLAB/Simulink代码示例,便于读者理解和实践。同时,作者分享了许多个人经验和调试技巧,有助于解决常见问题,提升仿真的成功率。

    3dmax插件021-一键路牙.ms

    3dmax插件

    基于一阶RC模型与FFRLS+EKF算法的电池SOC在线联合估计Matlab实现

    内容概要:本文详细介绍了利用一阶RC模型结合带遗忘因子的递推最小二乘(FFRLS)和扩展卡尔曼滤波(EKF)算法,在Matlab中实现电池SOC(荷电状态)的在线联合估计。首先,FFRLS用于实时更新电池模型参数(如R0、R1、C1),以适应电池老化和时变特性。接着,EKF用于精确估计SOC,通过OCV-SOC曲线和状态方程进行预测和更新。文中还讨论了参数初始化、采样周期设置、温度补偿以及常见错误避免等问题,并提供了详细的代码片段和调试建议。 适合人群:从事电池管理系统研究与开发的技术人员,尤其是有一定Matlab编程基础的研究人员。 使用场景及目标:适用于电动汽车、储能系统等领域,旨在提高电池SOC估计精度,确保电池安全高效运行。具体目标包括降低SOC估计误差、增强算法鲁棒性和适应不同工况条件。 其他说明:文章强调了参数估计和状态估计之间的相互影响,提出了双线程配合的工作方式。此外,还分享了一些实践经验,如参数初始化、采样周期的选择、温度补偿等,帮助读者更好地理解和应用这一方法。

    关于人工智能大模型的几点思考.pdf

    AI基础大模型 单模态向多模态发展:AI从单一类型的输入(如文本)转向能够处理多种类型的数据(如文本、音频、图像和视频)。 具体应用实例: ChatGPT实现了类似人类的文本交互能力。 Midjourney AIGC画作《太空歌剧院》获得艺术比赛冠军。 阿里云I2VGen-XL模型可以从一张图片生成高清视频。 行业+AI 报告指出AI正在加速多个行业的智能化升级,包括金融、医疗、智能制造、司法、汽车、气象等领域,并列举了具体的案例和成就,例如药物研发周期的显著缩短和工业质检准确率的提升。 数据预处理与模型训练 强调了数据预处理在AI模型训练中的重要性,并指出现有分布式文件系统在可扩展性和低延迟方面面临的挑战。 提出了解决方案,如以数据为中心的执行模式和诸葛弩大数据处理引擎的设计理念,旨在降低数据处理开销和提高效率。 国产算力的发展 报告提到中国AI内循环加速的到来,强调了国家力量在推动智能计算中心建设方面的角色,并设定了国产算力使用占比的目标,如上海到2025年新建智算中心国产算力使用占比超50%。 大规模模型训练技术 描述了“八卦炉”等支撑国产AI算力的基础软件集的发展情况,以及它们如何支持大规模模型训练任务,包括北京智源研究院悟道2.0、阿里巴巴M6大模型等。 总结 报告展示了AI大模型技术的进步如何推动各行业变革,同时提出了面对的技术挑战和解决方案,特别是针对国内算力的发展方向和策略。通过这些进展,可以看出AI不仅改变了传统行业的工作方式,还为科学研究提供了新的工具和方法。

    徐鹏_FinClip:技术与生态双轮驱动的鸿蒙之路.pdf

    Con北京站聚焦技术落地与前沿趋势,核心方向包括: ​​AI工程化​​:端侧推理、RAG增强、多模态生成成为主流; ​​云原生深水区​​:混合云治理、湖仓一体架构、可观测性技术持续迭代; ​​安全与效能​​:大模型安全防御、研发流程标准化、平台工程价值凸显; ​​行业融合​​:物流、金融、社交等领域的技术跨界创新案例丰富。 大会为开发者提供了从理论到实践的全景视角,推动技术向生产力转化。

Global site tag (gtag.js) - Google Analytics