中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Opencv怎么判斷顏色相似的圖片

發布時間:2021-03-05 16:48:22 來源:億速云 閱讀:463 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關使用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左右。已經達到了我們開始時的目標。

不足之處

  • 只對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', linestyle='--', 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)'''
  # 進行三種方式的直方圖比較
  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 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怎么判斷顏色相似的圖片,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奈曼旗| 文登市| 稻城县| 卓资县| 开化县| 宁武县| 武威市| 平乐县| 新昌县| 新绛县| 革吉县| 镇平县| 秦皇岛市| 庆城县| 始兴县| 崇义县| 阿克陶县| 鹤壁市| 墨竹工卡县| 新巴尔虎左旗| 赤城县| 荆门市| 长岛县| 湖北省| 微山县| 台山市| 黄浦区| 西青区| 旅游| 贡山| 凤庆县| 邹平县| 抚顺县| 肥乡县| 白河县| 乐至县| 金坛市| 永登县| 成都市| 山西省| 淮滨县|