基于 OpenCV 与 Java 两个语言版本实现获取某一图片特定区域的颜色对比度

news2024/11/25 23:35:37

本文目录

  • 一、什么是对比度
  • 二、什么是颜色直方图
  • 三、如何通过RGB计算颜色对比度
    • 什么是HSV、Lab颜色空间
  • 四、OpenCV代码
  • 五、Java代码
    • 5.1 平滑处理
    • 5.2 完整代码

一、什么是对比度

对比度是指图像中不同区域之间的明暗差异程度,它是图像质量中的重要指标之一。除了颜色对比度之外,常见的对比度包括:

1、亮度对比度(Brightness Contrast):指图像中不同区域之间的亮度差异程度。计算方法可以使用像素灰度值的标准差或方差来描述。

2、方向对比度(Orientation Contrast):指图像中不同方向区域之间的差异程度。例如,某些图像中有明显的纹理或线条方向,可以通过计算不同方向的图像灰度值差异来描述图像的方向对比度。

3、空间对比度(Spatial Contrast):指图像中不同空间区域之间的差异程度。例如,在自然风光图像中,不同区域的颜色和纹理通常具有空间分布特性,可以通过计算局部对比度来描述这种特性。

4、颜色对比度是指图像中不同颜色区域之间的明显差异程度。在计算机视觉和图像处理中,颜色对比度通常用于描述彩色图像中不同区域之间的颜色差异,可以通过计算颜色空间中的颜色距离来度量。

这些对比度指标通常可以用于图像质量评价、图像增强和图像分割等领域。其中,颜色对比度和亮度对比度是最常用的对比度指标。

二、什么是颜色直方图

颜色直方图是一种描述图像中颜色分布情况的统计方法。它可以将图像中每个像素的颜色按照一定的规则进行分组,并计算出每个颜色组中包含的像素数量,最终得到一个表示颜色分布的直方图。

通常情况下,颜色直方图是针对彩色图像中的每个颜色通道(如红色、绿色、蓝色)分别计算的,因此可以得到三个独立的直方图。这些直方图可以用来描述图像中的颜色分布情况,比如哪些颜色比较常见、哪些颜色比较稀少等等。

颜色直方图在计算机视觉领域有广泛的应用,例如图像检索、目标识别、图像分割、图像增强等等。

三、如何通过RGB计算颜色对比度

计算RGB图像的颜色对比度,可以使用颜色直方图的方法。以下是基于RGB颜色空间计算颜色对比度的方法:

1、将RGB图像转换为灰度图像。
2、计算灰度图像的颜色直方图。
3、将颜色直方图进行归一化,即将所有的像素值缩放到0-1之间。
4、计算颜色对比度,通常使用方差(Variance)的计算方法,其公式如下:
在这里插入图片描述

其中, N N N表示颜色直方图的总大小, p i p_i pi表示第 i i i个像素的归一化值, p ˉ \bar{p} pˉ表示所有像素的平均归一化值。

这样就可以通过RGB颜色空间计算颜色对比度了。需要注意的是,RGB颜色空间的颜色对比度计算方法只适用于灰度图像,如果需要计算彩色图像的颜色对比度,则需要先将图像转换到HSV或Lab颜色空间,再进行计算。

什么是HSV、Lab颜色空间

HSV和Lab颜色空间是两种常用的颜色模型,它们分别描述了颜色的色相、饱和度、亮度和颜色的明暗、红绿蓝等属性,可以用于图像处理和计算机视觉等领域。

HSV颜色空间(Hue, Saturation, Value)是一种基于人类视觉感知的颜色模型,其中色相(Hue)表示颜色的色调,取值范围为0-360度;饱和度(Saturation)表示颜色的鲜艳程度,取值范围为0-1;亮度(Value)表示颜色的明暗程度,取值范围为0~1。HSV颜色空间可以通过RGB颜色空间转换得到,其优点是可以方便地调整图像的颜色和亮度,例如可以通过改变亮度值来实现图像的调整和增强。

Lab颜色空间(Lab*)是一种用于描述颜色的三维空间,其中L表示明度(Lightness),取值范围为0100;a表示从红色到绿色的颜色值,取值范围为-128-127;b表示从黄色到蓝色的颜色值,取值范围为-128~127。Lab颜色空间是一种与设备无关的颜色模型,可以描述出更广泛的颜色范围,适用于图像处理、颜色匹配和图像检索等领域。在计算Lab颜色空间中颜色距离时,通常使用CIEDE2000色差公式计算,可以更好地匹配人眼的视觉感知。

