问题描述

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

素材准备

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

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

思考方法

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

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

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

  1. 先把图片缩放至统一大小,提升运算速度。
  2. 把图像从BGR通道转至HSV通道(经实验,HSV通道比HLS通道效果好)。
  3. 把HSV中的V(明度)进行均衡化(equalizeHist)
  4. 再把图像从HSV通道转回BGR通道,从而达到在均衡亮度的同时影响其他通道的目的
  5. 最后,利用BGR通道进行相似度计算,大于0.5的即可认为是相似。

测试结果

可以发现,经过处理后,第一、二张图片,以及第二、三张图片之间的相似度已经大于0.7,而第三、四张图片的相似度则只有0.4左右。已经达到了我们开始时的目标


不足之处

  1. 只对V通道的均衡进行了探寻,没有研究其他通道可能的关联。
  2. 第三、四张图片经过处理后的相似度有点高,需要想办法降低。

代码

import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef create_rgb_hist(image):""""创建 RGB 三通道直方图(直方图矩阵)"""h, w, c = image.shape# 创建一个(16*16*16,1)的初始矩阵,作为直方图矩阵# 16*16*16的意思为三通道每通道有16个binsrgbhist = np.zeros([16 * 16 * 16, 1], np.float32)bsize = 256 / 16for row in range(h):for col in range(w):b = image[row, col, 0]g = image[row, col, 1]r = image[row, col, 2]# 人为构建直方图矩阵的索引,该索引是通过每一个像素点的三通道值进行构建index = int(b / bsize) * 16 * 16 + int(g / bsize) * 16 + int(r / bsize)# 该处形成的矩阵即为直方图矩阵rgbhist[int(index), 0] += 1plt.ylim([0, 10000])plt.grid(color='r', linestyle='--', linewidth=0.5, alpha=0.3)return rgbhistdef hist_compare(hist1, hist2):"""直方图比较函数"""'''# 创建第一幅图的rgb三通道直方图(直方图矩阵)hist1 = create_rgb_hist(image1)# 创建第二幅图的rgb三通道直方图(直方图矩阵)hist2 = create_rgb_hist(image2)'''# 进行三种方式的直方图比较match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)print("巴氏距离:%s, 相关性:%s, 卡方:%s" % (match1, match2, match3))def handle_img(img):img = cv.resize(img, (100, 100))img = cv.cvtColor(img, cv.COLOR_BGR2HSV)img[:, :, 2] = cv.equalizeHist(img[:, :, 2])img = cv.cvtColor(img, cv.COLOR_HSV2BGR)return imgimg1 = cv.imread("1.jpg")
img1 = handle_img(img1)
cv.imshow("img1", img1)img2 = cv.imread("2.jpg")
img2 = handle_img(img2)
cv.imshow("img2", img2)img3 = cv.imread("3.jpg")
img3 = handle_img(img3)
cv.imshow("img3", img3)img4 = cv.imread("4.jpg")
img4 = handle_img(img4)
cv.imshow("img4", img4)hist1 = create_rgb_hist(img1)
hist2 = create_rgb_hist(img2)
hist3 = create_rgb_hist(img3)
hist4 = create_rgb_hist(img4)plt.subplot(1, 4, 1)
plt.title("hist1")
plt.plot(hist1)
plt.subplot(1, 4, 2)
plt.title("hist2")
plt.plot(hist2)
plt.subplot(1, 4, 3)
plt.title("hist3")
plt.plot(hist3)
plt.subplot(1, 4, 4)
plt.title("hist4")
plt.plot(hist4)hist_compare(hist1, hist2)
hist_compare(hist2, hist3)
hist_compare(hist3, hist4)plt.show()cv.waitKey(0)
cv.destroyAllWindows()

