本质上,我有一个 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 很陌生,所以我很感激这方面的任何帮助,谢谢。
本质上,我有一个 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 很陌生,所以我很感激这方面的任何帮助,谢谢。
这个解决方案怎么样:
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
您可以使用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
.