我正在实现一个图像的共生矩阵,以便能够通过亮度的变化检测图像的边缘。因此,我创建了一个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)
2条答案
按热度按时间w6lpcovy1#
关于你的代码,有一些事情需要指出。我不知道为什么你的整个矩阵都变成了零,但是这些事情应该会对你有所帮助:
1.这可能是由于stackoverflow中的格式设置所致,但您的矩阵在i循环的第一次迭代后返回。
1.实际上,您并没有在处理矩阵的值。您在0到256的范围内迭代。这会将对角线附近的所有值设置为0。根据您所说的要检测边缘的文本,我不确定这是否是您实际要做的。
1.除了创建名为difference的变量,您还可以将其简单地放在if语句
if(abs(i-j)<30:
中编辑:发现问题:你的代码是按计划运行的,这就是问题所在。所有的元素都在对角线上。我自己刚刚使用了一个测试图像,发现
np.sum(matrix)
和np.trace(matrix)
返回了相同的结果。所以当你的代码消除了对角线沿着的所有元素时,它会将所有元素都转换为0。qlckcl4x2#
你的代码看起来可以在Python 3.7.7和NumPy 1.18.1中正常工作:
你可以看到远离对角线的元素保持不变。你应该提供一个最小的工作例子来说明你的代码中出了什么问题。