HSV和Lab颜色空间在不同的领域中有不同的应用,例如在计算机视觉中,可以使用HSV颜色空间进行目标检测和跟踪,使用Lab颜色空间进行图像匹配和检索。

GB、HSV和Lab颜色空间都是用于描述彩色图像的颜色模型,而灰度图像则是一种仅包含亮度信息的图像。

在灰度图像中,每个像素仅包含一个灰度值,表示该像素的亮度信息,通常取值范围为0~255,其中0表示黑色,255表示白色,其它数值表示不同亮度级别的灰色。因此,灰度图像中的每个像素可以用一个单独的字节表示,所以灰度图像具有较小的存储空间和计算成本。

相比之下,彩色图像需要存储RGB、HSV或Lab三个通道中的每个像素值,因此需要更大的存储空间和计算成本。但是,彩色图像包含了更丰富的颜色信息,可以更好地反映图像的色彩和亮度变化。在某些领域,如计算机视觉、图像处理和医学图像等,彩色图像比灰度图像更适合用于分析和处理。

总之,灰度图像只包含亮度信息,而彩色图像则包含颜色和亮度信息,彩色图像可以更好地反映图像的色彩和亮度变化,但需要更大的存储空间和计算成本。

四、OpenCV代码

import cv2
import numpy as np

