热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

Opencv判断颜色相似的图片示例代码

这篇文章主要介绍了Opencv判断颜色相似的图片示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题描述

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

素材准备

所以就从网上随便找了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左右。已经达到了我们开始时的目标。

不足之处

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

代码

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


def create_rgb_hist(image):
  """"创建 RGB 三通道直方图(直方图矩阵)"""
  h, w, c = image.shape
  # 创建一个(16*16*16,1)的初始矩阵,作为直方图矩阵
  # 16*16*16的意思为三通道每通道有16个bins
  rgbhist = np.zeros([16 * 16 * 16, 1], np.float32)
  bsize = 256 / 16
  for 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] += 1
  plt.ylim([0, 10000])
  plt.grid(color='r', line, linewidth=0.5, alpha=0.3)
  return rgbhist


def 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 img


img1 = 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判断颜色相似的图片示例代码的文章就介绍到这了,更多相关Opencv判断相似图片内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 如何在电脑上同时登录多个微信账号?实用技巧全解析
    本文详细介绍了如何在电脑上同时登录多个微信账号的方法,并分享了一些微信的隐藏小技巧,帮助用户更高效地使用微信。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 解决Windows 10开机频繁自检问题的实用方法
    许多用户在使用Windows 10系统时,经常会遇到开机时自动进行磁盘检查的情况。这不仅影响了开机速度,还可能带来不必要的麻烦。本文将详细介绍如何通过简单的注册表修改来避免每次开机时的磁盘自检,提升系统启动效率。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • 探索金山WPS2000专业版中被遗忘的实用功能
    金山WPS作为国产办公软件中的佼佼者,以其与Office相似的界面和功能广受用户喜爱。然而,随着时间的推移,一些早期版本中的独特功能逐渐被忽视。本文将带您回顾并重新发现这些曾经便捷且实用的功能。 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 本文详细介绍了在不同操作系统中查找和设置网卡的方法,涵盖了Windows系统的具体步骤,并提供了关于网卡位置、无线网络设置及常见问题的解答。 ... [详细]
  • 本文探讨了在构建应用程序时,如何对不同类型的数据进行结构化设计。主要分为三类:全局配置、用户个人设置和用户关系链。每种类型的数据都有其独特的用途和应用场景,合理规划这些数据结构有助于提升用户体验和系统的可维护性。 ... [详细]
  • 在Windows 10系统中安装TortoiseSVN 1.11.1时,可能会遇到错误代码2503。此问题通常与系统权限设置或安装程序的执行环境有关。本文将详细介绍导致该错误的原因,并提供有效的解决方案。 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • Linux中的yum安装软件
    yum俗称大黄狗作用:解决安装软件包的依赖关系当安装依赖关系的软件包时,会将依赖的软件包一起安装。本地yum:需要yum源,光驱挂载。yum源:(刚开始查看yum源中的内容就是上图 ... [详细]
author-avatar
v敏0敏v_405_961
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有