光栅图像外边缘路径

问题描述 投票:0回答:1

我正在寻求有关创建代码的最简单方法的建议,该代码将生成具有透明度的 PNG 图像轮廓的路径 (SVG)。它可以是 Python 脚本,也可以是命令行命令(image magick、potrace 等)。

这是一个例子。我有 PNG 透明文件,我想获取切割设备轮廓的路径。

enter image description here

编辑:我扫描图像的每一面以找到第一个不透明像素(红点)

enter image description here

然后我在每个点之间画线并修剪太长的线。

enter image description here

最后一步是在 alpha 通道上找到轮廓。

对于明星来说,看起来相当不错

enter image description here

python svg potrace
1个回答
0
投票

好的,我弄清楚了如何创建PNG 的轮廓并获取轮廓点。 现在我有了大约的轮廓。如何在这些点之间创建平滑的弯曲 SVG 路径?

enter image description here

import cv2
from svgwrite import Drawing

image = cv2.imread('output.png', cv2.IMREAD_UNCHANGED)

if image.shape[2] == 4:

    alpha_channel = image[:, :, 3]
    _, mask = cv2.threshold(alpha_channel, 1, 255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    largest_contour = max(contours, key=cv2.contourArea)
    epsilon = 0.001 * cv2.arcLength(largest_contour, True)
    approx = cv2.approxPolyDP(largest_contour, epsilon, True)

    cv2.drawContours(image, [approx], -1, (255, 123, 0), 3)
    for point in approx:
        cv2.circle(image, tuple(point[0]), 5, (255, 0, 0), -1)  # Draw points in red
    cv2.imshow('Test', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    #path_data = ...
    #dwg = Drawing('output.svg', profile='tiny')
    #dwg.add(dwg.path(d=path_data, fill="none", stroke="black", stroke_width=1))
    #dwg.save()

    print("End")
else:
    print("No alpha")

结果应该是这样的

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.