【问题标题】:Most efficient way to change the mean and standard deviation of each channel in an RGB image to custom values?将 RGB 图像中每个通道的均值和标准差更改为自定义值的最有效方法?
【发布时间】:2021-02-13 18:52:46
【问题描述】:

我有一个 512x512 RGB 图像的数据集。我有两个 1x3 数组

mean_value  = [0.485,0.456,0.406]
std_value = [0.229,0.224,0.225]

每个元素代表一个 RGB 通道的所需均值和标准差。 这是计算新图像的公式,1个下标代表原始图像,2个下标代表期望的均值和标准。

到目前为止,我的代码包含一个用于遍历所有通道的 for 循环。

for i in range(3):
        norm_tmp = np.subtract(img[:,:,i],np.mean(img[:,:,i]))
        std_mult = np.divide(std_value[i],np.std(img[:,:,i]))
        img[:,:,i] = np.add(mean_value[i],np.multiply(norm_tmp,std_mult))

但是,我想避免这种情况,并可能找到一个没有 for 循环的 numpy 实现。我也看到了一些使用 openCV 函数的尝试,所以如果有一个有效的函数,我也会很高兴,但到目前为止我还没有找到令人满意的解决方案。

【问题讨论】:

    标签: python performance numpy image-processing


    【解决方案1】:

    你可以做广播:

    # random data
    np.random.seed(42)
    img = np.random.rand(512,512,3)
    
    norm_tmp = img - img.mean(axis=-1)[...,None]
    std_mul = std_value / img.std(axis=-1)[...,None]
    scaled_img = mean_value + norm_tmp * std_mul
    

    输出(左侧刻度)

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 1970-01-01
      • 2018-05-30
      • 2012-10-15
      • 2017-04-28
      • 2020-05-22
      • 2014-04-27
      • 2016-02-07
      • 2020-09-04
      相关资源
      最近更新 更多