【问题标题】:cleaning salt and pepper noise清洁椒盐噪声
【发布时间】:2014-01-18 18:59:50
【问题描述】:

我有以下图像(它是一个车牌),它受到 0.9 概率的椒盐噪声的影响(每个像素有 90% 的机会变成全白或全黑)。我需要尽可能地清理它以使数字可读。我在 Python 中有基本的允许算法,但允许更改 - 我需要以某种方式使图像清晰。我们将图像转换为加载到矩阵中的像素的黑白位图,然后直接在矩阵上执行所有算法。我们使用了 2 种中位数的变体——我尝试了它们的许多组合,但都无济于事——没有产生清晰的图像。我迫切需要帮助!

代码和图像在 Skydrive 中的这个位置:http://sdrv.ms/1az6sRC 为了使用代码 Python 3.2 是必需的,并且需要安装目录中的插件才能在 Python 中呈现图像。 需要导入类矩阵,带有函数clean的文件cleaning.py包含我的尝试——这个函数可以使用文件中的任何代码(有变体)以达到尽可能好的结果。

任何帮助将不胜感激。

【问题讨论】:

    标签: image-processing python-3.x noise-reduction


    【解决方案1】:

    传统的椒盐图像去噪滤波器适用于噪声概率约为 40%(图像像素被翻转的概率)的情况。在您的情况下,您有密度噪声。您将需要使用计算成本更高的基于中值的滤波器来解决问题。仔细查看paper 的结果,它似乎是可以实现的,但您需要实现它。

    【讨论】:

    • 本文算法取得了令人难以置信的成功!
    • @Lokesh A. R. Paper 链接已过时,请更新
    • @Gulzar - 现在不记得那篇论文了。
    【解决方案2】:

    中值滤镜解决了椒盐问题,但会产生模糊的图像。要解决盐和胡椒问题并保留原始照片,您必须使用Alpha Trim Filter。过滤理念:

    1- 在元素上放置一个窗口

    2- 拾取元素

    三阶元素

    4- 丢弃得到的有序集合开头和结尾的元素(根据alpha输入值)

    5- 取平均值 - 将剩余元素相加,然后将总和除以它们的数量。

    你可以使用 matlab 来实现它。有很多以前实现的 alpha trim 过滤器你可以使用它并将你的 python 程序与 matlab 链接

    请原谅我与python打交道,因为我对它的背景不是很愿意

    【讨论】:

      【解决方案3】:

      您好,您可以使用中值滤波器或最大滤波器,因为您有 90% 的噪声。 请参考下面的 C++ 代码,但您可以轻松地将其与 python 相关联。 //maxOrmedian = True/False, inputImage = std::vector , kernalSize = 3, width = 256, height= 256 //

       std::vector<double> medianFilter(bool maxOrmedian, std::vector<double> inputImage, double kernalSize,int width, int height)
          {
             /* Fill all the values to output image */
             vector<double> outImage = inputImage;
            for(int y = kernalSize; y < height - kernalSize; y++)
            {
               for(int x = kernalSize; x < width - kernalSize; x++)
               {
                 std::vector<double> tempList;
                 for(int i = - kernalSize; i <= kernalSize; i++)
                   {
                     for(int j = -kernalSize; j <= kernalSize; j++)
                       {
                         double pixelValue = inputImage[(y+j)*width + (x+i)];
                         tempList.push_back(pixelValue);
                       }
                   }
                  std::sort(tempList.begin(),tempList.end());
                  double newPixelValue = 0;
                  if(maxOrmedian) //median filter
                     newPixelValue = tempList[tempList.size()/2];
                  else
                     newPixelValue = tempList[tempList.size()-1];
                  outImage[y*width + x] = newPixelValue;
                }
             }   
            return outImage;          
           } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-12
        • 2023-04-05
        • 2021-04-09
        • 2013-03-14
        • 2020-05-05
        • 2013-01-04
        • 1970-01-01
        • 2014-04-11
        相关资源
        最近更新 更多