为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2021-05-30 10:44:32
我有此分配,其中一个黑白图像可以由一个数组表示,其中数组中的值表示灰度等级,例如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]]
查看完整描述

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


查看完整回答
反对 回复 2021-06-01
?
芜湖不芜

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


查看完整回答
反对 回复 2021-06-01
?
慕标5832272

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]


查看完整回答
反对 回复 2021-06-01
  • 3 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号