【问题标题】:Using python to change contrast of an image but its too SLOW使用 python 来改变图像的对比度,但它太慢了
【发布时间】:2021-06-09 17:15:13
【问题描述】:

我正在尝试从头开始在 python 中实现更改对比度。但它太慢了,处理一张图像大约需要 30 秒。太多的for循环可能是这个问题,但任何人都可以建议我如何优化的正确方法。对不起,如果这是一个幼稚的问题。但确实需要一些新的视角来处理这个问题。以防有人对因子值感到好奇,它的范围是 -0.5,0,0.5,2。

def ChangeContrast(self,factor):

        img= self.img
        self.height,self.width = img.shape[:2]
        for ch in range(self.channels):
            for i in range(self.height):
                for j in range(self.width):
                            img[i][j][ch]= np.clip(factor * (img[i,j][ch] - 128)+ 128,0,255)

                    
        return img

谢谢!!

【问题讨论】:

  • 如果您仍然使用 numpy,那么您可以使用 numpy 数组操作而不是嵌套循环来更改像素,这应该快几个数量级。

标签: python numpy image-processing


【解决方案1】:

Python 是一种天生就很慢的语言,因此每次向 Python 解释器传递一行代码时,性能都会受到影响。

Numpy 是解决此问题的一种方法,因为 numpy 允许您一次对整个数组进行操作。

实际上很容易将嵌套的 for 循环转换为:

np.clip(factor*(img - 128)+128,0,255)

根据经验,在处理图像时,opencv 会比 numpy 提供更好的性能。但既然你说你是从头开始实施,我猜你不是在寻找那个。

编辑:

在您的 for 循环中,您将项目分配用于具有整数数据类型的 numpy 数组,因此 numpy 会自动将结果转换为整数。但在我的版本中,numpy 创建了一个新数组并决定它应该是浮点数,因为它是通过将浮点数(因子)与数组相乘而创建的。

基本上,您必须决定如何处理浮点运算。您是否想存储额外的精度并以浮点数处理事物(需要更多的计算时间和内存,而且您必须在保存图像或将其传递给其他库之前转换回来,因为它们通常只处理整数)或做你只想处理整数?

如果您只想要整数,请使用:

np.array((np.clip(factor*(img - 128)+128,0,255), np.int8)

【讨论】:

  • 试过这个np.clip(factor*(img - 128)+128,0,255) 替换循环,但不知何故结果不一样。我从头开始实施它的原因是因为我想更多地了解深度工作
  • @Hitesh,我认为这与 numpy 试图通过使用浮点数来提供帮助有关,我已经用更多细节编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2014-08-08
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多