搜索2D阵列内的子阵列(图像识别)

时间:2013-08-11 13:15:21

标签: python arrays search numpy image-recognition

基本上,我有一个numpy图像数组,我试图找到它是否包含特定RGB像素值的2x2块。因此,例如,如果我的(简化)图像数组类似于:

A B C D E F

G H I J K L

M N O P Q R

S T U V W X

我正在尝试检查它是否包含,说:

J K

P Q

我对numpy很新,所以我很感激你的帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

这个解决方案怎么样:

1)识别大数组中小数组右上角左侧元素的所有位置。

2)检查对应于每个给定元素的大数组的切片是否与小数组完全相同。

假设切片的左上角元素是5,我们会在大数组中找到5的位置,然后去检查5的左下角的大数组的切片是否相同作为小阵列。

import numpy as np

a = np.array([[0,1,5,6,7],
              [0,4,5,6,8],
              [2,3,5,7,9]])

b = np.array([[5,6],
              [5,7]])

b2 = np.array([[6,7],
               [6,8],
               [7,9]])

def check(a, b, upper_left):
    ul_row = upper_left[0]
    ul_col = upper_left[1]
    b_rows, b_cols = b.shape
    a_slice = a[ul_row : ul_row + b_rows, :][:, ul_col : ul_col + b_cols]
    if a_slice.shape != b.shape:
        return False
    return (a_slice == b).all()

def find_slice(big_array, small_array):
    upper_left = np.argwhere(big_array == small_array[0,0])
    for ul in upper_left:
        if check(big_array, small_array, ul):
            return True
    else:
        return False

结果:

>>> find_slice(a, b)
True
>>> find_slice(a, b2)
True
>>> find_slice(a, np.array([[5,6], [5,8]]))
False

答案 1 :(得分:0)

您可以使用np.in1d使用主数组的扁平数组(比如a和子数组,比如说b)来有效地执行此操作。

假设示例:

a = np.random.random((100,50))
i=4
j=8
m=12
n=16
b = a[i:j,m:n]

并添加一些重复的不完整模式:

a[0,:3] = b[0,:3]
a[4,40:44] = b[0,:]
a[4,44:48] = b[1,:]
a[8,:4] = b[3,:]

ba出现的索引可以使用以下方式获取:

c = np.where(np.lib.arraysetops.in1d(a.flat,b.flat)==True)[0]
#array([  0,   1,   2, 212, 213, 214, 215, 240, 241, 242, 243, 244, 245, 246, 247, 262, 263, 264, 265, 312, 313, 314, 315, 362, 363, 364, 365, 400, 401, 402, 403], dtype=int64)

看到前三个指数不是你的答案,因为模式不完整。您只需要定义一个规则来检查模式是否完整,即检查属于同一行的b.shape[0]b.shape[1]个索引的位置。

然后你必须根据2D数组解释这个:

i = 212/a.shape[1]
j = i+b.shape[0]
m = 212 % a.shape[1]
n = m+b.shape[1]

挑战在于找到212