图片对比度够不够?用华为云码道开发 OpenCV 对比度分析工具

前面已经做过图片亮度分析,这一篇继续往下做一个很接近、但概念不一样的小工具:

图片对比度分析。

很多时候我们会觉得一张图片:

"看起来有点灰。"

"亮的地方不够亮,暗的地方也不够暗。"

"整体层次感不明显。"

这种感觉其实就和:

Contrast,对比度

有关。

所以这次我用华为云码道辅助开发了一个简单的:

OpenCV Image Contrast Analyzer

上传一张图片以后,程序会自动计算对比度分数、平均亮度,并生成灰度直方图。


一、亮度和对比度其实不是一回事

上一篇做的是:

Brightness

它主要回答:

这张图片整体有多亮?

比如我们计算所有灰度像素的平均值。

而这一篇关注的是:

Contrast

它回答的是:

图片里的亮暗差异到底有多大?

举个简单例子。

假设两张图片平均亮度都是 150。

第一张大部分像素都集中在:

140~160

第二张像素却分布在:

30~240

虽然它们平均亮度差不多,但第二张的:

明暗跨度明显更大。

因此对比度也更高。


二、这次用什么计算 Contrast Score?

这次没有使用复杂算法,直接使用:

灰度标准差

来作为 Contrast Score。

核心思路:

原图

↓

灰度化

↓

计算所有灰度像素的标准差

↓

得到 Contrast Score

OpenCV 读取图片以后,先转换成灰度图。

然后计算:

gray.std()

标准差越大,说明像素亮度分布越分散。

也就是说:

暗的地方更暗

亮的地方更亮

亮暗差异更明显

因此可以简单理解成:

Contrast Score 越高,对比度通常越强。


三、这次工具做了哪些功能?

这次依然保持简单。

目前页面可以显示:

  • Original Image
  • Contrast Score
  • Contrast Level
  • Average Brightness
  • Grayscale Histogram
  • 支持下载 Histogram PNG

整个流程就是:

上传图片

↓

灰度化

↓

计算 Average Brightness

↓

计算 Contrast Score

↓

判断对比度等级

↓

绘制灰度直方图


四、对比度等级怎么判断?

这次先设置了三个简单区间:

Contrast Score ≥ 70:

High Contrast

35 ≤ Contrast Score < 70:

Normal Contrast

Contrast Score < 35:

Low Contrast

这个阈值并不是摄影行业统一标准。

更多是为了让这个小工具能够给出一个直观分类。

后面如果换成不同数据集,也可以根据实际图片情况调整阈值。


五、真实测试结果

这次继续使用之前的狗狗公园图片。

最终程序得到:

Contrast Score:

48.84

Average Brightness:

153.05 / 255

Contrast Level:

Normal Contrast

按照当前规则:

48.84 位于:

35~70

之间。

所以最终被判断为:

Normal Contrast


六、48.84 这个数字怎么理解?

Contrast Score 其实就是:

灰度值的标准差。

如果一张图片里的像素都很接近,

例如大部分都集中在:

150 左右

那么标准差就会比较小。

这说明:

整张图虽然可能亮度正常,但明暗层次不明显。

反过来,如果一张图片同时存在很多:

很暗的像素

很亮的像素

那么灰度值分布就会更分散。

标准差也会增加。

所以:

48.84

说明这张图片具有一定的明暗变化,但并没有达到特别强烈的高对比效果。

从原图来看也比较符合直觉。


七、为什么还要显示 Average Brightness?

这次页面里仍然保留了:

Average Brightness:

153.05

这是因为亮度和对比度最好一起看。

比如:

一张图可能很暗,但对比度很高。

也可能:

整体很亮,但对比度很低。

所以:

Brightness

和:

Contrast

描述的是两个不同维度。

这张狗狗图:

Average Brightness = 153.05

说明整体亮度比较正常。

Contrast Score = 48.84

说明亮暗层次属于中等水平。

因此最后:

亮度:

Normal

对比度:

Normal Contrast

这两个结果是可以同时成立的。


八、直方图能看出什么?

这次同样生成了:

Grayscale Histogram

横轴:

0~255 灰度值

左边越靠近 0:

越暗

右边越靠近 255:

越亮

从这张图的 Histogram 可以看到:

像素并不是集中在一个很窄的区域里。

而是从暗部到亮部都有分布。

同时中高亮度区域像素比较多。

这也解释了为什么:

Average Brightness = 153.05

而 Contrast Score 仍然有:

48.84

说明整张图片既有明显亮部,也保留了一定暗部。


九、什么样的图片会是 Low Contrast?

低对比度图片通常会有一种:

