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

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


德玛西亚99
浏览 118回答 3
3回答

汪汪一只猫

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

芜湖不芜

我有一个简单的递归方法。已使用,.all()所以背景可以改变import numpy as npimg_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.0def 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_inarray([[ 1. ,  0. ,  0.5],       [ 0.5,  0. ,  0. ],       [ 0.3,  0. ,  0.3]])

慕标5832272

另一种选择是使用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 = 1for 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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python