所以我的问题是一个相对简单的问题,但对于像我这样的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
问题是我只需要提取一组简单的数字,但我的代码一直在继续...而且,我不知道如何处理陷阱中的三角形问题。有人可以帮帮我吗?
通过提取,我的意思是只找出对象放置的位置......如果它完全被放置了!
答案 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界面感到满意