我有一堆图片(来自M.C. Escher收藏),我想要整理它们,所以我首先想到的步骤是通过比较它们(你知道的,有些具有不同的分辨率/形状等)来将它们分组。
我编写了一个非常粗暴的脚本来: * 读取文件 * 计算它们的直方图 * 进行比较
但是比较的质量真的很低,就像有些完全不同的文件匹配起来了。
请看看我到目前为止所写的内容:
准备直方图。
Original Answer: "最初的回答"
现在,举个例子,我找到了这两个文件的匹配项: m._c._escher_244_(1933).jpg
和
m._c._escher_208_(1931).jpg
使用上述代码,它们之间的相关性是0.9996699595530539(所以它们几乎相同:( )
我做错了什么?如何改进代码以避免这种错误匹配?
谢谢!
最初的回答:以上的代码使用的是图像的平均哈希算法来比较它们的相似度。然而,对于一些图像,这种方法可能会导致错误的匹配结果。要改善结果,你可以尝试使用其他算法,例如结构化相似性索引(SSIM)算法进行比较。
我编写了一个非常粗暴的脚本来: * 读取文件 * 计算它们的直方图 * 进行比较
但是比较的质量真的很低,就像有些完全不同的文件匹配起来了。
请看看我到目前为止所写的内容:
准备直方图。
Original Answer: "最初的回答"
files_hist = {}
for i, f in enumerate(files):
try:
frame = cv2.imread(f)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
hist = cv2.calcHist([frame],[0],None,[4096],[0,4096])
cv2.normalize(hist, hist, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
files_hist[f] = hist
except Exception as e:
print('ERROR:', f, e)
对比直方图
pairs = list(itertools.combinations(files_hist.keys(), 2))
for i, (f1, f2) in enumerate(pairs):
correl = cv2.compareHist(files_hist[f1], files_hist[f2], cv2.HISTCMP_CORREL)
if correl >= 0.999:
print('MATCH:', correl, f1, f2)
现在,举个例子,我找到了这两个文件的匹配项: m._c._escher_244_(1933).jpg
![m._c._escher_244_(1933).jpg](https://i.imgur.com/HpNedoS.jpg)
m._c._escher_208_(1931).jpg
![m._c._escher_208_(1931).jpg](https://i.imgur.com/N4N6hy9.jpg)
cv::norm()
函数和NORM_L2
方法来比较两张图片。 - Bahramdun Adil