我有此分配,其中黑白图像可以由数组表示,其中 数组表示灰度等级,例如白色= 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]]
答案 0 :(得分:0)
另一个使用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]
答案 1 :(得分:0)
我有一个简单的递归方法。使用了.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]])