于是,經過思考后我覺得,判斷兩張圖片在顏色上相不相似,其本質在于判斷其直方圖分布的形狀相不相似,而不應該考慮是偏左還是偏右、是偏亮還是偏暗。一個圖像亮一點,但其實它們還是相似的。
基于這個思想,我先暴力的把BGR以及HLS,三個通道先相互獨立的直接均衡化,驗證了判斷分布形狀的可行性。但同時,發(fā)現(xiàn)相互獨立的均衡化會導致對于不同圖片的分辨能力降低。所以,由此推論出,應該是把亮度拉平均衡化,同時相關聯(lián)的影響到其他通道的變化。
可以發(fā)現(xiàn),經過處理后,第一、二張圖片,以及第二、三張圖片之間的相似度已經大于0.7,而第三、四張圖片的相似度則只有0.4左右。已經達到了我們開始時的目標。
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]
# 人為構建直方圖矩陣的索引,該索引是通過每一個像素點的三通道值進行構建
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)'''
# 進行三種方式的直方圖比較
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判斷相似圖片內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!