【问题标题】:Calculating perimeter of an organic shape计算有机形状的周长
【发布时间】:2019-07-11 08:56:43
【问题描述】:

我使用 Python 通过将白色像素的数量乘以单个像素的面积来计算黑白图像上的面积或不规则形状。

但是,现在我还需要计算这个不规则形状的周长。该形状可能有孔。这是一个示例图像:

有什么想法可以解决这个问题吗? 我不是一个完整的新手,但我也不是编码员。我猜是经验丰富的初学者。

提前致谢。

编辑: 有些事情我仍然不明白,但这对我有用:

import cv2
import numpy as np



def import_image(filename):
    original_image = cv2.imread(filename, cv2.IMREAD_UNCHANGED)
    return original_image

#getting original file
img = import_image('PerimeterImage.jpg')

#converting to gray
img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#set a thresh
thresh = 1

#get threshold image
ret,thresh_img = cv2.threshold(img_grey, thresh, 255, cv2.THRESH_BINARY)

#find contours
image, contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#create an empty image for contours
img_contours = np.zeros(img.shape)

perimeter = 0

for c in contours:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.0001 * peri, True)
    cv2.drawContours(img_contours, [approx], -1, (0, 0, 255), 1)
    perimeter = perimeter + peri

print(f'Perimeter = {int(round(perimeter,0))} pixels')

#show image
cv2.imshow('Output', img_contours)
cv2.waitKey(0)

#save image
cv2.imwrite('contours.jpg', img_contours) 

【问题讨论】:

标签: python image-processing


【解决方案1】:

只要用cv.findContours寻找白色区域的轮廓,一般在findContours之前都要做阈值,但由于你的图像是黑白的,所以你可以忽略它。

对于周长,只需将cv.arcLength 用于您想要的轮廓。

【讨论】:

    【解决方案2】:

    我认为没有简单的方法可以做到这一点。

    我已经包含了两种非常相似的方法。这两种方法都使用 opencv 库及其魔力。如果您对如何做到这一点的简化版本感兴趣,第二个主要是在那里。

    方法一(首选)

    我认为这对你来说是最简单的选择。

    import cv2 as cv
    img = cv.imread('img.jpg', 0) #Get your image
    edges = cv2.Canny(img,100,200)
    

    然后你可以计算像素得到周长。

    更多信息请见here


    方法二
    1. 首先,使用拉普拉斯算子得到图像梯度幅度。
    laplacian = cv.Laplacian(img, cv.CV_64F)
    
    1. 然后,您可以转到第 3 步或执行此操作以获得更准确的结果。使用非最大抑制使边缘变薄 1 个像素。这并不容易,但是您可以在上面的精明链接中找到对这背后的想法的解释。

    2. 计算剩余像素以获得周长。

    您应该知道这将是不完美的,因为对象内部的黑点等东西也会被计算在内。如果你不想 也就是说,您可以在非最大抑制之前执行关闭操作:

    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    

    注意:这些解决方案假设您的输入图像将始终与您提供的图像相同。如果不是,则必须进行一些更改。

    【讨论】:

    • 1:沿轮廓计算像素严重低估了周长。 2:Canny 和拉普拉斯零交叉都是寻找灰度图像边缘的方法。 OP中的图像是二进制的,不需要做任何复杂的事情来找到周长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多