自学内容网 自学内容网

【Emgu CV教程】7.8、图像锐化(增强)之同态滤波


一、同态滤波大体原理

之前介绍的几个锐化、增强方法,包括更早之前介绍的图像模糊方法,都是基于空间域进行处理,也就是直接对目标点周边像素值进行各种数学运算。而这篇文章提到的同态滤波,就要更厉害了,是基于频率域的,要用到Dft()傅里叶变换函数。

高等数学比较好的读者可能很好理解,我看了半天也没明白是什么意思,下面都是我自己的理解,可能有错的啊。傅里叶变换是一个非常厉害的操作,图像的原始表达方式是 m * n个像素点组合,这个叫空间域,空间域大小就是m * n,转成频率域呢,用处就大了,因为高频的就是噪声或者物体边缘,低频的就是图像内比较平缓的部位,比如蓝天、纯色背景、雪地等等。因为有了高低频,就可以提取出边缘、噪声来,进一步就可以对边缘、噪声进行有针对性的处理。

通过傅里叶转换,在频率域内对图像进行处理,也是很重要、很有效的一种办法,属于比较高级的应用,很值得用一大章来仔细讲解,可惜我不会,就免了吧。

二、代码

网上有很对专家利用OpenCV 实现同态滤波,原理也讲了不少,读者们可以去找找。我这里也是根据他们的原始代码,转换成Emgu CV + C#的形式来实现,代码如下:

Mat dstMat = new Mat();

// 1、log变换,将源图像转为float类型  然后进行log变换
Mat gray = srcMat.Clone();

// CvInvoke.Resize(gray, gray, new System.Drawing.Size(1280, 720), 0, 0, Inter.Linear);
CvInvoke.CvtColor(gray, gray, ColorConversion.Bgr2Gray);
Mat f = new Mat();
gray.ConvertTo(f, DepthType.Cv32F, 1 / 255.0);
f += 0.1;
CvInvoke.Log(f, f);

// 2、傅里叶变换
Mat fourierMat = new Mat();
CvInvoke.Dft(f, fourierMat, DxtType.Forward, 0);

// 3、构造一个高斯频域高通滤波器
Mat filter = new Mat(fourierMat.Rows, fourierMat.Cols, DepthType.Cv32F, 1);
filter.SetTo(new MCvScalar(0, 0, 0));
Image<Gray, double> filterImage = filter.ToImage<Gray, double>();
for (int y = 0; y < filter.Rows; y++)
{
    for (int x = 0; x < filter.Cols; x++)
    {
        int xx = x > filter.Cols / 2 ? x - filter.Cols : x;
        int yy = y > filter.Rows / 2 ? y - filter.Rows : y;

        double duv = Math.Sqrt((xx * xx) + (yy * yy));
        double d0 = 3;

        double huv = ((1.0 - 0.4) * (1 - Math.Pow(2.71828, -1 * (duv * duv / (d0 * d0))))) + 0.4;
        filterImage.Data[y, x, 0] = huv;
    }
}

filter = filterImage.Mat;
filter.ConvertTo(filter, DepthType.Cv32F);

// 4、滤波,将傅里叶变换过后的图像与滤波器相乘:
CvInvoke.Multiply(fourierMat, filter, fourierMat, 1); // 相乘后,最大值255,最小值0

// 5、傅里叶逆变换,指数变换(图像还原)
CvInvoke.Dft(fourierMat, dstMat, DxtType.InvScale, 0);
CvInvoke.Exp(dstMat, dstMat);
dstMat -= 0.1;

// 6、显示
CvInvoke.Imshow("Destination image,methord 2,  " + dstMat.Size.ToString(), dstMat);

不要问为什么,因为我也看不懂,对于频率域操作,代码能跑起来就是万幸了。

三、效果举例

原始素材定义为srcMat,如下:
在这里插入图片描述
还是这张夜晚天桥的照片,执行上述代码,同态滤波增强后的图像如下:
注意哈,它是锐化的作用,因此最终输出的图像,明暗对比没有被增强,但是仔细看,最下方地砖的纹理和树叶的边缘,是不是更清晰了????

同态滤波就是灰度增强,使图形明亮更均匀,而且明亮处的纹理保留的很好。代码执行起来速度很快,效果也很好,值得有兴趣的同学们去研究研究。再举个例子加深印象,如下:
在这里插入图片描述


原创不易,请勿抄袭。共同进步,相互学习。


原文地址:https://blog.csdn.net/sswss12345/article/details/136314431

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!