我有一组图像:

最左边的是参考图像。
我想要一个值,告诉我任何其他图像离最左边的图像有多近。我尝试了matchShapes(),通过对每个等高线调用它并对值进行平均,但没有得到有用的结果(例如,最右边的一个值过高)。
我也希望匹配只在正确的方向工作。
发布于 2022-08-07 12:25:18
很难不让识别那些太不一样的图像。在这里提出的方法中,我总是得到非常接近的图像值,我认为这些图像太不一样了,无法对应。
最后,我做了一个多步骤的过程:
首先,我得到测试图像的轮廓,如下所示:
testContours, _ = cv.findContours(testImage, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)然后,如果测试图像与原始图像之间的等高线计数不相同,则放弃。
如果它们具有相同的等高线计数,则计算等高线的所有形状距离之间的平均值:
distances = []
sd = cv2.createShapeContextDistanceExtractor()
for i in range(len(testContours)):
d2 = sd.computeDistance(testContours[i], originalContours[i])
distances.append(d2)
value = sum(distances) / len(distances)然后,我计算两幅图像之后的白色像素数,除以源图像中的像素总数(以防轮廓匹配但位置不正确)。
exactly_placed_ratio = cv.countNonZero(cv.bitwise_and(testImage, originalImage)) / cv.countNonZero(originalImage)最后,我有两个值,第一个值可以用来检查形状是否足够接近,第二个值可以检查它们相对于整个图像的位置是否正确。
发布于 2022-08-04 18:59:56
如果它们是纯黑白图像,那么可能更容易将这两幅图片合并在一起,并将结果中的总像素相加。就像这样:
import cv2
import numpy as np
x = np.zeros((100,100))
y = np.zeros((100,100))
for i in range(25,75):
x[i][i] = 255
y[i][100-i] = 255
cv2.imshow('x', x)
cv2.imshow('y', y)
z = cv2.bitwise_and(x,y)
sum = 0
for i in range(0,z.shape[0]):
for j in range(0,z.shape[1]):
if z[i][j] == 255:
sum += 1
print(f"Similarity Score: {sum}")
cv2.imshow('z',z)
cv2.waitKey(0)可能有一些更好的库可以在一行中执行所有这些操作,但是如果性能没有多大的问题,也许这是可行的。
https://stackoverflow.com/questions/73240754
复制相似问题