1

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

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

任何帮助将不胜感激。

4

3 回答 3

1

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

于 2014-01-19T14:15:31.200 回答
1

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

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

2-拾取元素

3-订单元素

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

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

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

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

于 2014-01-18T21:01:19.577 回答
0

嗨,您可以使用中值滤波器或 Max 滤波器,因为您有 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;          
     } 
于 2015-04-13T06:59:31.613 回答