当前位置: 首页 > news >正文

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

本文目录

  • 一、什么是对比度
  • 二、什么是颜色直方图
  • 三、如何通过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)的计算方法,其公式如下:
在这里插入图片描述

其中,NNN表示颜色直方图的总大小,pip_ipi表示第iii个像素的归一化值,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 npdef 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作为平滑处理。

相关文章:

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

本文目录一、什么是对比度二、什么是颜色直方图三、如何通过RGB计算颜色对比度什么是HSV、Lab颜色空间四、OpenCV代码五、Java代码5.1 平滑处理5.2 完整代码一、什么是对比度 对比度是指图像中不同区域之间的明暗差异程度&#xff0c;它是图像质量中的重要指标之一。除了颜色对…...

Book:实战Java高并发程序设计(第二版)

实战Java高并发程序设计&#xff08;第二版&#xff09;为什么会有并行计算&#xff1f;并行计算需要回答的问题基本概念并发级别有哪些&#xff1f;Amdahl定律和Gustafson定律Java并发三特性进程和线程线程的生命周期Thread类run()与start()的区别为什么会有并行计算&#xff…...

LeetCode 831. Masking Personal Information【字符串,正则表达式】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

递增三元组

[蓝桥杯 2018 省 B] 递增三元组 题目描述 给定三个整数数组 A[A1,A2,⋯,AN]A [A_1, A_2,\cdots, A_N]A[A1​,A2​,⋯,AN​]&#xff0c;B[B1,B2,⋯,BN]B [B_1, B_2,\cdots, B_N]B[B1​,B2​,⋯,BN​]&#xff0c;C[C1,C2,⋯,CN]C [C_1, C_2,\cdots,C_N]C[C1​,C2​,⋯,CN​…...

java源码阅读 - TreeSet

往期文章 用最简单的话讲最明白的红黑树java源码阅读 - HashMap数据结构 - 堆与堆排序 文章目录往期文章一、介绍二、类的声明三、成员变量四、构造函数五、常用方法1. NavigableSet接口的实现2. SortedSet接口的实现六、总结一、介绍 在上期文章中&#xff0c;我们从源码层面…...

写毕业论文经验贴

首先说一句不要靠近word&#xff0c;会变得不幸。最好用latex写&#xff0c;不过我当时懒得下载latex了&#xff0c;于是后期改格式花了点时间 写论文之前 事先把所有的论文都查好并且整理好&#xff0c;论文第一、二章写起来就会很快&#xff1b; 把实验做顺溜&#xff0c;实…...

2.7 进程退出、孤儿进程、僵尸进程+2.8 wait函数+2.9 waitpid函数

1.进程退出 子进程退出时&#xff1a;父进程帮助子进程回收内核区的资源 exit.c /*#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);status参数&#xff1a;是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取…...

【新2023Q2模拟题JAVA】华为OD机试 - 预订酒店

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:预订酒店 题目 放暑假了,橡…...

一个完整的渗透学习路线是怎样的?如何成为安全渗透工程师?

前言 1/我是如何学习黑客和渗透&#xff1f; 我是如何学习黑客和渗透测试的&#xff0c;在这里&#xff0c;我就把我的学习路线写一下&#xff0c;让新手和小白们不再迷茫&#xff0c;少走弯路&#xff0c;拒绝时间上的浪费&#xff01; 2/学习常见渗透工具的使用 注意&…...

刷完这60个标准库模块,成为Python骨灰级玩家

python强大&#xff0c;主要是因为包多&#xff0c;且不说第三方包&#xff0c;单是标准库就已让人望而生畏。 如果从第一篇整理标准库的博客算起&#xff0c;如今已有三个年头。在整理标准库的过程中&#xff0c;查阅了大量资料和官方文档&#xff0c;很多中文资料都有一个共…...

EasyExcel的简单使用(easyExcel和poi)

EasyExcel的简单使用 前言 Excel读 1.实体类 2.读监听器与测试类 3.输出结果 Excel写 1.实体类 2.写入Excel的测试类 3.输出结果 填充Excel 1.Excel模板 2.测试类 3.输出结果 前言 EasyExcel类是一套基于Java的开源Excel解析工具类&#xff0c;相较于传统的框架如Apache poi、…...

命名空间 namespace

一、命名空间的定义 定义命名空间&#xff0c;使用namespace关键字&#xff0c;后面跟命名空间的名字&#xff0c;然后接一对花括号{ } 即可&#xff0c;{ }中即为命名空间的成员。 1.一般定义 namespace test {int a 10;int b 100;int ADD(int x, int y){return x y;} }…...

我能“C”——初阶指针(上)

目录 1.什么是指针&#xff1f; 2. 指针和指针类型 3.野指针 3.1野指针的成因 3.2 如何规避野指针 1.什么是指针&#xff1f; 指针理解的2个要点&#xff1a; 1. 指针是内存中一个最小单元的编号&#xff0c;也就是地址 2. 平时口语中说的指针&#xff0c;通常指的是指针…...

Android高级工程师工资为何让人艳羡不已

很多人都想有一个月入过万的梦想&#xff0c;为了实现这个梦想&#xff0c;很多人都付出了一定的努力&#xff0c;但除了付出&#xff0c;选择一个好的行业的也是非常重要的&#xff0c;就眼下而言&#xff0c;最为多金的职业莫过于Android高级工程师&#xff0c;为什么Android…...

什么猫猫最受欢迎?Python采集猫咪交易数据

