【问题标题】:Searching a sub-array inside a 2D array (image recognition) [closed]在二维数组中搜索子数组(图像识别)[关闭]
【发布时间】:2013-08-12 21:32:03
【问题描述】:

本质上,我有一个 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 还很陌生,所以我很感激任何帮助,谢谢。

【问题讨论】:

标签: python arrays search numpy image-recognition


【解决方案1】:

这个解决方案怎么样:

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

【讨论】:

  • 谢谢,这听起来很接近我想要做的事情。使用您发布的代码似乎给了我一个错误:AttributeError: 'bool' object has no attribute 'all',我使用 Python 2.7 会导致这种情况吗?
  • 发生这种情况时,您的变量 b 是单个数字而不是数组吗?
  • @user2672297,您能提供一个输入示例吗?我正在使用 Python 2.7.2,所以这应该不是问题。
  • 没关系,我解决了这个错误,我不小心将 small_array 输入作为 RGB 值的 数组而不是 。我想我现在可以让它工作了,谢谢你的帮助。 :)
  • 我添加了一个语句来检查小数组是否与切片的形状相同,这可以防止与评估边值和角值相关的错误。
【解决方案2】:

您可以使用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,:]

b 出现在a 中的索引可以使用:

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] 索引。

那么你必须用二维数组来解释这个:

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

挑战是找到212

【讨论】:

  • 我可能遗漏了一些东西,但我认为这行不通...如果您在a 中有一个恒定颜色的区域等于b 的任何像素,那么您将得到误报.
  • 我认为挑战将是找到模式以便在此示例中获得 212...可能存在几乎完全匹配的情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多