Python:使用9 * 9矩阵形成3 * 3的重叠矩阵

时间:2016-03-14 21:40:55

标签: python-2.7

我正在尝试使用像素矩阵创建像素邻域。像素矩阵是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)

2 个答案:

答案 0 :(得分:0)

我认为一个问题是你使用while / else。 else中的代码仅在while条件为true且while不会再次重复后执行。 This question可能会有所帮助。

因此,一旦输入else,它就永远不会再检查x<=ny<=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 ,因为它可以确保ni始终小于j

答案 1 :(得分:0)

通过将整个矩阵填充为零,我找到了更好的方法。因此它解决了负面的索引问题。 矩阵可以填充为

    pixels = np.pad(arr_Pixels, (1,1), mode='constant', constant_values=(0, 0))

它沿轴添加零行和列。