Opencv判断颜色相似的图片
思考方法
于是,经过思考后我觉得,判断两张图片在颜色上相不相似,其本质在于判断其直方图分布的形状相不相似,而不应该考虑是偏左还是偏右、是偏亮还是偏暗。一个图像亮一点,但其实它们还是相似的。
基于这个思想,我先暴力的把BGR以及HLS,三个通道先相互独立的直接均衡化,验证了判断分布形状的可行性。但同时,发现相互独立的均衡化会导致对于不同图片的分辨能力降低。所以,由此推论出,应该是把亮度拉平均衡化,同时相关联的影响到其他通道的变化。
所以,最后想出的方案是:
先把图片缩放至统一大小,提升运算速度。
把图像从BGR通道转至HSV通道(经实验,HSV通道比HLS通道效果好)。
把HSV中的V(明度)进行均衡化(equalizeHist)。
再把图像从HSV通道转回BGR通道,从而达到在均衡亮度的同时影响其他通道的目的。
最后,利用BGR通道进行相似度计算,大于0.5的即可认为是相似。
代码:
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)'''
# 进行三种方式的直方图比较
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()
同类资源
- C#开源利用OpenCV找图经典例子
C#开源利用OpenCV找图经典例子绿色版,没有使用最新本版是因为该本版.NET4.0就能跑。...
- 基于OpenCV精度测量项目
基于OpenCV精度测量项目本文件感兴趣的可以参考一下,课程的核心是开发一个基于OpenCV的精度测量项目。...
- Python-Opencv自定义训练器识别任意物体
Python-Opencv自定义训练器识别任意物体本文件感兴趣的可以参考一下,压缩包包含自定义训练器的全过程。...
- tx2安装支持cuda的opencv
tx2安装支持cuda的opencv本文件感兴趣的可以参考一下,tx2刷机的opencv,不支持cuda。...
- Python Opencv实现图像轮廓识别功能
PythonOpencv实现图像轮廓识别功能例子,主要为大家详细介绍了PythonOpencv实现图像轮廓识别功能。...
- 调用OPENCV模块开源
易语言调用OPENCV模块开源例子源代码,封装了C的API300多个,还有80个不常用或者不能调用的没有封装。...
- 易语言Python模块完美调用类和函数含OPENCV翻译配套模块
易语言Python模块完美调用类和函数例子源代码,本模块只支持python3.6版本,完美调用类和函数。...
- 易语言调用opencv2.4.13.6模块
易语言调用opencv2.4.13.6模块例子源代码,对数组每一个元素执行矩阵变换。...
- 自封装opencv找图DLL模块
易语言自封装opencv找图DLL模块例子源代码。...
- OpenCV图像处理识别模块
易语言OpenCV图像处理识别模块例子源代码,OpenCV是C++一个强大的图像处理、识别库。...
- OpenCV图像识别模块集合
易语言opencv模块集合例子源代码,主要最近学习这个东西。...
- OpenCV找图模块,调用OPENCV
OpenCV找图模块调用OPENCV例子源代码,从别的地方扣下来的找图代码。...