def get_contrast(img, x1, y1, x2, y2):
    # 获取选定区域的颜色直方图
    roi = img[y1:y2, x1:x2]
    hist = cv2.calcHist([roi], [0], None, [256], [0, 256])

    # 计算颜色对比度
    hist_norm = cv2.normalize(hist, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
    contrast = np.sum((hist_norm - np.mean(hist_norm)) ** 2) / len(hist_norm)

    return contrast

# 读取图片
img = cv2.imread("image.jpg")

# 显示图片,用户可以用鼠标在图片上选择区域
cv2.imshow("image", img)
rect = cv2.selectROI("image", img, False)
cv2.destroyAllWindows()

# 计算选定区域的颜色对比度
x1, y1, w, h = rect
x2, y2 = x1 + w, y1 + h
contrast = get_contrast(img, x1, y1, x2, y2)

# 输出结果
print("选定区域的颜色对比度为:", contrast)

这个程序首先使用cv2.imread()函数读取输入的图片,然后使用cv2.selectROI()函数让用户在图片上选择感兴趣的区域。选定区域后,程序调用get_contrast()函数计算该区域的颜色对比度。最后,程序输出结果。get_contrast()函数中,我们使用cv2.calcHist()函数计算选定区域的颜色直方图,然后计算颜色对比度。

五、Java代码

5.1 平滑处理

平滑化处理,也称为平滑滤波,是一种常见的图像处理技术,主要用于减少图像中的噪声、平滑图像、模糊化图像等。该方法的基本思路是通过对图像中每个像素周围的邻域像素进行加权平均来降低图像中的高频成分,从而使图像变得更加平滑、连续,减少噪声对图像的影响。

在平滑化处理中,常用的方法包括均值滤波、高斯滤波、中值滤波等。这些方法的具体实现方式不同,但都能有效地减少图像中的噪声,并使图像变得更加平滑,从而方便后续的图像处理操作。

5.2 完整代码

try {
    File file = new File("image.jpg");
    BufferedImage image = ImageIO.read(file);
    int width = image.getWidth();
    int height = image.getHeight();
    int minx = image.getMinX();
    int miny = image.getMinY();
    // 首先读入图片,然后指定区域。
    
    System.out.println("width=" + width + ", height=" + height + ".");
    System.out.println("minx=" + minx + ", miny=" + miny + ".");
    
    for (int i = minx; i < width; i += 5) {
        flag = 1;
        for (int j = miny; j < height; j += 1) {
            flag = 1;
            int pixel = image.getRGB(i, j);
            int r1 = (pixel & 0xff0000) >> 16;
            int g1 = (pixel & 0xff00) >> 8;
            int b1 = (pixel & 0xff);
            // System.out.println(i+"=i,"+j+"=j,("+rgb1[0]+","+rgb1[1]+","+rgb1[2]+")");
            // 获取每个像素点的RGB。
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

public double luminanace(int r, int g, int b) {
    double[] a = {r / 255.0, g / 255.0, b / 255.0};
    for (int i = 0; i < a.length; i++) {
        a[i] = a[i] <= 0.03928 ? a[i] / 12.92 : Math.pow((a[i] + 0.055) / 1.055, 2.4);
    }
    return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
}

public double getContrast(BufferedImage image, int x1, int y1, int x2, int y2) {
    int pixel1 = image.getRGB(x1, y1);
    int r1 = (pixel1 & 0xff0000) >> 16;
    int g1 = (pixel1 & 0xff00) >> 8;
    int b1 = (pixel1 & 0xff);

    int pixel2 = image.getRGB(x2, y2);
    int r2 = (pixel2 & 0xff0000) >> 16;
    int g2 = (pixel2 & 0xff00) >> 8;
    int b2 = (pixel2 & 0xff);

    double lum1 = luminanace(r1, g1, b1);
    double lum2 = luminanace(r2, g2, b2);

    double brightest = Math.max(lum1, lum2);
    double darkest = Math.min(lum1, lum2);

    return (brightest + 0.05) / (darkest + 0.05);
}

这段代码是计算颜色对比度的公式。其中,luminance(r,g,b)是将RGB颜色空间下的颜色值转换为亮度值,采用的是sRGB彩色空间中的标准转换公式。对于每个颜色通道的值r、g、b,首先将它们归一化到0~1的范围内,然后根据其大小关系,采用不同的公式进行转换。最终将R、G、B三个通道的亮度值按一定的比例相加,得到一个灰度值,表示该像素的亮度信息。

接下来,代码中使用了亮度值计算颜色对比度的公式,即将两个像素的亮度值进行比较,得到最亮的和最暗的像素的亮度值,并计算它们的比值,用来表示颜色对比度的强弱程度。其中,为了防止计算过程中出现0的情况,加上了一个较小的常数0.05作为平滑处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java的Map集合说明及方法demo示例

一、Map集合的特点&#xff1a;Map集合的特点&#xff1a;1.Map是一个双列集合&#xff0c;一个元素包含两个值&#xff08;一个key&#xff0c;一个value&#xff09;2.Map集合中的元素&#xff0c;key和value的数据类型可以相同&#xff0c;也可以不同3.Map中的元素&#xff…

概率论小课堂:泊松分布(完善你对随机性的认识,特别是对风险防范的认识)

文章目录 引言I 泊松分布1.1 概率计算公式1.2 应对随机性,需要的冗余比平均值要大1.3 池子越大,越能抵消随机性带来的误差引言 伯努利试验:解释了随机事件的发生概率在理论和现实中的差距泊松分布:进一步完善你对随机性的认识,特别是对风险防范的认识。另一类特殊的伯努利…

11.Maxwell 部署

Maxwell 部署 一、环境准备 1、确保服务器上已经安装好了zookeeper、kafka、MySQL软件&#xff1b; &#xff08;1&#xff09;启动zookeeper: /usr/app/zookeeper3.4/bin/zkServer.sh start&#xff08;2&#xff09;启动三台主题的kafka 启动&#xff1a;bin/kafka-serv…

js求解《初级算法》141. 环形链表

一、题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…

Apollo控制部分2-- ControllerAgent 控制器管理

Apollo控制部分2-- ControllerAgent 控制器管理摘要一、预备知识1、控制模块预备知识2、多态二、控制器管理解析1、初始化函数&#xff08;配置文件参数决定控制器&#xff09;1&#xff09;配置文件&#xff1a;"/apollo/modules/control/conf/control_conf.pb.txt"…

借助Spire.PDF,这家企业低成本实现在线文档签名和量打印

“公司主要是做跨国运输业务的&#xff0c;我们的客户在邮寄过程中需要提交和下载的确认材料非常多&#xff0c;这些材料大多需要客户分别下载后再手写签字确认上传&#xff0c;这导致我们订单操作效率非常低&#xff0c;还容易导致系统卡顿&#xff0c;我们一直在寻找合性能稳…

【C++】BloomFilter——布隆过滤器

文章目录一、布隆过滤器概念二、布隆过滤器应用三、布隆过滤器实现1.插入2.查找3.删除四、布隆过滤器优缺五、结语一、布隆过滤器概念 布隆过滤器是由布隆&#xff08;Burton Howard Bloom&#xff09;在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构&#xff0c;特点是…

从互联网科技到手机厂商,谁能扮演好孩子们的“辅导老师”?

【潮汐商业评论/ 原创】“ 没想到现在小孩子的学习机花样这么多&#xff0c;从配置到内容&#xff0c;挑得我是眼花缭乱&#xff0c;跟咱们那会儿一台复读机就能搞定学习完全不一样&#xff01;”80后的Gavin最近苦于为自己要上小学的孩子选购一台合适的学习机。本想是一件很容…

Process Monitor工具使用实验(23)

实验目的 学习Process Monitor实用小工具的使用&#xff0c;学会利用Process Monitor工具观察程序进程/线程、文件系统、注册表、网络连接等的活动。预备知识 Process Monitor是一个Windows系统下先进的监视工具&#xff0c;它可以显示文件系统、注册表、网络连接、进程…

操作系统基础知识介绍之Mixed CriticalitySystems——混合关键系统

一、发展背景 在嵌入式场景中&#xff0c;虽然Linux已经得到了广泛应用&#xff0c;但并不能覆盖所有需求&#xff0c;例如高实时、高可靠、高安全的场合。这些场合往往是实时操作系统 的用武之地。有些应用场景既需要Linux的管理能力、丰富的生态又需要实时操作系统的高实时、…

spring加载bean流程解析

spring作为目前我们开发的基础框架,每天的开发工作基本和他形影不离,作为管理bean的最经典、优秀的框架&#xff0c;它的复杂程度往往令人望而却步。不过作为朝夕相处的框架&#xff0c;我们必须得明白一个问题就是spring是如何加载bean的&#xff0c;我们常在开发中使用的注解…

机器人工程专业师生的第二张名片

课堂上多次提及第二张名片。什么是CatGPT-使用效果如何-专业感性非理性总结如下&#xff1a;机器人工程的工作与考研之困惑→汇总篇←其中包括&#xff1a;☞ 机器人工程的工作与考研之困惑“卷”☞ 机器人工程的工作与考研之困惑“歧视”☞ 机器人工程的工作与考研之困惑“取舍…

62-63-64 - 进程互斥锁Mutex的初步实现

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 问题2. 系统调用重设计2.1 互斥锁系统调用功能设计2.2 整体调用流程2.3 编程实验&#xff1a;互斥锁模块的创建2.4 思考3. 在内核态实现互斥锁功能的考虑3.1 互斥锁内核数据结构及接口实现3.1.1 创建互斥锁3.1.2 销毁互斥锁3.1.3…

Java 字符串String 在堆,栈,常量池中

一、Java程序的运行会涉及以下的内存区域: 寄存器&#xff1a;JVM内部虚拟寄存器&#xff0c;存取速度非常快&#xff0c;程序不可控制。 栈&#xff1a;存放基本类型的数据和对象的引用&#xff0c;但对象本身不存放在栈中&#xff0c;而是存放在堆中。 堆&#xff1a;存放n…

全同态加密:FHEW

参考资料&#xff1a; Micciancio D, Peikert C. Trapdoors for Lattices: Simpler, Tighter, Faster, Smaller[C]//Eurocrypt. 2012, 7237: 700-718.Alperin-Sheriff J, Peikert C. Faster bootstrapping with polynomial error[C]//Advances in Cryptology–CRYPTO 2014: 34…

css盒模型详解

一、引言 盒模型是网页开发中的一个基本概念&#xff0c;它描述了网页元素的外观和大小。盒模型由内容区域、内边距、边框和外边距四个部分组成&#xff0c;这些部分的大小和位置都可以通过CSS进行控制。在本文中&#xff0c;我们将介绍盒模型的概念和作用&#xff0c;并提出本…

一、SpringMVC概述

1.什么是SpringMVC 基于MVC开发模式的框架,用来优化控制器.它是Spring家族的一员.它也具备IOC和AOP. 什么是MVC?   一种开发模式,模型视图控制器的简称.所有的web应用都是基于MVC开发.   M:模型层,包含实体类,业务逻辑层,数据访问层   V:视图层,html,javaScript,vue等都…

MySQL安装和配置

下载官网下载mysql解压版本&#xff1a;配置环境变量下载完成后直接解压到需要放的文件夹&#xff0c;根据文件夹来配置环境变量&#xff1b;新建系统变量&#xff0c;变量名自取&#xff0c;值是MySQL的目录编辑path环境变量&#xff0c;加上MySQL的bin目录 %MYSQL_HOME%\bin配…

【python】序列(列表、元组)、字典、集合的初步认识

一、序列 序列类型(sequence)&#xff1a;一组有序的数据集&#xff0c;特点是数据之间存在先后关系&#xff0c;通过序号访问 序列包含以下三种类型&#xff1a; 1.字符串&#xff08;str&#xff09;不可修改 2.列表&#xff08;list&#xff09;可修改 3.元组&#xff08;t…

基于java的高校辅导员工作管理系统

摘 要网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块&#xff0c;对于高校辅导员工作管理将是又一个传统管理到智能化信息管理的改革&#xff0c;设计高校辅导员工作管理系统的目的就是借助计算机让复杂的班级信息、学籍信息等管…