2012-11-08 37 views
1

所以我的問題是一個比較簡單的問題,但對於像我這樣的Python新手來說還是相當困難。 所以我基本上在輸入圖像中有一些形狀,就像一個正方形左右的一串小三角形。我需要從圖像中提取外部正方形和每個三角形。我已經開發了一個簡單的模板匹配代碼來做到這一點......但它似乎並沒有工作!Python圖像匹配。從nxn圖像中找到mxm圖像

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 

的問題是,我需要提取唯一一組簡單的數字,但我的代碼的推移和......另外,我不知道如何處理三角形在一個盒子裏的問題。有人可以幫我嗎?

通過提取,我的意思是隻找出物體的放置位置......如果它放在所有位置!

+0

你會probabl我想要使​​用比原始矩陣操作更高級的東西,除非圖像非常簡單。你有沒有嘗試過OpenCV python綁定?關於你的形狀,他們是CGI,掃描文件,照片?他們總是正確的導向?他們有顏色嗎?一張圖片在這裏值得一千字。 – goncalopp

+0

嘿,我的圖像是這樣的:http://www.cc.gatech.edu/~vbettada/images/ravens.jpg 我的問題,你可以在第二個看到的是,我必須得到一個加上一條線,或者一個正方形和一條線......我可以得到外形......或內部形狀......但從來都不是!圖像是.gif文件.. –

+0

哦,所以你正在試圖編寫一個智商高的程序,我看到:) – goncalopp

回答

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接口

+0

哦等等...所以我已經提取了我發給你的那種圖像。現在,我的問題是,比如你在其中一箇中間有一箇中間有一條線的方格。我需要檢測到有一個正方形和一條線。我有一套模板,我只需要做一個模板匹配並找到答案。我的問題是,有沒有更簡單的方法來做到這一點...?一些特徵提取方法還是如此? –

+0

@gran_profaci如果你在這個答案中使用代碼,你只需要檢查圖像中有多少段。如果有一個,那就是廣場;如果有兩個,裏面有東西。顯然,您可以根據矩形座標進行更多測試,以隔離其他分段中包含的分段。如果你想,你可以嘗試一些機器學習方法,但似乎矯枉過正,恕我直言。有關該方法,請參閱http://stackoverflow.com/questions/9413216/simple-digit-recognition-ocr-in-opencv-python – goncalopp