文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用Opencv怎么判断颜色相似的图片

2023-06-07 14:25

关注

本篇文章给大家分享的是有关使用Opencv怎么判断颜色相似的图片,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

问题描述

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

素材准备

所以就从网上随便找了4张图:

使用Opencv怎么判断颜色相似的图片

可以看出,前3张图片从颜色上、从阅读感受上,应该是相似的,而最后一张应该是不同的。

而当我们只对图片做缩放(为了跑得快),然后用bgr通道出直方图算相似度时:

使用Opencv怎么判断颜色相似的图片

却发现,只有第一张和第二张图片的相似度是大于0.5的,而第二、三张,以及第三、四张图片之间的相似度几乎都小于等于0.1。

思考方法

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

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

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

  1. 先把图片缩放至统一大小,提升运算速度。

  2. 把图像从BGR通道转至HSV通道(经实验,HSV通道比HLS通道效果好)。

  3. 把HSV中的V(明度)进行均衡化(equalizeHist)。

  4. 再把图像从HSV通道转回BGR通道,从而达到在均衡亮度的同时影响其他通道的目的。

  5. 最后,利用BGR通道进行相似度计算,大于0.5的即可认为是相似。

测试结果

使用Opencv怎么判断颜色相似的图片

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

不足之处

代码

import cv2 as cvimport numpy as npfrom matplotlib import pyplot as pltdef 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', 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)'''  # 进行三种方式的直方图比较  match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)  match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)  match4 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)  print("巴氏距离:%s, 相关性:%s, 卡方:%s" % (match2, match3, match4))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怎么判断颜色相似的图片,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