【问题标题】:Adding noise to image based on pixel value根据像素值向图像添加噪声
【发布时间】:2020-12-11 06:08:08
【问题描述】:

我想根据百分比为灰度图像添加高斯噪声

我想将眼睛区域中任何像素强度值的 5% 作为噪声添加到整个图像中,所以我想要做的是选择眼睛区域内的任何像素并给定它们的简单像素强度添加 5%整个图像的高斯噪声。

def generate_noisy_image(x, variance):
    noise = np.random.normal(0, variance, (1, x.shape[0]))
    return x + noise

def loadimage(path):
    filepath_list = listdir(path)
    for filepath in filepath_list:
        img = Image.open(path + filepath)
        img = img.resize((81, 150))
        img = np.asarray(img)
        generate_noisy_image(img, 0.025)
        img = Image.fromarray(img)
        img.save('C:/Users/noisy-images/'+filepath, 'JPEG')



loadimage('C:/Users/my_images/')

ValueError:操作数无法与形状一起广播 (150,81) (1,150)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-96-1bebb687f5e7> in <module>
     11 
     12 
---> 13 loadimage('source path from images')
     14 

<ipython-input-96-1bebb687f5e7> in loadimage(path)
      5         img = img.resize((81, 150))
      6         img = np.asarray(img)
----> 7         generate_noisy_image(img, 0.025)
      8         print(generate_noisy_image.shape)
      9         img = Image.fromarray(img)

<ipython-input-95-7cc3346953f6> in generate_noisy_image(x, variance)
      1 def generate_noisy_image(x, variance):
      2     noise = np.random.normal(0, variance, (1, x.shape[0]))
----> 3     return x + noise

【问题讨论】:

  • 您需要的第一件事是您将用作参考的 RGB 值。您需要进行并非微不足道的功能识别。
  • 图像是灰度的,特征已经被识别,我只是拍了这张照片,因为我想不出其他任何东西,呵呵,例如我只需要一个例子,它取任意像素的值图像并根据该灰度值向整个图像添加一些百分比的噪声,我应该能够从那里抓住问题
  • 我编辑了问题,以简单的方式指定我的目标
  • 复制粘贴错误消息时,请复制粘贴整个内容,包括堆栈跟踪和有关哪行代码产生错误的信息。这让我更容易理解我可能出错的地方。
  • 好的,我用堆栈跟踪更新了问题。

标签: python image-processing python-imaging-library noise noise-generator


【解决方案1】:

非常基本的示例,修改 np.array 的暗角以使其工作。

import numpy as np


def generate_noisy_image(x: np.array, variance: float) -> np.array:
    noise = np.random.normal(loc=0, scale=variance, size=x.shape)
    return x + noise


if __name__ == "__main__":
    img_2D = np.random.random(size=(81, 150))
    img_2D_fake = generate_noisy_image(x=img_2D, variance=0.05)

    var = np.var(img_2D_fake - img_2D)
    sigma_by_var = var ** 0.5

    sigma = np.std(img_2D_fake - img2D)


    print(f"variance={var}\nsigma_by_var={sigma_by_var}\nsigma={sigma}")

请记住,标准导数是方差的平方根。在上面的例子中,它应该打印一个 var ~0.0025 和一个 std ~0.05。

【讨论】:

  • 我正在尝试使用您的代码在 PIL 中调整图像大小,我得到以下信息:ValueError:操作数无法与形状 (150,81) (1,150) 一起广播。我将我的代码添加到主帖中。请帮助
  • 几天前我已经修复了错误,但感谢您的更新,我接受了您的回答。
猜你喜欢
  • 2019-07-23
  • 2014-09-05
  • 2013-10-17
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2020-06-14
  • 1970-01-01
相关资源
最近更新 更多