3 回答

TA贡献1898条经验 获得超8个赞
它绝对可以针对速度进行优化,但这里有一个简单的解决方法。它从数组/图像的两端遍历行和列,并在找到包含像素的第一行/列后停止,因此不会删除任何内部区域。
编辑:替换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]])

TA贡献1796条经验 获得超7个赞
我有一个简单的递归方法。已使用,.all()所以背景可以改变
import numpy as np
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
def remove_outlines():
global img_in,background
if (img_in[0,:]==background).all():
img_in = np.delete(img_in,0,0)
elif (img_in[img_in.shape[0]-1,:]==background).all():
img_in = np.delete(img_in,img_in.shape[0]-1,0)
elif (img_in[:,0]==background).all():
img_in = np.delete(img_in,0,1)
elif (img_in[:,img_in.shape[1]-1]==background).all():
img_in = np.delete(img_in,img_in.shape[1]-1,1)
else:
return
remove_outlines()
remove_outlines()
输出 -
>>> img_in
array([[ 1. , 0. , 0.5],
[ 0.5, 0. , 0. ],
[ 0.3, 0. , 0.3]])

TA贡献1966条经验 获得超4个赞
另一种选择是使用list:
img_in = img_in.tolist()
flag = 1
while flag != 0 :
a = 0
b = 0
for i in img_in:
if i[len(i)-1] == background:
a += 1
if i[0] == background:
b += 1
flag = 0
for i in img_in:
if a==len(img_in):
del i[len(i)-1]
flag = 1
if b==len(img_in):
del i[0]
flag = 1
for index, i in enumerate(img_in):
if index == 0 or index == len(img_in) - 1:
if all(number == background for number in img_in[index]):
del img_in[index]
添加回答
举报