You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为图像轮廓添加数字标注并提取指定编号轮廓的坐标

给图像轮廓添加数字标注并提取指定轮廓坐标

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

目标图像

陶瓷图像轮廓

轮廓标注与坐标提取代码

我把原代码做了优化,现在可以给每个轮廓自动标上编号,还能精准提取你指定的轮廓坐标:

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()

使用说明

  1. 运行代码后,会弹出带有绿色数字标注的图像,每个轮廓都对应唯一编号
  2. 修改代码里的TARGET_CONTOUR数值,换成你需要提取的轮廓编号
  3. 程序会自动计算该轮廓的面积,并把坐标保存到contour_编号.txt文件中,同时用红色高亮你选中的轮廓,方便确认是否选对

内容的提问来源于stack exchange,提问作者Chanchal Dixit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:27:15