我有以下图像(它是一个牌照),它受到概率为0.9的盐和胡椒噪音的影响(每个像素有90%的机会完全变白或完全变黑)。我需要尽可能地清理它,以便使数字可读。我在Python中有基本允许的算法,但允许更改 - 我需要以某种方式使图像清晰。我们将图像转换为加载到矩阵中的像素的黑白位图,我们直接在矩阵上执行所有算法。我们使用2种不同的中位数 - 我尝试了很多组合它们都无济于事 - 没有产生清晰的图像。我迫切需要帮助!
代码和图片位于skydrive中的此位置:http://sdrv.ms/1az6sRC 为了使用代码,Python 3.2是必需的,并且需要安装目录中的附加组件以便在Python中呈现图像。 需要导入类矩阵,带有函数clean的文件cleaning.py包含我的尝试 - 该函数可以使用文件中的任何代码(带变量)以实现尽可能好的结果。
任何帮助将不胜感激。
答案 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;
}