【问题标题】:How to set overflowed subtraction in python to result in a zero?如何在python中设置溢出减法以产生零?
【发布时间】:2018-04-07 18:41:38
【问题描述】:

我正在尝试寻找与基线有显着差异的区域。

为此,我从基础图像中减去当前图像,fb 是灰度二维图像矩阵。

diff = f - b

某些操作会导致溢出,这会导致像素值较高的区域实际上应该设置为零。

如果f[x][y] b[x][y] ,我如何指定操作diff = f - b 应该为单个像素值产生0?

【问题讨论】:

  • 将差异限制为 0 会使一个方向的变化不可见。也许你想要abs(f - b)
  • 我愿意,但我想要一个矩阵函数,我不想自己写一个,因为速度可能会很糟糕。

标签: python numpy image-processing


【解决方案1】:

这是在 numpy 中执行此操作的一种方法,不需要转换为更大的整数类型:

f - b.clip(None, f)

或者,等价的,

f - np.minimum(b, f)

【讨论】:

  • 非常优雅的解决方案!
【解决方案2】:

我通过制作自己的函数来解决这个问题,该函数在减去每个像素之前比较每个像素以防止发生任何溢出。

def custom_sub(i2,i1):      
    x =  len(i1)
    y =  len(i1[0])

    o = deepcopy(i1)

    for ix in range(x):             
            for iy in range(y):
                if i1[ix][iy] > i2[ix][iy]:
                    o[ix][iy] = 0
                else:
                    o[ix][iy] = i2[ix][iy]-i1[ix][iy]
    return o

这是输出,现在只有火花闪光发生的明亮区域。

这个question 和我的很像。在我的例子中,减法是使用 uint8 类型执行的,这可以转换为 int16。然后可以迭代生成的图片并删除任何负数。

【讨论】:

  • 确实,签名差异是正确的方法。 Numpy 也有裁剪功能。 np.clip 或类似的东西。比遍历所有像素更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 2021-04-20
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多