在OpenCV中使用图像力矩进行字体匹配

时间:2019-06-15 05:39:58

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

我正在创建一个代码,该代码将告诉我两个字母之间的相似程度。 为此,我决定在OpenCV中使用HuMoments概念。

给出我拥有的图像

Co.jpg C0.jpg

A.jpg A.jpg

Colorado.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和科罗拉多州不匹配,可以正确显示。让我感到困惑的一件事是C0.jpg和A.jpg的匹配程度如何?我是否缺少某些东西,还有一种替代方法可以使C0和A之间不匹配?请注意,值接近零表示最匹配。

1 个答案:

答案 0 :(得分:1)

根据the documentationcv2.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。)