python - 从图像( map )中提取多边形坐标

标签 python numpy opencv computer-vision scikit-image

我有以下 map :

enter image description here

我想提取多边形坐标(像素),我正在使用以下代码段,但带内标的图像均为0(错误):

import numpy as np
from skimage import io, measure, morphology
from skimage.io import imsave, imread

img = io.imread('map.png', as_gray=True)
imsave("test.png", img)

img = morphology.binary_dilation(img, selem=np.ones((5,5)))

img_inverted = np.invert(img)
img_inverted_labeled = measure.label(img_inverted)

n_lbls = np.unique(img_inverted_labeled)[1:]

pols = []
for i in n_lbls:
  img_part = (img_inverted_labeled == i)
  pols.append(measure.find_contours(img_part, level=0)[0])

倒像如下:

enter image description here

我相信probem是这一行中selem的值:
img = morphology.binary_dilation(img, selem=np.ones((5,5)))

您能告诉我这段代码是什么问题吗..

编辑
反转图像(灰度)时的唯一值:
[235, 227, 219, 212, 204, 230, 215, 199, 207, 188, 184, 172, 176, 196, 192, 179, 223, 211, 203, 173, 191, 228, 216, 232, 200, 208, 171, 183, 175, 180, 195, 236, 221, 234, 233, 226, 220]

我认为我需要根据某个阈值将这些值分为两类(白色/黑色)。您能否确认我的发现,如果可以,我该如何计算该值?

最佳答案

是的,这里有一个阈值会起作用。看一下图像0.7的最小值和最大值似乎是合理的:

import numpy as np
from skimage import io, measure, morphology
from skimage.io import imsave, imread
from matplotlib import pyplot as plt

img = io.imread('map.png', as_gray=True)
# do thresholding
mask = img < 0.7

plt.matshow(mask, cmap='gray')

# ij coords of perimeter
coords = np.nonzero(mask)
coords
>>> (array([ 61,  61,  61, ..., 428, 428, 428]),
     array([200, 201, 202, ..., 293, 294, 295]))

produced mask

而且,如果您只是想要边界线而不是面积(因为它具有宽度),则可以执行以下操作:
from skimage.morphology import skeletonize

fig, ax = plt.subplots(dpi=150)
ax.matshow(skeletonize(mask), cmap='gray')

skeletonized

关于python - 从图像( map )中提取多边形坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61833327/

相关文章:

c++ - 在图像上的矩形区域之外填充黑色

python - 相当于 tf.depth_to_space 的 keras 模型

python - 如何在 Python Matplotlib 中向雷达图点添加标签

python - Theano - 共享变量作为大型数据集函数的输入

python - 使用 python 在 XML 文件中获取唯一项对

python - Pandas 找到最大稳定区间

python - 2D 可变迭代器/生成器

c++ - 如何计算图像的梯度?

python - 突出显示 QTextEdit 文档上的行

c++ - 安装 OpenCV 时遇到问题?