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

标签 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]]

最佳答案

它绝对可以针对速度进行优化,但这里有一个简单的修复方法。它从数组/图像两端迭代行和列,并在找到包含像素的第一行/列时停止,这样它就不会删除任何内部区域。

编辑:用 np.all 替换 np.sum,以便它可以适用于任何背景。

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

关于python - 删除矩阵中的行或列时输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51962649/

相关文章:

python - 让 python 脚本检查缺少的模块并在缺少时安装

python - 在 numpy 数组中一次访问 block

Python 在 matplotlib 中设置 x 轴数据框的问题

python - 在python中查找没有重复数字的年份

python - 更改 LabelMaker 一周的开始日期(composeml 库)

python - 如何使用另一个数组和值的索引来获取数组中的值?

python - 准确度测量值 val_acc 可信吗?

无限循环中的Python用户输入太慢,容易混淆

python - 如何为 pip 设置默认的 python 版本?

python - 为什么 `max` 和 `min` 与 numpy.nan 有如此奇怪的行为?