首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于OpenCV的黑白图像识别

基于OpenCV的黑白图像识别
EN

Stack Overflow用户
提问于 2022-08-04 18:32:08
回答 2查看 113关注 0票数 0

我有一组图像:

最左边的是参考图像。

我想要一个值,告诉我任何其他图像离最左边的图像有多近。我尝试了matchShapes(),通过对每个等高线调用它并对值进行平均,但没有得到有用的结果(例如,最右边的一个值过高)。

我也希望匹配只在正确的方向工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-07 12:25:18

很难不让识别那些太不一样的图像。在这里提出的方法中,我总是得到非常接近的图像值,我认为这些图像太不一样了,无法对应。

最后,我做了一个多步骤的过程:

首先,我得到测试图像的轮廓,如下所示:

代码语言:javascript
复制
testContours, _ = cv.findContours(testImage, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

然后,如果测试图像与原始图像之间的等高线计数不相同,则放弃。

如果它们具有相同的等高线计数,则计算等高线的所有形状距离之间的平均值:

代码语言:javascript
复制
    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)

然后,我计算两幅图像之后的白色像素数,除以源图像中的像素总数(以防轮廓匹配但位置不正确)。

代码语言:javascript
复制
     exactly_placed_ratio = cv.countNonZero(cv.bitwise_and(testImage, originalImage)) / cv.countNonZero(originalImage)

最后,我有两个值,第一个值可以用来检查形状是否足够接近,第二个值可以检查它们相对于整个图像的位置是否正确。

票数 0
EN

Stack Overflow用户

发布于 2022-08-04 18:59:56

如果它们是纯黑白图像,那么可能更容易将这两幅图片合并在一起,并将结果中的总像素相加。就像这样:

代码语言:javascript
复制
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)

可能有一些更好的库可以在一行中执行所有这些操作,但是如果性能没有多大的问题,也许这是可行的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73240754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档