Image processing 清洗盐和胡椒噪音
我有下面的图像(这是一个车牌),它受到0.9概率的椒盐噪声的影响(每个像素有90%的几率变成完全白色或完全黑色)。为了使数字可读,我需要尽可能地把它清理干净。我有Python中允许的基本算法,但允许进行更改-我需要以某种方式使图像清晰。我们将图像转换成黑白像素位图,加载到矩阵中,并直接在矩阵上执行所有算法。我们使用了两种不同的中间带-我尝试了许多组合,但都没有用-没有清晰的图片产生。我急需帮助 代码和图像位于skydrive中的以下位置: 为了使用代码,Python 3.2是必需的,并且需要安装目录中的附加组件,以便在Python中显示图像。 需要导入类矩阵,带有函数clean的文件cleaning.py包含我的尝试-此函数可以使用文件中的任何代码(带有变体),以获得尽可能好的结果Image processing 清洗盐和胡椒噪音,image-processing,python-3.x,noise-reduction,Image Processing,Python 3.x,Noise Reduction,我有下面的图像(这是一个车牌),它受到0.9概率的椒盐噪声的影响(每个像素有90%的几率变成完全白色或完全黑色)。为了使数字可读,我需要尽可能地把它清理干净。我有Python中允许的基本算法,但允许进行更改-我需要以某种方式使图像清晰。我们将图像转换成黑白像素位图,加载到矩阵中,并直接在矩阵上执行所有算法。我们使用了两种不同的中间带-我尝试了许多组合,但都没有用-没有清晰的图片产生。我急需帮助 代码和图像位于skydrive中的以下位置: 为了使用代码,Python 3.2是必需的,并且需要安装
任何帮助都将不胜感激 中值滤波解决了椒盐问题,但会产生模糊图像。为了解决盐和胡椒的问题并保存原始照片,您必须使用。过滤理念: 1-在图元上放置一个窗口 2-拾取元件 三阶元素 4-丢弃已获得有序集开头和结尾的元素(根据alpha输入值) 5-取一个平均值-将剩余的元素相加,然后除以它们的数目 您可以使用matlab来实现它。有很多以前实现的alpha微调过滤器,您可以使用它并将python程序与matlab链接
请原谅我处理python,因为我的背景不太清楚。当噪声概率约为40%(图像像素翻转的概率)时,传统的椒盐图像去噪过滤器适用。在你的例子中,你有一个密度噪声。您需要使用计算成本更高的基于中值的滤波器来解决此问题。仔细看一下结果,这似乎是可以实现的,但您需要实施它 Hi您可以使用中值滤波器或最大滤波器,因为您有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;
}
std::vector中间过滤器(bool-maxOrmedian,std::vector-inputImage,双内核大小,int-width,int-height)
{
/*填充所有值以输出图像*/
矢量输出图像=输入图像;
for(int y=kernalSize;y 对于(int i=-kernalSize;我用本文的算法获得了难以置信的成功!@Lokesh A.R.纸张链接已经过时了,请update@Gulzar-现在不记得报纸了。