关联两个骨架图像:Python

时间:2015-04-22 12:17:52

标签: python opencv image-processing

import cv2
import numpy as np
from PIL import Image 
from skimage import morphology
from scipy import signal

img = cv2.imread('thin.jpg',0)
img1 = cv2.imread('thin1.jpg',0)
cv2.imshow('image1',img)
cv2.imshow('image2',img1)
ret,img = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
ret,img1 = cv2.threshold(img1,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
size = np.size(img)
size1 = np.size(img1)
skel = np.zeros(img.shape,np.uint8)
skel1 = np.zeros(img1.shape,np.uint8)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
img = 255 - img
img1 = 255 - img1
img = cv2.dilate(img,element,iterations=8)
img1 = cv2.dilate(img1,element,iterations=8)

done = False

while(not done):
eroded = cv2.erode(img,element)
eroded1 = cv2.erode(img1,element)
temp = cv2.dilate(eroded,element)
temp1 = cv2.dilate(eroded1,element)
temp = cv2.subtract(img,temp)
temp1 = cv2.subtract(img1,temp1)
skel = cv2.bitwise_or(skel,temp)
skel1 = cv2.bitwise_or(skel1,temp1)
img = eroded.copy()
img1 = eroded1.copy()

zeros = size - cv2.countNonZero(img)
if zeros==size:
    done = True
 cv2.imshow('IMAGE',skel)
 cv2.imshow('TEMPLATE',skel1)
 cv2.imwrite("image.jpg",skel)
 if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

这是我尝试使用二值化和细化方法将两个灰度图像转换为两个骨架图像的代码,并且还获得了结果。现在有了这两个角色化的图像,我想做一个比较,看看它们是否匹配。我怎么能相互关联?我们需要将这个被转换为二维数组吗?有谁能提出任何解决方案。提前谢谢。

template Query

3 个答案:

答案 0 :(得分:0)

二进制图像已经表示为2D numpy数组。

这是一个复杂的问题。您可以通过将图像重新整形为两个向量(假设它们的大小完全相同),然后计算相关系数来完成此操作:

SignOut

答案 1 :(得分:0)

您可以通过多种方式比较图像,看它们是否匹配。最简单的是进行逐像素减法以创建新图像,然后对新图像中的像素求和。如果它们总和为零,则表示您具有完全匹配。总和越大,匹配越差。

然而,在骨架化图像上使用大多数比较技术时会遇到问题。您拍摄图像并将其缩小为细小的线条,这些线条不太可能与仅相互偏离的图像重叠。

使用镂空图像,您经常需要比较功能。例如,识别骨架的交叉点,并使用这些点的位置来比较图像。在样本图像中,您可以提取线条(我看到三个主要线条),然后根据线条的位置比较图像。

答案 2 :(得分:0)

一种可能的解决方案是将每个骨架化图像的模糊版本相互关联(或减去)。

这样,骨架线之间不可避免的微小偏移不会对结果产生如此负面的影响,就好像你直接减去骨架一样(因为骨架线很可能不会完全叠加在一起)。

我在这里假设原始图像首先不相似,否则你不需要对它们进行镂空,对吗?