从Python中的二进制图像获取像素边界坐标(非边缘)

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

我有一个二进制图像,其中包含一个连续的斑点,没有孔。我想基于边缘像素的外部边缘创建一个多边形对象。我知道如何获取边缘像素本身,但是我想要像素边界的实际坐标,按顺时针或逆时针排序。所有像素均具有整数坐标。

例如,假设我在(2,2)有一个像素。多边形的顶点为:(2.5、2.5)(2.5、1.5)(1.5,1.5)(1.5、2.5)(2.5,2.5)

是否有确切的,非近似的方法?最好用Python?

python image image-processing polygon scikit-image
1个回答
0
投票
from PIL import Image, ImageFilter, ImageChops
import math

a = [['.','.','.','.','.','.','.'],
      ['.','.','.','.','.','.','.'],
      ['.','.','.','.','.','.','.'],
      ['.','#','#','#','.','.','.'],
      ['.','#','#','#','.','.','.'],
      ['.','.','.','.','.','.','.']]      

sz=(len(a[0]), len(a))
flat_list = [j=='.' for i in a for j in i]
image=Image.new('1', sz)
image.putdata(flat_list)
contour=ImageChops.difference(image, image.filter(ImageFilter.MinFilter(3)))
contour_list=list(contour.getdata())
points=[divmod(i,sz[0]) for i in range(len(contour_list)) if contour_list[i]]
points_x,points_y=zip(*points)
avg=lambda x: sum(x)/len(x)
mean_x=avg(points_x)
mean_y=avg(points_y)
phase=[(math.atan2(points_y[i]-mean_y, points_x[i]-mean_x),i) \
       for i in range(len(points))] 
phase.sort()
for i in range(len(points)):
    print(*points[phase[i][1]])
© www.soinside.com 2019 - 2024. All rights reserved.