"灰蒙蒙"

的感觉。

比如:

雾天照片

曝光比较平的图

整体颜色接近

暗部和亮部差异很小

这种情况下,灰度值可能大量集中在某个范围。

最终标准差就会比较低。

例如:

Contrast Score < 35

就会被当前工具判断为:

Low Contrast


十、High Contrast 又是什么样?

高对比度图片通常会有比较明显的:

黑白反差

强光

阴影

亮暗边界

例如:

逆光场景

黑底白字

舞台灯光

强烈明暗摄影

这些图片的灰度值跨度通常更大。

所以:

Contrast Score

也会明显升高。


十一、这种方法有什么局限?

使用灰度标准差判断对比度,最大的优点是:

简单

快

容易解释

但它也不是绝对标准。

例如图片里存在大量噪点,也可能提高灰度标准差。

另外:

局部高对比

和:

整体高对比

也不是完全一样的概念。

所以这个工具更适合:

快速分析整张图片的整体明暗分布。

如果要做更专业的图像质量评价,还可以进一步分析:

局部对比度

动态范围

局部标准差

CLAHE 前后变化

但对于这一篇的小工具来说,灰度标准差已经足够。


十二、可以用在哪里?

这种简单的对比度分析可以用于很多基础场景。

比如:

数据集检查

快速找出:

过灰

层次不足

对比度异常

的图片。

图像增强前判断

如果 Contrast Score 太低,可以进一步考虑:

Histogram Equalization

CLAHE

等方法增强对比度。

相机图片分析

可以辅助观察不同曝光条件下,图像的明暗跨度有没有明显变化。

图像处理实验

做滤波、增强或者曝光处理前后,可以直接比较 Contrast Score 的变化。


十三、为什么这次继续做这种小项目?

最近这几篇都保持同一个节奏:

一个小项目解决一个明确问题。

这次依然只用了:

Python

OpenCV

FastAPI

原生 HTML / CSS / JavaScript

不用模型训练,也没有复杂系统。

而且这个项目和上一篇亮度分析还能很好地区分:

Brightness:

看整体亮不亮

Contrast:

看亮暗差异大不大

两个概念放在一起学习也比较直观。


总结

这次用华为云码道辅助开发了一个:

OpenCV 图片对比度分析工具。

核心流程:

上传图片

↓

转换灰度图

↓

计算 Average Brightness

↓

计算灰度标准差

↓

得到 Contrast Score

↓

判断 Contrast Level

↓

显示 Histogram

真实测试结果:

Average Brightness:

153.05 / 255

Contrast Score:

48.84

Contrast Level:

Normal Contrast

这也说明:

图片整体亮度和图片对比度,并不是同一个概念。

前一篇回答的是:

这张图片有多亮?

这一篇回答的是:

这张图片的亮暗差异到底大不大?

下一篇可以继续做一个同样简单、但视觉效果很明显的方向:

图片颜色偏不偏?用华为云码道开发 OpenCV 色彩偏移分析工具

可以统计 RGB 三个通道的平均值,判断图片整体是:

偏红、偏绿、偏蓝,还是相对均衡。

相关推荐
AI全栈学习助手11 小时前
告别“转圈等待”:Spring Boot + SSE 让大模型像 ChatGPT 一样流式输出
java·人工智能·spring boot·后端·aigc
天天被压力11 小时前
【A股分钟级高频数据完全手册 #02】Python调用股票1分钟数据接口:Pro版最新分时取数与字段解析
java·人工智能·python
楚山之石11 小时前
【MRM】CAPLEX 对比剂灌注 MRI 开源术语库:ISMRM OSIPI 共识报告
图像处理·人工智能·学习·mri
Godspeed Zhao11 小时前
从零开始学AI22——集成学习
人工智能·机器学习·集成学习
天天被压力11 小时前
【A股分钟级高频数据完全手册 #01】Pro版接口体系总览与REST鉴权:42篇地图与从0接入
java·人工智能·python
IT_陈寒11 小时前
React实战技巧总结
前端·人工智能·后端
一缕82年的清风11 小时前
被中产唾弃的“十元快剪”,藏着最狠的极客工程学
人工智能·设计模式
Yyyyyy~12 小时前
【深度学习】day2
人工智能·深度学习
ck01357912 小时前
视频片段提取与视频修剪的区别:多时间段选择及导出流程
人工智能·音视频·视频
沐飞工具箱12 小时前
游戏、漫画、视频里的外语怎么实时翻译?从 OCR + AI 原理聊聊 VoriTrans 屏幕翻译
人工智能·游戏·实时互动·音视频·自动翻译