Opencv判断颜色相似的图片相关推荐

  1. python图片转视频加特效_使用Python opencv实现视频与图片的相互转换

    因为最近要经常转换数据集进行实验,因此记录一下. 1.视频转图片 即为将视频解析为一帧一帧的图片: import cv2 vc=cv2.VideoCapture("/home/hqd/Pyc ...

  2. 两台电脑串口传输文件及调用opencv库编程显示图片和文本

    文章目录 一.两台电脑利用串口进行文件传输 (一).实验内容 (二).配置环境 (三).实验过程 (四).结果分析 二.在Ubuntu下基于Linux环境调用opencv库编程显示图片和文本 (一). ...

  3. 使用Python+opencv+k-means根据扫描图片计算叶片面积-续

    一 .概述 之前写了一篇计算叶片面积的文章,后来想想其实没有那么复杂,直接二值化计算即可得到,原来的代码写了几十行,其实十余行就可以计算得到叶片面积了. 原文:使用Python+opencv+k-me ...

  4. python 图片base64 编解码,转换成Opencv,PIL.Image图片格式

    Python PIL.Image和OpenCV图像格式相互转换 二进制打开图片文件,base64编解码转成Opencv格式: # coding: utf-8 import base64 import ...

  5. python 找出图片中的差异点,python opencv对目录下图片进行去重的技巧

    使用python opencv对目录下图片进行去重的方法 版本: 平台:ubuntu 14 / I5 / 4G内存 python版本:python2.7 opencv版本:2.13.4 依赖: 如果系 ...

  6. opencv介绍+python调取图片

    opencv介绍+python调取图片 opencv介绍 简介 优势 python调取图片 前期准备 程序 运行结果 后续 opencv介绍 简介 OpenCV是一个基于BSD许可(开源)发行的跨平台 ...

  7. python找图片不同_用openCV和Python 实现图片对比,并标识出不同点的方式

    最近项目中需要实现两组图片对比,并能将两者的区别标识出来. 在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下: 想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Pyt ...

  8. java判断 图片_java判断是否为图片的步骤和方法

    小编今天看到有个小伙伴问java如何判断上传的东西是否是图片,刚好小编有时间就给小伙伴解决一下如何判断的方法. 1.打开Eclipse,在项目工程一栏,也就是左边这一栏的空白处右击鼠标, 选择new- ...

  9. Python+OpenCV判断图像是黑底还是白底

    前言 本篇博客使用Python+OpenCV判断图像是黑底还是白底,利用图像对角线上的黑白像素点个数进行判断,详情见下文. 本篇博客内容包含代码逻辑.说明.依赖.实现,这几部分.代码实现部分包含2种实 ...

最新文章

  1. 程序员的自我修养--链接、装载与库笔记:系统调用与API
  2. Spring Mybatis实例SqlSessionDaoSupport混用xml配置和注解
  3. 怎样利用超图客户端打点_渗透测试——XSS利用工具BeEF攻击演示
  4. 使用ASP.Net 3.5 的Ajax与Web服务开发实例
  5. 机器学习之--梯度下降和最小二乘法算线性回归
  6. vue引入外部文件_vue文件中引入外部js
  7. 灯鹭的简单开放,促进网站一举多赢
  8. 菜鸟教程终极篇之Microsoft Windows Pre-installation Environment (Windows PE) 2.0
  9. 手把手教你 Spark 性能调优
  10. oracle11g AUD$维护
  11. Docker安装Redis以及配置Redis环境
  12. mysql常规使用(建立,增删改查,视图索引)
  13. 编译GDAL支持MySQL
  14. Google两步验证的工作原理
  15. 故障恢复 stm32_77条STM32知识,千万不能错过!干货
  16. 《算法设计与分析基础》【part1】
  17. 友盟+短视频行业研究
  18. Mal-amido-PEG2-acid,756525-98-1末端羧酸可在活化剂(如EDC或HATU)存在下与伯胺基反应
  19. 计算机网络中速率(date rate)和带宽的区别
  20. socket服务器断开消息,详解JS WebSocket断开原因和心跳机制

热门文章

  1. 对 GoPro 应用程序摄像机连接的故障诊断
  2. 给公司搭建一个人才库系统,前台(信息填写+简历上传)后台(筛选功能+下载简历)
  3. GIAC全球互联网架构大会
  4. 中国联通5G技术预计2020年进行正式商用
  5. 腾讯AI Lab刷新人脸识别与检测两大测评国际记录,技术日调用超六亿
  6. uni-app 查看大图
  7. Python实例1:海洋单位距离的换算
  8. 【ML】基于机器学习的心脏病预测研究(附代码,lightgbm模型)
  9. 英伟达Nvidia TX1 TX2 串口通信方法
  10. 记录一下在学习HAL库时感觉必须要知道的基础知识