如何在Numpy数组中找到矩形区域?

时间:2019-05-09 23:00:12

标签: python numpy

我有一个代表图片像素矩阵的numpy矩阵。这张图片包含字母,我想找到所有垂直笔划并替换其单元格的值。

简单的字母“ r”形可能看起来像这样

] enter image description here 左:输入位图

右:预期输出,请注意水平笔划被忽略。试想一下,这样的字母可以是无限的,而茎宽度未知。但是,让我们说我们将永远知道笔划的粗细,只是不知道笔划的粗细。

[
[255, 255, 255, 255],
[255,   0,   0, 255],
[255,   0, 255, 255],
[255,   0, 255, 255],
[255,   0, 255, 255],
[255, 255, 255, 255]
]

您将如何找到所有垂直矩形?所以输出看起来像这样

[
[False, False, False, False],
[False,  True, False, False],
[False,  True, False, False],
[False,  True, False, False],
[False,  True, False, False],
[False, False, False, False]

谢谢

2 个答案:

答案 0 :(得分:0)

可能不是最有效,也不是最通用的方法,但是它可以起作用:

import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import convolve2d

image = np.asarray( [
                [255, 255, 255, 255],
                [255,   0,   0, 255],
                [255,   0, 255, 255],
                [255,   0, 255, 255],
                [255,   0, 255, 255],
                [255, 255, 255, 255]
                ] )

imageI = 255 - image
kernel=np.ones(3).reshape(3,1)

out= convolve2d( imageI, kernel, mode='full' )

out2 = out > 255

print out2[ 1 : len(image) + 1 ]

根据需要提供

 >> [[False False False False]
 >> [False  True False False]
 >> [False  True False False]
 >> [False  True False False]
 >> [False  True False False]
 >> [False False False False]]

答案 1 :(得分:0)

您可以简单地使用垂直中值过滤器:

scipy.ndimage.filters.median_filter(
    a, size=(3, 1)
)
# array([[255, 255, 255, 255],
#        [255,   0, 255, 255],
#        [255,   0, 255, 255],
#        [255,   0, 255, 255],
#        [255,   0, 255, 255],
#        [255, 255, 255, 255]])