Opencv判斷顏色相似的圖片示例代碼
問題描述
有一個項目,大體是要判斷一下一篇文章內(nèi)的配圖突不突兀。
素材準(zhǔn)備
所以就從網(wǎng)上隨便找了4張圖:
可以看出,前3張圖片從顏色上、從閱讀感受上,應(yīng)該是相似的,而最后一張應(yīng)該是不同的。
而當(dāng)我們只對圖片做縮放(為了跑得快),然后用bgr通道出直方圖算相似度時:
卻發(fā)現(xiàn),只有第一張和第二張圖片的相似度是大于0.5的,而第二、三張,以及第三、四張圖片之間的相似度幾乎都小于等于0.1。
思考方法
于是,經(jīng)過思考后我覺得,判斷兩張圖片在顏色上相不相似,其本質(zhì)在于判斷其直方圖分布的形狀相不相似,而不應(yīng)該考慮是偏左還是偏右、是偏亮還是偏暗。一個圖像亮一點,但其實它們還是相似的。
基于這個思想,我先暴力的把BGR以及HLS,三個通道先相互獨立的直接均衡化,驗證了判斷分布形狀的可行性。但同時,發(fā)現(xiàn)相互獨立的均衡化會導(dǎo)致對于不同圖片的分辨能力降低。所以,由此推論出,應(yīng)該是把亮度拉平均衡化,同時相關(guān)聯(lián)的影響到其他通道的變化。
所以,最后想出的方案是:
- 先把圖片縮放至統(tǒng)一大小,提升運算速度。
- 把圖像從BGR通道轉(zhuǎn)至HSV通道(經(jīng)實驗,HSV通道比HLS通道效果好)。
- 把HSV中的V(明度)進(jìn)行均衡化(equalizeHist)。
- 再把圖像從HSV通道轉(zhuǎn)回BGR通道,從而達(dá)到在均衡亮度的同時影響其他通道的目的。
- 最后,利用BGR通道進(jìn)行相似度計算,大于0.5的即可認(rèn)為是相似。
測試結(jié)果
可以發(fā)現(xiàn),經(jīng)過處理后,第一、二張圖片,以及第二、三張圖片之間的相似度已經(jīng)大于0.7,而第三、四張圖片的相似度則只有0.4左右。已經(jīng)達(dá)到了我們開始時的目標(biāo)。
不足之處
- 只對V通道的均衡進(jìn)行了探尋,沒有研究其他通道可能的關(guān)聯(lián)。
- 第三、四張圖片經(jīng)過處理后的相似度有點高,需要想辦法降低。
代碼
import cv2 as cv import numpy as np from matplotlib import pyplot as plt def create_rgb_hist(image): """"創(chuàng)建 RGB 三通道直方圖(直方圖矩陣)""" h, w, c = image.shape # 創(chuàng)建一個(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] # 人為構(gòu)建直方圖矩陣的索引,該索引是通過每一個像素點的三通道值進(jìn)行構(gòu)建 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): """直方圖比較函數(shù)""" '''# 創(chuàng)建第一幅圖的rgb三通道直方圖(直方圖矩陣) hist1 = create_rgb_hist(image1) # 創(chuàng)建第二幅圖的rgb三通道直方圖(直方圖矩陣) hist2 = create_rgb_hist(image2)''' # 進(jìn)行三種方式的直方圖比較 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, 相關(guān)性:%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()
到此這篇關(guān)于Opencv判斷顏色相似的圖片示例代碼的文章就介紹到這了,更多相關(guān)Opencv判斷相似圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django項目中包含多個應(yīng)用時對url的配置方法
今天小編就為大家分享一篇Django項目中包含多個應(yīng)用時對url的配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Pycharm中flask開啟debug模式的詳細(xì)流程
PyCharm是一個強(qiáng)大的集成開發(fā)環(huán)境(IDE),非常適合Python開發(fā)者,包括Flask框架,當(dāng)你在使用Flask開發(fā)Web應(yīng)用時,Debug功能是非常重要的,它允許你在運行時檢查程序的狀態(tài)、調(diào)試代碼錯誤,本文將介紹Pycharm中flask開啟debug模式的詳細(xì)流程,需要的朋友可以參考下2024-08-08Python數(shù)據(jù)相關(guān)系數(shù)矩陣和熱力圖輕松實現(xiàn)教程
這篇文章主要介紹了Python數(shù)據(jù)相關(guān)系數(shù)矩陣和熱力圖輕松實現(xiàn)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06python3解析庫BeautifulSoup4的安裝配置與基本用法
簡單來說,BeautifulSoup就是Python的一個HTML或XML的解析庫,我們可以用它來方便地從網(wǎng)頁中提取數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python3解析庫BeautifulSoup4的安裝配置與基本用法的相關(guān)資料,需要的朋友可以參考下2018-06-06關(guān)于Kotlin中SAM轉(zhuǎn)換的那些事
這篇文章主要給大家介紹了關(guān)于Kotlin中SAM轉(zhuǎn)換的那些事,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09python中將txt文件轉(zhuǎn)換為csv文件的三種方法舉例
對于大數(shù)據(jù)的處理基本都是以CSV文件為基礎(chǔ)進(jìn)行的,那么在進(jìn)行深度學(xué)習(xí)的處理之前,需要先統(tǒng)一數(shù)據(jù)文件的格式,下面這篇文章主要給大家介紹了關(guān)于python中將txt文件轉(zhuǎn)換為csv文件的三種方法,需要的朋友可以參考下2024-06-06