Opencv判断颜色相似的图片

问题描述

有一个项目,大体是要判断一下一篇文章内的配图突不突兀。

素材准备

所以就从网上随便找了4张图: file 可以看出,前3张图片从颜色上、从阅读感受上,应该是相似的,而最后一张应该是不同的

而当我们只对图片做缩放(为了跑得快),然后用bgr通道出直方图算相似度时: file 却发现,只有第一张和第二张图片的相似度是大于0.5的,而第二、三张,以及第三、四张图片之间的相似度几乎都小于等于0.1

思考方法

于是,经过思考后我觉得,判断两张图片在颜色上相不相似,其本质在于判断其直方图分布的形状相不相似,而不应该考虑是偏左还是偏右、是偏亮还是偏暗。一个图像亮一点,但其实它们还是相似的

基于这个思想,我先暴力的把BGR以及HLS,三个通道先相互独立的直接均衡化,验证了判断分布形状的可行性。但同时,发现相互独立的均衡化会导致对于不同图片的分辨能力降低。所以,由此推论出,应该是把亮度拉平均衡化,同时相关联的影响到其他通道的变化

所以,最后想出的方案是:

  1. 先把图片缩放至统一大小,提升运算速度。
  2. 把图像从BGR通道转至HSV通道(经实验,HSV通道比HLS通道效果好)。
  3. 把HSV中的V(明度)进行均衡化(equalizeHist)
  4. 再把图像从HSV通道转回BGR通道,从而达到在均衡亮度的同时影响其他通道的目的
判断图片中各种颜色的占比,可以使用 Python 的 OpenCV 库来进行图像处理和颜色分析。下面是一个简单的示例代码: ```python import cv2 import numpy as np def get_color_percent(image_path, color): # 读取图片 image = cv2.imread(image_path) # 将图片转换为 HSV 颜色空间 hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 定义颜色范围 lower_color = np.array(color[0]) upper_color = np.array(color[1]) # 根据颜色范围创建掩膜 mask = cv2.inRange(hsv_image, lower_color, upper_color) # 统计掩膜中白色像素的数量,即颜色占比 total_pixels = mask.shape[0] * mask.shape[1] color_pixels = cv2.countNonZero(mask) color_percent = (color_pixels / total_pixels) * 100 return color_percent # 图片路径 image_path = 'path/to/your/image.jpg' # 颜色范围(以 BGR 格式表示) color_range = [(0, 0, 0), (255, 255, 255)] # 获取颜色占比 percent = get_color_percent(image_path, color_range) print('颜色占比:', percent, '%') ``` 在示例代码中,首先使用 `cv2.imread()` 函数读取图片,并使用 `cv2.cvtColor()` 函数将图片转换为 HSV 颜色空间。然后通过设置颜色范围,使用 `cv2.inRange()` 函数创建颜色的掩膜。接着使用 `cv2.countNonZero()` 函数统计掩膜中非零像素的数量,即颜色的像素数量。最后计算颜色占比并返回结果。 你可以根据需要修改 `image_path` 和 `color_range` 变量来适应你的实际情况。注意,颜色范围是以 BGR 格式表示,你可以根据需要设置不同的颜色范围。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangsheng377

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值