gpt4 book ai didi

python - 删除矩阵中的行或列时输出错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:19:25 24 4
gpt4 key购买 nike

我有这个作业,其中黑白图像可以用数组表示,其中数组表示灰度级别,例如white=0,black=1,灰度为数字介于 0 和 1 之间。当图像具有固定的背景颜色时,通过移除具有恒定颜色的图像外部部分来裁剪图像会很有用。

我想创建一个函数,将表示黑白图像的数组作为输入,作为代表背景颜色的 0 到 1 之间的数字。该函数必须返回裁剪后的图像,其中所有值等于给定背景颜色的前导和尾随行和列都被删除。

我试过这个:

def imageCrop(img_in,background):
for i in range(len(img_in)):
if np.sum(img_in[i,:])==background:
img_out= np.delete(img_in,img_in[i,:],axis=1)
elif np.sum(img_in[-i,:])==background:
img_out=np.delete(img_in,img_in[-i,:],axis=1)
elif np.sum(img_in[:,i])==background:
img_out= np.delete(img_in,img_in[:,i],axis=0)
elif np.sum(img_in[:,-i])==background:
img_out=np.delete(img_in,img_in[:,-1])
return img_out

输入是:

img_in = np.array([[0, 1, 0, 0.5, 0, 0],[0, 0.5, 0, 0, 0, 0],[0, 0.3, 0, 0.3, 0, 0],[0, 0, 0, 0, 0, 0]])
background = (0.0)

输出应该是:

[[1,0,0.5],[0.5,0,0],[0.3,0,0.3]]

所以每行或每列与背景总和相同的都会被删除

现在我的输出是:

[[1,0,0.5,0,0],[0.5,0,0,0,0],[0.3,0,0.3,0,0],[0,0,0,0,0]]

最佳答案

它绝对可以针对速度进行优化,但这里有一个简单的修复方法。它从数组/图像的两端遍历行和列,一旦找到包含像素的第一行/列就停止,这样它就不会删除任何内部区域。

编辑:将 np.sum 替换为 np.all 以便它适用于任何背景。

def imageCrop(img_in,background):
rows_to_delete = []
cols_to_delete = []
n_rows = img_in.shape[0]
n_cols = img_in.shape[1]

for i in range(n_rows):
if np.all(img_in[i, :] == background):
rows_to_delete.append(i)
else:
break

for i in range(1, n_rows):
if np.all(img_in[-i, :] == background):
rows_to_delete.append(n_rows-i)
else:
break

for i in range(n_cols):
if np.all(img_in[:,i] == background):
cols_to_delete.append(i)
else:
break

for i in range(1, n_cols):
if np.all(img_in[:,-i] == background):
cols_to_delete.append(n_cols-i)
else:
break

img_out = np.delete(img_in, rows_to_delete, axis=0)
img_out = np.delete(img_out, cols_to_delete, axis=1)

return img_out

输出:

array([[1. , 0. , 0.5],
[0.5, 0. , 0. ],
[0.3, 0. , 0.3]])

否则,如果要删除所有与背景总和相同的行和列:

def imageCrop(img_in,background):
rows_to_delete = []
cols_to_delete = []
n_rows = img_in.shape[0]
n_cols = img_in.shape[1]

for i in range(n_rows):
if np.all(img_in[i, :] == background):
rows_to_delete.append(i)

for i in range(n_cols):
if np.all(img_in[:,i] == background):
cols_to_delete.append(i)

img_out = np.delete(img_in, rows_to_delete, axis=0)
img_out = np.delete(img_out, cols_to_delete, axis=1)

return img_out

输出

array([[1. , 0.5],
[0.5, 0. ],
[0.3, 0.3]])

关于python - 删除矩阵中的行或列时输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51962649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com