python - OpenCV 中使用图像矩进行字体匹配

标签 python opencv image-processing machine-learning computer-vision

我正在创建一个代码,它会告诉我两个字母彼此有多相似。 为此,我决定采用 OpenCV 中的 HuMoments 概念。

给出的是我拥有的图像

公司.jpg C0.jpg

A.jpg A.jpg

科罗拉多州.jpg Colorado.jpg

我正在使用以下方式阅读图像:

im5 = cv2.imread("images/C0.jpg",cv2.IMREAD_GRAYSCALE)
im7 = cv2.imread("images/Colorado.jpg",cv2.IMREAD_GRAYSCALE)
im9 = cv2.imread("images/A.jpg",cv2.IMREAD_GRAYSCALE)

我正在使用cv2.matchShapes属性来匹配:

m6 = cv2.matchShapes(im5, im7, cv2.CONTOURS_MATCH_I2,0)
m8 = cv2.matchShapes(im5, im9, cv2.CONTOURS_MATCH_I2,0)

最后我打印输出:

print("C0.png and Colorado.png : {}".format(m6))
print("C0.png and A.jpg : {}".format(m8))

此处最接近零 (0) 的值表示完美匹配

我的输出:

$ python3 shapeMatcher.py 
Shape Distances Between 
-------------------------
C0.png and Colorado.png : 0.10518804385516889
C0.png and A.jpg : 0.0034705987357361856

C0 和 Colorado 不匹配,但显示正确。让我困惑的一件事是 C0.jpg 和 A.jpg 怎么会很接近?我是否遗漏了一些东西,有什么替代方法可以使 C0 和 A 之间不匹配?请注意,值接近零意味着最接近的匹配。

最佳答案

根据the documentation , cv2.matchShapes 需要轮廓作为输入,而不是图像。

This tutorial有一个示例用法:

import cv2
import numpy as np

img1 = cv2.imread('star.jpg',0)
img2 = cv2.imread('star2.jpg',0)

ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]

ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret

(请注意,findContours 语法已从 OpenCV 2 更改为 OpenCV 3。)

关于python - OpenCV 中使用图像矩进行字体匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56607680/

相关文章:

python - 为什么 time.strptime ("Sept. 30, 2014", "%b. %d, %Y") 不工作

python - Cython 偏导数

python - 如何在 python 文件处理中从 namedtuple 中提取数据

c++ - SVM(支持 vector 机)opencv

matlab - 自适应阈值——最小误差阈值方法的实现

c - RobuSTLy 以亚像素精度找到图像 block 的局部最大值

python - 来自 Pylint 的 Cell-var-from-loop 警告

python - 有没有办法提高 opencv 视频处理的速度?

opencv - 如何获取用于 HaarCascade 训练的汽车样本图像?

python - 在 OpenCV 中从带有孔的掩模侧面腐 eclipse x 像素