清洗盐和胡椒的噪音

时间:2014-01-18 18:59:51

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

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

代码和图片位于skydrive中的此位置:http://sdrv.ms/1az6sRC 为了使用代码,Python 3.2是必需的,并且需要安装目录中的附加组件以便在Python中呈现图像。 需要导入类矩阵,带有函数clean的文件cleaning.py包含我的尝试 - 该函数可以使用文件中的任何代码(带变量)以实现尽可能好的结果。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

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

2-拿起元素

3-订单元素

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

5-取平均值 - 将剩余元素相加并将总和除以它们的数字。

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

打扰我处理python因为我的背景不是很

答案 1 :(得分:1)

当噪声概率大约为40%(图像像素被翻转的概率)时,传统的盐和胡椒图像去噪滤波器是合适的。在您的情况下,您有密度噪音。您将需要使用计算更昂贵的基于中值的过滤器来解决问题。仔细观察这个paper的结果,它似乎是可以实现的,但你需要实现它。

答案 2 :(得分:0)

您好,您可以使用中值滤波器或最大滤波器,因为您有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;          
     }