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

时间:2018-08-22 08:23:14

标签: python

我有此分配,其中黑白图像可以由数组表示,其中 数组表示灰度等级,例如白色= 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]]

2 个答案:

答案 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]])