为图像轮廓添加数字标注并提取指定编号轮廓的坐标
给图像轮廓添加数字标注并提取指定轮廓坐标
我来帮你搞定给图像里的每个轮廓加数字标注,以及提取指定编号轮廓坐标的事儿~
目标图像

轮廓标注与坐标提取代码
我把原代码做了优化,现在可以给每个轮廓自动标上编号,还能精准提取你指定的轮廓坐标:
import numpy as np import cv2 THRESHOLD = 55 # 修改这里的数值,指定你要提取的轮廓编号 TARGET_CONTOUR = 0 im = cv2.imread("ceramic.bmp") imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(imgray,THRESHOLD,255,0) _th,contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) print(f"检测到的轮廓总数 = {len(contours)}") # 给每个轮廓标注对应的编号 for idx, cnt in enumerate(contours): # 计算轮廓中心位置,用来放编号文本 M = cv2.moments(cnt) if M["m00"] != 0: cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) else: cX, cY = 0, 0 # 在轮廓中心绘制编号 cv2.putText(im, str(idx), (cX - 10, cY + 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 画出所有轮廓(方便观察) cv2.drawContours(im, [cnt], -1, (1,70,255), 1) # 提取指定编号的轮廓信息 if TARGET_CONTOUR < len(contours): area = cv2.contourArea(contours[TARGET_CONTOUR]) print(f"编号{TARGET_CONTOUR}的轮廓面积: {area}") # 把轮廓坐标写入文本文件 np.set_printoptions(threshold=np.inf) coords = np.array2string(contours[TARGET_CONTOUR]) with open(f"contour_{TARGET_CONTOUR}.txt", "w") as f: f.write(coords) # 用红色高亮指定的目标轮廓,方便确认 cv2.drawContours(im, contours, TARGET_CONTOUR, (0, 0, 255), 2) cv2.imshow("带编号的轮廓图", im) cv2.waitKey(0) cv2.destroyAllWindows()
使用说明
- 运行代码后,会弹出带有绿色数字标注的图像,每个轮廓都对应唯一编号
- 修改代码里的
TARGET_CONTOUR数值,换成你需要提取的轮廓编号 - 程序会自动计算该轮廓的面积,并把坐标保存到
contour_编号.txt文件中,同时用红色高亮你选中的轮廓,方便确认是否选对
内容的提问来源于stack exchange,提问作者Chanchal Dixit
相关产品推荐
相关产品推荐