前言 在日常生活中&#xff0c;我们看到可爱的猫咪表情包&#xff0c;总是会忍不住收藏 认识的一些朋友也养了猫&#xff0c;比如橘猫、英短、加菲猫之类的 看他们发朋友圈撸猫&#xff0c;老羡慕了&#xff0c;猫咪真的太可爱啦。 你是不是也动过养猫猫的小心思呢~反正我是动…...

使用Nextcloud搭建私人云盘,并内网穿透实现公网远程访问

文章目录摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名摘要 Nextcloud,它是ownCloud的一个分支,是一个文件…...

行业盛会|2023中国(东莞)国际测量控制及仪器仪表展览会

时间&#xff1a;2023年11月16-18日 地点&#xff1a;广东现代国际展览中心 ◆展会背景background&#xff1a; 众所周知,当今世界已经进入信息时代&#xff0c;信息技术成为推动科学技术高速发展的关键技术。…...

redis集群 服务器重启测试

redis集群 服务器重启测试1、集群规划&#xff1a;2台服务器 每台服务器运行3个redis实例2、重启2台服务器后redis实例没有自动重启最后一对主从节点比较 重启实例后和之前的主从分配3、再次重启2台服务器4、主从同步测试1、集群规划&#xff1a;2台服务器 每台服务器运行3个re…...

Diffusion的unet中用到的AttentionBlock详解

AttentionBlocktorch.splittorch中的permute的用法torch.transpose()view()torch.bmmsoftmax(x, dim-1)Diffusion的unet中用到的AttentionBlock详解class AttentionBlock(nn.Module):__doc__ r"""Applies QKV self-attention with a residual connection.Input…...

ElasticSearch索引文档写入和近实时搜索

一、基本概念 1.Segments In Lucene 众所周知&#xff0c;ElasticSearch存储的基本单元Shard&#xff0c;ES中一个Index可能分为多个Shard&#xff0c;事实上每个Shard都是一个Lucence的Index&#xff0c;并且每个Lucene Index由多个Segment组成&#xff0c;每个Segment事实上…...

【C语言蓝桥杯每日一题】——等差数列

【C语言蓝桥杯每日一题】——等差数列&#x1f60e;前言&#x1f64c;等差数列&#x1f64c;解题思路分析&#xff1a;&#x1f60d;解题源代码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&…...

EM7电磁铁的技术参数

电磁铁可以通过更换电磁铁极头在一定范围内改善磁场的大小和磁场的均匀度 &#xff0c;并且可以通过调整极头间距改变磁场的大小。主要用于磁滞现象研究、磁化系数测量、霍尔效应研究、磁光实验、磁场退火、核磁共振、电子顺磁共振、生物学研究、磁性测量、磁性材料取向、磁性产…...

选择很重要,骑友,怎么挑选骑行装备?

骑行装备的重要性&#xff0c;已经不用多说了&#xff0c;大家也都知道。但是如何挑选&#xff0c;如何选择适合自己的骑行装备呢&#xff1f;今天我来和大家聊一聊这个问题。首先我们需要了解一个概念&#xff1a;骑行装备分为两大类&#xff1a;骑行服和骑行鞋。对于公路车来…...

【JUC面试题】Java并发编程面试题

Java并发编程 基础知识 1. 为什么要使用并发编程&#xff1f; 提升多核系统的CPU利用率一般来说一台主机上的会有多个CPU核心&#xff0c;我们可以创建多个线程&#xff0c;理论 上讲操作系统可以将多个线程分配给不同的CPU去执行&#xff0c;每个CPU执行一个线程&#xff0c…...

spark笔记

spark笔记 1. 概述 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎&#xff1b;Spark提供内存计算&#xff0c;将计算结果直接放在内存中&#xff0c;减少了迭代计算的IO开销&#xff0c;有更高效的运算效率。 1.1 Spark核心模块 Spark Core&#xff1a;提供S…...

丢失了packet.dll原因和解决方法全面指南

packet.dll是Windows操作系统中的一个重要文件&#xff0c;它主要用于网络通信&#xff0c;如果丢失了这个文件&#xff0c;可能会导致网络连接问题。本文将探讨packet.dll文件丢失的原因&#xff0c;并提供相应的解决方法。 一、丢失packet.dll文件的原因 1. 病毒感染&#x…...

算法练习随记(三)

1.全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#x…...

基于Python 进行卫星图像多种指数分析

一、前言本文帮助读者更好地了解卫星数据以及使用 Python 探索和分析哨兵2卫星数号数据在Sundarbans地区的不同方法。二、Sundarbans研究区孙德尔本斯&#xff08;Sundarbans&#xff09;是恒河、雅鲁藏布江和梅克纳河在孟加拉湾汇合形成的三角洲中最大的红树林区之一。 孙德尔…...

(Week 15)综合复习(C++,字符串,数学)

文章目录T1 [Daimayuan]删删&#xff08;C&#xff0c;字符串&#xff09;输入格式输出格式样例输入样例输出数据规模解题思路T2 [Daimayuan]快快变大&#xff08;C&#xff0c;区间DP&#xff09;输入格式输出格式样例输入样例输出数据规模解题思路T3 [Daimayuan]饿饿 饭饭2&a…...

迪赛智慧数——柱状图(正负条形图):“光棍”排行榜TOP10省份

效果图 中国单身男女最多的省份是广东&#xff0c;广东的人口是全国最多的。人口多了&#xff0c;单身的人也会多&#xff0c;单身女性324万&#xff0c;男性498万。全国第二的省份是四川省&#xff0c;单身女性256万&#xff0c;单身男性296万。 数据源&#xff1a;静态数据…...