我有这样的作业,其中黑白图像可以用数组表示,其中的值 数组表示灰度级,例如白色=0,黑色=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.all
替换 np.sum
,以便它可以适用于任何背景。
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/