gpt4 book ai didi

python - 如何检测连接图像上元素的角 "joints"?

转载 作者:行者123 更新时间:2023-12-01 10:17:04 25 4
gpt4 key购买 nike

我通过 Python 3.7 使用 OpenCV。我有一组看起来像这样的单色图像:

enter image description here

我想在这些图像上找到所有“关节点”,其中“关节点” - 是两个木板的每个交叉点的中心(1 像素)。这些“关节”大致由下图中的红色圆圈表示:

enter image description here

第一个想法是对图像进行骨架化,然后通过算法找到所有连接的边缘,但所有骨架化技术都给了我摆动或圆角和额外的“芽”。

import cv2
import numpy as np
from skimage.morphology import skeletonize

image = cv2.imread("SOURCE_IMAGE.jpg", cv2.IMREAD_GRAYSCALE)
binary_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 91, 12)
skeleton = (skeletonize(binary_image//255) * 255).astype(np.uint8)

结果:

enter image description here

第二个想法是找到内部轮廓,将它们近似为边界点,找到最近的邻居,然后以某种方式计算中心,但是,再一次,Canny 边缘检测方法给了我摆动的角和额外的点。
import cv2

image = cv2.imread("SOURCE_IMAGE.jpg", cv2.IMREAD_GRAYSCALE)
edged = cv2.Canny(image, 100, 200)

结果:

enter image description here

这个问题有任何可靠的方法吗?

最佳答案

这是 @YunusTemurlenk's 的轻微修改版本使用 Python 而不是 C++ 的方法。这个想法是:

  • 获取二值图像。 加载图片,转灰度,Gaussian blur ,然后 Otsu's threshold .
  • 获取水平和垂直线掩码。 使用 cv2.getStructuringElement 创建水平和垂直结构元素然后执行 cv2.morphologyEx 隔离线。
  • 寻找关节。 我们 cv2.bitwise_and 将两个面具放在一起以获得关节。
  • 在关节 mask 上找到质心。 我们find contours然后计算centroid .


  • 水平/垂直线掩码




    检测到的关节呈绿色

    enter image description here

    结果

    enter image description here
    import cv2
    import numpy as np

    # Load image, grayscale, Gaussian blur, Otsus threshold
    image = cv2.imread('1.jpg')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (3,3), 0)
    thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

    # Find horizonal lines
    horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10,1))
    horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)

    # Find vertical lines
    vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,10))
    vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)

    # Find joints
    joints = cv2.bitwise_and(horizontal, vertical)

    # Find centroid of the joints
    cnts = cv2.findContours(joints, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
    # Find centroid and draw center point
    M = cv2.moments(c)
    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])
    cv2.circle(image, (cx, cy), 3, (36,255,12), -1)

    cv2.imshow('thresh', thresh)
    cv2.imshow('horizontal', horizontal)
    cv2.imshow('vertical', vertical)
    cv2.imshow('joints', joints)
    cv2.imshow('image', image)
    cv2.waitKey()

    关于python - 如何检测连接图像上元素的角 "joints"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60633334/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com