Python绘制多个特定元素的轮廓
我有一个二值图像,我试图对延长的元素(不是圆)进行轮廓处理。 如果我试图勾勒出一个元素的轮廓,它就会勾勒出正确的颜色。但是当我有一个for循环时,怎么做呢?它仅显示具有正确颜色的最后一个元素。 这是我的密码: 输入数学Python绘制多个特定元素的轮廓,python,contour,cv2,Python,Contour,Cv2,我有一个二值图像,我试图对延长的元素(不是圆)进行轮廓处理。 如果我试图勾勒出一个元素的轮廓,它就会勾勒出正确的颜色。但是当我有一个for循环时,怎么做呢?它仅显示具有正确颜色的最后一个元素。 这是我的密码: 输入数学 for i in range(len(contours)): ctr = contours[i] M = cv2.moments(ctr) cX = M['m10']/M['m00'] cY = M['m01']/M['m00']
for i in range(len(contours)):
ctr = contours[i]
M = cv2.moments(ctr)
cX = M['m10']/M['m00']
cY = M['m01']/M['m00']
rgb = cv2.cvtColor(img_mask, cv2.COLOR_GRAY2RGB)
cv2.drawContours(rgb, contours, i, (255, 0, 0), 2)
rot_rect = cv2.minAreaRect(ctr)
box = np.int64(cv2.boxPoints(rot_rect))
xx1=(box[0,0]+box[1,0])/2
yy1=(box[0,1]+box[1,1])/2
xx2=(box[2,0]+box[1,0])/2
yy2=(box[2,1]+box[1,1])/2
distance1 = math.sqrt( ((xx1-cX)**2)+((yy1-cY)**2) )
distance2 = math.sqrt( ((xx2-cX)**2)+((yy2-cY)**2) )
if (distance1 < 0.5*distance2) or (0.5*distance1 > distance2):
cv2.drawContours(rgb, [box], -1, (0, 255, 0), 2)
plt.imshow(rgb)
else:
cv2.drawContours(rgb, [box], -1, (0, 0, 255), 2)
plt.imshow(rgb)
适用于范围内的i(透镜(轮廓)):
ctr=等高线[i]
M=cv2.力矩(ctr)
cX=M['m10']/M['m00']
cY=M['m01']/M['m00']
rgb=cv2.CVT颜色(img_掩码,cv2.COLOR_GRAY2RGB)
cv2.绘制等高线(rgb,等高线,i,(255,0,0),2)
rot_rect=cv2.Minareact(ctr)
box=np.int64(cv2.boxPoints(rot_rect))
xx1=(框[0,0]+框[1,0])/2
yy1=(框[0,1]+框[1,1])/2
xx2=(框[2,0]+框[1,0])/2
yy2=(框[2,1]+框[1,1])/2
距离1=数学sqrt((xx1 cX)**2)+(yy1 cY)**2))
距离2=数学sqrt((xx2 cX)**2)+(yy2 cY)**2))
如果(距离1<0.5*距离2)或(0.5*距离1>距离2):
cv2.绘制等高线(rgb,[box],-1,(0,255,0),2)
plt.imshow(rgb)
其他:
cv2.绘制轮廓(rgb,[box],-1,(0,0,255),2)
plt.imshow(rgb)
这对我很有帮助。我将相关轮廓保存到相关阵列(请注意,它们必须是阵列而不是列表,以便我们可以在轮廓绘制方法中使用它们)。
导入数学
ctr1=[]
ctr2=[]
对于范围内的i(透镜(轮廓)):
ctr=等高线[i]
M=cv2.力矩(ctr)
cX=M['m10']/M['m00']
cY=M['m01']/M['m00']
rgb=cv2.CVT颜色(img_掩码,cv2.COLOR_GRAY2RGB)
rot_rect=cv2.Minareact(ctr)
box=np.int64(cv2.boxPoints(rot_rect))
xx1=(框[0,0]+框[1,0])/2
yy1=(框[0,1]+框[1,1])/2
xx2=(框[2,0]+框[1,0])/2
yy2=(框[2,1]+框[1,1])/2
距离1=数学sqrt((xx1 cX)**2)+(yy1 cY)**2))
距离2=数学sqrt((xx2 cX)**2)+(yy2 cY)**2))
如果(距离1<0.5*距离2)或(0.5*距离1>距离2):
ctr1.append(np.asarray(ctr,dtype=np.int32))
其他:
ctr2.append(np.asarray(ctr,dtype=np.int32))
cv2.等高线图(rgb,ctr1,-1,(255,0,0),5)
cv2.等高线图(rgb,ctr2,-1,(0,255,0),2)
import math
ctr1= []
ctr2= []
for i in range(len(contours)):
ctr = contours[i]
M = cv2.moments(ctr)
cX = M['m10']/M['m00']
cY = M['m01']/M['m00']
rgb = cv2.cvtColor(img_mask, cv2.COLOR_GRAY2RGB)
rot_rect = cv2.minAreaRect(ctr)
box = np.int64(cv2.boxPoints(rot_rect))
xx1=(box[0,0]+box[1,0])/2
yy1=(box[0,1]+box[1,1])/2
xx2=(box[2,0]+box[1,0])/2
yy2=(box[2,1]+box[1,1])/2
distance1 = math.sqrt( ((xx1-cX)**2)+((yy1-cY)**2) )
distance2 = math.sqrt( ((xx2-cX)**2)+((yy2-cY)**2) )
if (distance1 < 0.5*distance2) or (0.5*distance1 > distance2):
ctr1.append(np.asarray(ctr, dtype=np.int32))
else:
ctr2.append(np.asarray(ctr, dtype=np.int32))
cv2.drawContours(rgb, ctr1, -1, (255, 0, 0),5)
cv2.drawContours(rgb, ctr2, -1, (0, 255, 0),2)