<p>我认为维耶纳的问题更与一个<a href="http://en.wikipedia.org/wiki/Inpainting" rel="nofollow noreferrer">inpainting</a>问题有关。</p>
<p>以下是一些想法:</p>
<ul>
<li><p>为了填补黑白图像中的空白,可以使用一些<em>填充</em>算法,比如<a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.morphology.binary_fill_holes.html#scipy.ndimage.morphology.binary_fill_holes" rel="nofollow noreferrer">scipy.ndimage.morphology.binary_fill_holes</a>。但是你有一个灰度图像,所以你不能使用它。</p></li>
<li><p>我想你不想用复杂的修补算法。我的第一个建议是:不要尝试使用最接近的灰度值(您不知道NaN像素的实际值)。使用最接近的值将生成脏算法。相反,我建议您用其他值(例如行的平均值)来填补空白。您可以使用<a href="http://scikit-learn.org/stable/index.html" rel="nofollow noreferrer">scikit-learn</a>:</p></li>
</ul>
<p><a href="https://stackoverflow.com/a/18001880/3153644">Source:</a></p>
<pre><code>>>> from sklearn.preprocessing import Imputer
>>> imp = Imputer(strategy="mean")
>>> a = np.random.random((5,5))
>>> a[(1,4,0,3),(2,4,2,0)] = np.nan
>>> a
array([[ 0.77473361, 0.62987193, nan, 0.11367791, 0.17633671],
[ 0.68555944, 0.54680378, nan, 0.64186838, 0.15563309],
[ 0.37784422, 0.59678177, 0.08103329, 0.60760487, 0.65288022],
[ nan, 0.54097945, 0.30680838, 0.82303869, 0.22784574],
[ 0.21223024, 0.06426663, 0.34254093, 0.22115931, nan]])
>>> a = imp.fit_transform(a)
>>> a
array([[ 0.77473361, 0.62987193, 0.24346087, 0.11367791, 0.17633671],
[ 0.68555944, 0.54680378, 0.24346087, 0.64186838, 0.15563309],
[ 0.37784422, 0.59678177, 0.08103329, 0.60760487, 0.65288022],
[ 0.51259188, 0.54097945, 0.30680838, 0.82303869, 0.22784574],
[ 0.21223024, 0.06426663, 0.34254093, 0.22115931, 0.30317394]])
</code></pre>
<ul>
<li>使用最接近值的脏溶液可以是:
1) 找到南部地区的周界点
2) 计算NaN点和周长之间的距离
3) 用最近的点灰度值替换NaNs</li>
</ul>