Python图像匹配。从nxn图像中查找mxm图像

时间:2012-11-08 00:59:37

标签: python image-processing python-imaging-library

所以我的问题是一个相对简单的问题,但对于像我这样的Python新手来说仍然很难。 所以我基本上在输入图像中有许多形状,就像一堆正方形的小三角形。我需要从图像中提取外部正方形和每个三角形。我已经开发了一个简单的模板匹配代码来执行此操作......但它似乎不起作用!

while ( len(numpy.where( b <150 )[0])!=xx):
xx=len(numpy.where( b <150 )[0])
for v in range(len(b)-len(a)):
    for w in range(len(b[0])-len(a[0])):
        c=b[v:v+len(a[0]),w:w+len(a)]
        c.flags.writeable=False
        #c=b.reshape(len(a),len(a))
        vv=sum(sum(c-a))
        #print v, w
        if(vv<minval):
            minval=vv
            xcor=v
            ycor=w

print xcor, ycor, minval
print len(numpy.where( b <150 )[0])
print b[xcor:xcor+len(a),ycor:ycor+len(a[0])]
for p in range(xcor,xcor+len(a)):
    for q in range(ycor,ycor+len(a[0])):
        b.setflags(write=True)
        b[p][q]=251;
#print b[xcor:xcor+len(a),ycor:ycor+len(a[0])]
xcorr=0
ycorr=0
minval=99999

问题是我只需要提取一组简单的数字,但我的代码一直在继续...而且,我不知道如何处理陷阱中的三角形问题。有人可以帮帮我吗?

通过提取,我的意思是只找出对象放置的位置......如果它完全被放置了!

1 个答案:

答案 0 :(得分:0)

如果您决定使用opencv,这应该可以帮助您入门:

import cv2

def show_image_and_wait_for_key( image, name="Image" ):
    print "showing",name,"(waiting for input)"
    cv2.imshow('norm',image)
    cv2.waitKey(0)

def draw_segments( image , segments, color=(255,0,0), line_width=1):
        '''draws segments on image'''
        for segment in segments:
            x,y,w,h= segment
            cv2.rectangle(image,(x,y),(x+w,y+h),color,line_width)

original= cv2.imread("ravens.jpg")
image=original
image= cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
image= cv2.GaussianBlur(image,(3,3),0)
_, image= cv2.threshold( image, 140, 255, cv2.THRESH_BINARY )
contours,hierarchy = cv2.findContours(image.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
segments= [cv2.boundingRect(c) for c in contours] 
draw_segments( original, segments )
show_image_and_wait_for_key( original )

此后,您可以按矩形区域,位置,宽高比等进行过滤。 您可以使用此功能从图像中提取区域:

def region_from_segment( image, segment ):
    '''given a segment (rectangle) and an image, returns it's corresponding subimage'''
    x,y,w,h= segment
    return image[y:y+h,x:x+w]

所有图片也都是numpy ndarray,所以你应该对cv2界面感到满意