不相交段的多边形化
Polygonization of disjoint segments
问题如下:我得到一个 png 文件:
example.png
我使用 skimage.segmentation.chan_vese
的通道过滤
- 它是 return 一个黑白的 png 文件。
我用 cv2.ximgproc.createFastLineDetector()
检测我的新 png 文件周围的片段
- 它是return一个列表一个段
但段列表表示不相交的段。
我使用两种简单的方法对这个段列表进行多边形化:
-似乎 cv2.ximgproc.createFastLineDetector()
创建了一个几乎连续的列表,所以我只是通过创建新的细分来加入:
import import skimage.segmentation as seg
import skimage.filters as filters
from PIL import Image, ImageDraw, ImageOps
import numpy as np
from skimage import data, img_as_float
import cv2 as cv2
points =Image.open(png_file)
points = ImageOps.grayscale(points)
points = np.asarray(points)
image_gray = points
points = img_as_float(points)
points = seg.chan_vese(points, mu=0.01, lambda1=2, lambda2=1, tol=1e-10, max_iter=2000,init_level_set="checkerboard")
print("seg done")
Image.fromarray(points).save("chan_vese.png")
输出是output.png
points =Image.open("chan_vese.png")
points = ImageOps.grayscale(points)
points = np.asarray(points)
#Create default parametrization LSD
lsd = cv2.ximgproc.createFastLineDetector()
#Detect lines in the image
lines = lsd.detect(points)
#Draw detected lines in the image
drawn_img = lsd.drawSegments(image_gray,lines)
#Show image
Image.fromarray(drawn_img).save(output_png)
#we got the segments now, but they are disjoints
我得到了这张图片,上面有一段,想有个主意:output_segments.png
list_segment = []
for segment in self.lines:
list_segment.append(segment[0])
new_lines = []
for i, segment in enumerate(list_segment):
if i < len(list_segment)-1:
new_lines.append([[list_segment[i][2], list_segment[i][3], list_segment[i+1][0], list_segment[i+1][1]]])
else:
new_lines.append([[list_segment[i][2], list_segment[i][3], list_segment[0][2], list_segment[0][3]]])
但是列表不是连续的,所以我得到了一些类似的人工制品
我得到了这个输出:output.png
- 第二个取norm2中最接近的一个:
for i, segment in enumerate(list_segment):
new_lines.append([segment])
dist_min = float("inf")
for j , segment2 in enumerate(list_segment):
if np.array_equal(segment, segment2):
distance1 = calcul_distance_points(segment[2], segment[3], segment2[0], segment2[1])
if distance1 < dist_min:
dist_min = distance1
new_lines.append(([[segment[0], segment[1], list_segment[j][0], list_segment[j][1]]]))
这个方法的问题是我可以跳边
我发现这个 paper 很好地回答了我的问题,但我正在寻找一种简单的方法来解决。
你有什么建议可以做到这一点,避免这种潜在的跳跃吗?
PS:这个算法的目的是在最后用这个多边形创建一个掩码。
所以我使用另一个库来解决这个问题:OpenCV-python
我们还检测了段(它们不是不相交的),但具有具有函数 findContours
的层次结构。层次结构很有用,因为该函数检测不同的多边形。这意味着我们可以使用其他方法的连接没有问题,如 post
中的解释
问题如下:我得到一个 png 文件: example.png
我使用
的通道过滤skimage.segmentation.chan_vese
- 它是 return 一个黑白的 png 文件。
我用
检测我的新 png 文件周围的片段cv2.ximgproc.createFastLineDetector()
- 它是return一个列表一个段
但段列表表示不相交的段。
我使用两种简单的方法对这个段列表进行多边形化:
-似乎 cv2.ximgproc.createFastLineDetector()
创建了一个几乎连续的列表,所以我只是通过创建新的细分来加入:
import import skimage.segmentation as seg
import skimage.filters as filters
from PIL import Image, ImageDraw, ImageOps
import numpy as np
from skimage import data, img_as_float
import cv2 as cv2
points =Image.open(png_file)
points = ImageOps.grayscale(points)
points = np.asarray(points)
image_gray = points
points = img_as_float(points)
points = seg.chan_vese(points, mu=0.01, lambda1=2, lambda2=1, tol=1e-10, max_iter=2000,init_level_set="checkerboard")
print("seg done")
Image.fromarray(points).save("chan_vese.png")
输出是output.png
points =Image.open("chan_vese.png")
points = ImageOps.grayscale(points)
points = np.asarray(points)
#Create default parametrization LSD
lsd = cv2.ximgproc.createFastLineDetector()
#Detect lines in the image
lines = lsd.detect(points)
#Draw detected lines in the image
drawn_img = lsd.drawSegments(image_gray,lines)
#Show image
Image.fromarray(drawn_img).save(output_png)
#we got the segments now, but they are disjoints
我得到了这张图片,上面有一段,想有个主意:output_segments.png
list_segment = []
for segment in self.lines:
list_segment.append(segment[0])
new_lines = []
for i, segment in enumerate(list_segment):
if i < len(list_segment)-1:
new_lines.append([[list_segment[i][2], list_segment[i][3], list_segment[i+1][0], list_segment[i+1][1]]])
else:
new_lines.append([[list_segment[i][2], list_segment[i][3], list_segment[0][2], list_segment[0][3]]])
但是列表不是连续的,所以我得到了一些类似的人工制品 我得到了这个输出:output.png
- 第二个取norm2中最接近的一个:
for i, segment in enumerate(list_segment):
new_lines.append([segment])
dist_min = float("inf")
for j , segment2 in enumerate(list_segment):
if np.array_equal(segment, segment2):
distance1 = calcul_distance_points(segment[2], segment[3], segment2[0], segment2[1])
if distance1 < dist_min:
dist_min = distance1
new_lines.append(([[segment[0], segment[1], list_segment[j][0], list_segment[j][1]]]))
这个方法的问题是我可以跳边
我发现这个 paper 很好地回答了我的问题,但我正在寻找一种简单的方法来解决。
你有什么建议可以做到这一点,避免这种潜在的跳跃吗?
PS:这个算法的目的是在最后用这个多边形创建一个掩码。
所以我使用另一个库来解决这个问题:OpenCV-python
我们还检测了段(它们不是不相交的),但具有具有函数 findContours
的层次结构。层次结构很有用,因为该函数检测不同的多边形。这意味着我们可以使用其他方法的连接没有问题,如 post