我正在尝试使用像素矩阵创建像素邻域。像素矩阵是1波段图像中的像素矩阵。现在我必须形成3 * 3的矩阵,将9 * 9矩阵的每个元素保持在中心并且每个元素都有一个邻居。因此,(0,0)位置的元素将具有相邻元素
[[0 0 0],
[0 2 3],
[0 3 4]]
第一行和最后一行和第一列中的所有元素都会发生同样的情况。 Attached image可以帮助您更好地理解。
因此得到的矩阵的大小为81 * 81。没有必要以矩阵的形式保存小矩阵。
我在下面尝试过,
n = size[0]
z= 3
x=y=0
m =0
while all( [x<0, y<0, x>=n, y>=n]):
continue
else:
for i in range(0, n):
arcpy.AddMessage("Hello" )
for x in range(m,m+3):
temp_matrix = [ [ 0 for i in range(3) ] for j in range(3) ]
for y in range(m,m+3):
temp_matrix[x][y] = arr_Pixels[x][y]
m+=1
y+=1
temp_List.append(temp_matrix)
但是我得到error: list assignment out of index.
它看起来太冗长和令人困惑。我知道错误正在发生,因为数组temp_matrix长度没有增加。
有没有更好的方法在图像中实现矩阵?较小的矩阵可以保存到列表而不是矩阵中。请帮帮我。
更新#2
n = size[0]
new_matrix = []
for i in range(0,n):
for j in range(0,n):
temp_mat = [ [ 0 for k in range(3) ] for l in range(3) ]
for k in range(i-1, i+2):
for l in range(j-1,j+2):
if any([k<0, l<0, k>n-1, l>n-1]):
temp_mat[k][l] = 0
else:
temp_mat[k][l] = arr_Pixels[k][l]
new_matrix.append(temp_mat)
答案 0 :(得分:0)
我认为一个问题是你使用while / else。 else
中的代码仅在while条件为true且while
不会再次重复后执行。 This question可能会有所帮助。
因此,一旦输入else
,它就永远不会再检查x<=n
和y<=n
,这意味着x和y可以增加到n之外,我假设它是{的长度{1}}。
一种更好的方法是创建两个嵌套的for循环,从0增加到n并创建临时邻域矩阵并将它们添加到9x9矩阵。这是一个粗略的大纲:
arr_Pixels
此方法可以避免检查您访问的索引是否小于new_matrix = [] //future 9x9 matrix
for i in range(0, n):
for j in range(0, n):
// create a neighborhood matrix going around (i, j)
// add temp matrix to new_matrix
,因为它可以确保n
和i
始终小于j
。
答案 1 :(得分:0)
通过将整个矩阵填充为零,我找到了更好的方法。因此它解决了负面的索引问题。 矩阵可以填充为
pixels = np.pad(arr_Pixels, (1,1), mode='constant', constant_values=(0, 0))
它沿轴添加零行和列。