<p>下面是一个相当简单的方法:</p>
<ul>
<li>加载图像并丢弃多余的alpha通道</li>
<li>骷髅</li>
<li>过滤器寻找3x3邻域,这些邻域有中心像素集并且只有一个</li>
</ul>
<hr/>
<pre><code>#!/usr/bin/env python3
import numpy as np
from PIL import Image
from scipy.ndimage import generic_filter
from skimage.morphology import medial_axis
# Line ends filter
def lineEnds(P):
"""Central pixel and just one other must be set to be a line end"""
return 255 * ((P[4]==255) and np.sum(P)==510)
# Open image and make into Numpy array
im = Image.open('lines.png').convert('L')
im = np.array(im)
# Skeletonize
skel = (medial_axis(im)*255).astype(np.uint8)
# Find line ends
result = generic_filter(skel, lineEnds, (3, 3))
# Save result
Image.fromarray(result).save('result.png')
</code></pre>
<p><a href="https://i.stack.imgur.com/quqV2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/quqV2.png" alt="enter image description here"/></a></p>
<hr/>
<p>请注意,使用ImageMagick</strong>命令行,您可以获得完全相同的结果,所需的工作量要少得多:</p>
^{pr2}$
<p>或者,如果您希望它们是数字而不是图像:</p>
<pre><code>convert result.png txt: | grep "gray(255)"
</code></pre>
<p><strong>样本输出</strong></p>
<pre><code>134,78: (65535) #FFFFFF gray(255) < - line end at coordinates 134,78
106,106: (65535) #FFFFFF gray(255) < - line end at coordinates 106,106
116,139: (65535) #FFFFFF gray(255) < - line end at coordinates 116,139
196,140: (65535) #FFFFFF gray(255) < - line end at coordinates 196,140
</code></pre>
<hr/>
<p>另一种方法是使用<a href="https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.ndimage.morphology.binary_hit_or_miss.html" rel="nofollow noreferrer">scipy.ndimage.morphology.binary_hit_or_miss</a>,并将您的<em>“Hits”</em>设置为下图中的白色像素,将您的<em>“Misses”</em>设置为黑色像素:</p>
<p><a href="https://i.stack.imgur.com/BPsVI.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/BPsVI.png" alt="enter image description here"/></a></p>
<p>这个图表来自安东尼·蒂森的优秀材料<a href="https://www.imagemagick.org/Usage/morphology/#lineends" rel="nofollow noreferrer">here</a>。在</p>
<hr/>
<p>与上述类似,您可以将上面的<em>“Hits”</em>和<em>“Misses”</em>内核与<strong>OpenCV</strong>一起使用,如<a href="https://docs.opencv.org/trunk/db/d06/tutorial_hitOrMiss.html" rel="nofollow noreferrer">here</a>:</p>
<pre><code>morphologyEx(input_image, output_image, MORPH_HITMISS, kernel);
</code></pre>
<p>我想这是最快的方法。在</p>
<hr/>
<p><strong>关键词</strong>:Python、图像、图像处理、行尾、行尾、形态、命中或未命中、HMT、ImageMagick、filter。在</p>