【问题标题】:how to remove salt and pepper noise from images using python?如何使用 python 从图像中去除椒盐噪声?
【发布时间】:2014-04-11 11:36:08
【问题描述】:

我已尝试实现以下算法,但生成的图像看起来相同。

第 1 步:读取噪声图像。

第 2 步:选择大小为 3x3 的 2D 窗口,中心元素为 处理像素。假设像素为 处理的是P ij .

第 3 步:如果 P ij 是一个未损坏的像素(即 0

第 4 步:如果 P ij = 0 或 P ij = 255,然后 P ij 是损坏的像素。

第 5 步:如果 3/4 th 所选窗口中的像素或更多像素有噪点 然后将窗口大小增加到 5x5。 步骤 6:如果所选窗口中的所有元素都是 0,并且 255的,然后替换P ij 与元素的平均值 在窗口中,否则转到第 7 步。

第 7 步:从所选窗口中消除 0 和 255 并找到剩余元素的中值。 替换 Pij 中值。

第 8 步:重复第 2 步到第 6 步,直到整个像素 图像已处理。

这是我的代码。请提出改进​​建议。

import Image

im=Image.open("no.jpg")
im = im.convert('L')

for i in range(2,im.size[0]-2):
    for j in range(2,im.size[1]-2):
        b=[]
        if im.getpixel((i,j))>0 and im.getpixel((i,j))<255:
            pass
        elif im.getpixel((i,j))==0 or im.getpixel((i,j))==255:
            c=0
            for p in range(i-1,i+2):
                for q in range(j-1,j+2):
                    if im.getpixel((p,q))==0 or im.getpixel((p,q))==255: 
                        c=c+1
            if c>6:
                c=0
                for p in range(i-2,i+3):
                    for q in range(j-2,j+3):
                        b.append(im.getpixel((p,q)))
                        if im.getpixel((p,q))==0 or im.getpixel((p,q))==255:
                            c=c+1
                if c==25:
                    a=sum(b)/25
                    print a
                    im.putpixel((i,j),a)
                else:
                    p=[]
                    for t in b:
                        if t not in (0,255):
                            p.append(t)
                    p.sort()
                    im.putpixel((i,j),p[len(p)/2])
            else:
                b1=[]
                for p in range(i-1,i+2):
                    for q in range(j-1,j+2):
                        b1.append(im.getpixel((p,q)))
                im.putpixel((i,j),sum(b1)/9)

im.save("nonoise.jpg")   

【问题讨论】:

  • 您是如何确定这两个图像相同的。目视检查或图像差异?除了几个像素外,它们可能看起来很相似。查看代码的一个问题是,无论像素是 0 还是 255,您都将附加到临时数组(b 和 b1)。如果您只想要有效像素的中位数,则需要在您之前进行额外的测试附加。其次,您正在计算平均值,而不是中位数 (numpy.median)

标签: python image image-processing noise noise-reduction


【解决方案1】:

你应该使用median filter,它很容易实现并且对椒盐噪声非常有效。

【讨论】:

    【解决方案2】:

    正如 Olivier 建议的那样,中值滤波器提供了最好的结果。

    这是我为在图像中添加椒盐噪声而生成的代码。 该代码适用于带有 OpenCV 3.0.0 的 python:

    import numpy as np
    import cv2
    
    img = cv2.imread('3.jpg', 1)
    row,col,ch = img.shape
    p = 0.5
    a = 0.009
    noisy = img
    
      # Salt mode
    num_salt = np.ceil(a * img.size * p)
    coords = [np.random.randint(0, i - 1, int(num_salt))
              for i in img.shape]
    noisy[coords] = 1
    
      # Pepper mode
    num_pepper = np.ceil(a * img.size * (1. - p))
    coords = [np.random.randint(0, i - 1, int(num_pepper))
              for i in img.shape]
    noisy[coords] = 0
    
    cv2.imshow('noisy', noisy)
    

    这里是使用中值滤波器的代码:

    median_blur= cv2.medianBlur(noisy, 3)
    cv2.imshow('median_blur', median_blur)  
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    可以根据需要修改用于模糊噪声图像的窗口。

    【讨论】:

      【解决方案3】:

      您的输入图像是什么样的?您的算法假设只有像素值 0 和 255 是噪声。如果您的嘈杂像素实际上具有除此之外的值,您的算法将不会做任何事情,您可能会看到输出看起来与输入相同。

      【讨论】:

      • 即使我有一些像素值为 0 和 255,输出图像与输入图像相同。
      猜你喜欢
      • 2023-04-05
      • 2013-03-14
      • 1970-01-01
      • 2021-04-09
      • 2016-06-28
      • 1970-01-01
      • 2020-05-05
      • 2021-11-12
      • 1970-01-01
      相关资源
      最近更新 更多