Numpy矩阵正在重置其内部的值

qjp7pelc  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(108)

我正在实现一个图像的共生矩阵,以便能够通过亮度的变化检测图像的边缘。因此,我创建了一个256x256的numpy矩阵来存储共生矩阵,然后我编写了一个函数,如果矩阵中所有的共生矩阵的值之间的变化小于某个值(如30),则该函数将这些值变为0。即矩阵的i和j之间的差小于30,则该单元内的值变为0。
这是一个函数,它取共生矩阵,并把值变成0。

def nullify(matrix):
   for i in range (0,matrix.shape[0]):
      for j in range(0,matrix.shape[1]):
          if(abs(i-j)<30):
             matrix[i,j]=0
    return matrix

但是由于某种原因,它把整个矩阵都变成了0,当我使用一个更小的矩阵,比如3x3时,这个函数可以很好的工作。
这是我用来计算

def calculateCooccurrence(im):
    Horizontal = np.zeros((256, 256))
    
    for i in range (0,im.size[0]):
        for j in range (0,im.size[1]-1):
            pixelRGB = im.getpixel((i,j))
            R,G,B = pixelRGB 
            brightness = int(sum([R,G,B])/3)
            pixelRGB1 = im.getpixel((i,j+1))
            R1,G1,B1 = pixelRGB 
            brightness1 = int(sum([R1,G1,B1])/3)
            Horizontal[brightness,brightness1]+=1
            
    Vertical = np.zeros((256, 256))
    for i in range (0,im.size[0]-1):
        for j in range (0,im.size[1]):
            pixelRGB = im.getpixel((i,j))
            R,G,B = pixelRGB 
            brightness = int(sum([R,G,B])/3)
            pixelRGB1 = im.getpixel((i+1,j))
            R1,G1,B1 = pixelRGB 
            brightness1 = int(sum([R1,G1,B1])/3)
            Vertical[brightness,brightness1]+=1
            
    return Horizontal,Vertical

这就是我所做的

horiz,vertic=calculateCooccurrence(im2)
horizon=nullify(horiz)
w6lpcovy

w6lpcovy1#

关于你的代码,有一些事情需要指出。我不知道为什么你的整个矩阵都变成了零,但是这些事情应该会对你有所帮助:
1.这可能是由于stackoverflow中的格式设置所致,但您的矩阵在i循环的第一次迭代后返回。
1.实际上,您并没有在处理矩阵的值。您在0到256的范围内迭代。这会将对角线附近的所有值设置为0。根据您所说的要检测边缘的文本,我不确定这是否是您实际要做的。
1.除了创建名为difference的变量,您还可以将其简单地放在if语句if(abs(i-j)<30:
编辑:发现问题:你的代码是按计划运行的,这就是问题所在。所有的元素都在对角线上。我自己刚刚使用了一个测试图像,发现np.sum(matrix)np.trace(matrix)返回了相同的结果。所以当你的代码消除了对角线沿着的所有元素时,它会将所有元素都转换为0。

qlckcl4x

qlckcl4x2#

你的代码看起来可以在Python 3.7.7和NumPy 1.18.1中正常工作:

>>> import numpy as np
>>> matrix = np.ones((256, 256))
>>> def nullify(matrix):
...    for i in range (0,matrix.shape[0]):
...       for j in range(0,matrix.shape[1]):
...           if(abs(i-j)<30):
...              matrix[i,j]=0
...    return matrix
... 
>>> nullify(matrix)
array([[0., 0., 0., ..., 1., 1., 1.],
       [0., 0., 0., ..., 1., 1., 1.],
       [0., 0., 0., ..., 1., 1., 1.],
       ...,
       [1., 1., 1., ..., 0., 0., 0.],
       [1., 1., 1., ..., 0., 0., 0.],
       [1., 1., 1., ..., 0., 0., 0.]])

你可以看到远离对角线的元素保持不变。你应该提供一个最小的工作例子来说明你的代码中出了什么问题。

相关问题