为什么在使用 Numpy 数组增亮图像时,灰度级在达到 255 后会重置为零然后递增而不是裁剪?

Why when brightening an image using a Numpy array, is the grey level reset to zero after hitting 255 then incremented instead of clipping?

我正在尝试做一些我们在 Matlab 中完成的实验,用于 python 中的视频分析模块,因为我已经在 Matlab 中完成了这些实验,但我遇到了图像增亮的问题.我已经将图像读入 Numpy 数组没有问题,但是当我使用以下代码尝试使它变亮然后显示它时:

    def imageProcessing(self, imageLocation):
        image = numpy.array(Image.open(imageLocation))
        imageGreyScale = numpy.array(Image.open(imageLocation).convert('L'))
        imageReadable = Image.fromarray(imageGreyScale)
        imageReadable.show()
        matplotlib.pyplot.hist(imageGreyScale.ravel(), 256, [0, 256]);
        matplotlib.pyplot.show()

        imageGreyScale = imageGreyScale+50
        imageReadableBrighter = Image.fromarray(imageGreyScale)
        imageReadableBrighter.show()
        matplotlib.pyplot.hist(imageGreyScale.ravel(), 256, [0, 256]);
        matplotlib.pyplot.show()

出于某种原因,像素值似乎达到 255,而不是 255(最大灰度级别)中 50 以内的数据,像素值似乎达到 255,然后返回到 0 并增加剩余的数量(见附图,红色的位在处理之前在绿色的位旁边,但可以说没有被剪裁而是“环回”) Graph of the histogram after adding 50 to every pixel value

现在我尝试添加条件赋值语句,如 Numpy.where() 等,但似乎无法使它们正常工作。谁能解释发生了什么或如何解决?谢谢。

使用: Python 版本 3.5, 最新版本的 Numpy, 最新版本的 PIL, 在最新版本的 MacOS

为什么 250 + 50 = 44?

在比特层面上,这样实现是最简单的。在8.bit另外,计算了所有8位并且不存储第九位(300=100101100b,44=101100b)。

如果 CPUs 以检查溢出然后用最小或最大有效值替换该值的方式实现,计算仍然是错误的,在某些情况下甚至更糟,它会即使在没有溢出机会的情况下也会变慢。

如何使 250 + 50 = 255?

CPU不会自动为您完成,但您可以自己完成。

您要做的是将 y = x + 50 替换为:

if x < 205:
    y = x + 50
else:
    y = 255

要在大型 numpy 数组上高效地执行此操作,请执行以下操作:

x = np.array([1, 2, 3, 100, 200, 220, 250], dtype=np.uint8)
y = x + 50
y[x > 205] = 255  # or y[y < 50] = 255

或者更短,在你的情况下:

imageGreyScale += 50
imageGreyScale[imageGreyScale < 50] = 255