【Emgu.CV教程】4.4、无缝融合应用之TextureFlattening()纹理扁平化

        这是无缝融合应用的最后一篇,TextureFlattening()函数,专门用于对图像指定部位进行纹理扁平化的。这个功能现在讲起来有点太早了,应该放到《图像的空间滤波--平滑》这一章节中才合适。因为它就是用Sobel算子进行平滑,也就是在保留图像纹理的情况下,去掉噪点,主要用于图像分割使用。现在不理解不要紧,看看函数是怎么用的就会了。

        函数定义如下:

public static void TextureFlattening(
    IInputArray src, // 输入图像
    IInputArray mask, // 掩码图,单通道或者三通道都可以,非零部分不起作用
    IOutputArray dst, // 输出图像
    float lowThreshold = 30f, // Canny边缘检测器低阈值(建议取值0~100)
    float highThreshold = 45f, // Canny边缘检测器高阈值(建议取值>100)
    int kernelSize = 3 // Sobel算子核大小,只能是3、5、7,默认3
)

        注意啊,函数一定要有个掩码图,尺寸和原图要相同,我这里举例的掩码图是中间的那部分矩形区域为白色,其余全部是0。原图和掩码图如下:

【Emgu.CV教程】4.4、无缝融合应用之TextureFlattening()纹理扁平化_第1张图片

        假定lowThreshold = 30 ,highThreshold = 140,kernelSize = 7,执行以下代码:

Mat tempMat = srcMat.Clone(); // 深拷贝
Mat dstMat = new Mat();
Mat mask = new Mat();
float lowThreshold = 30;
float highThreshold = 140;
int kernelSize = 7; 
Rectangle rect = new Rectangle(tempMat.Width / 4, tempMat.Height / 4, tempMat.Width / 2, tempMat.Height / 2);
mask = Mat.Zeros(tempMat.Height, tempMat.Width, DepthType.Cv8U, 3);
CvInvoke.Rectangle(mask, rect, new MCvScalar(255, 255, 255), -1, LineType.EightConnected, 0); // thickness = -1,代表实心
CvInvoke.TextureFlattening(tempMat, mask, dstMat, lowThreshold, highThreshold, kernelSize);
CvInvoke.Imshow("TextureFlattening image, " + dstMat.Size.ToString(), dstMat);

        这时候用 Imshow()函数显示出来的结果图像,变成了这样:

【Emgu.CV教程】4.4、无缝融合应用之TextureFlattening()纹理扁平化_第2张图片

       中间的那部分,就是被平滑了。代码和参数不变,换成另外一张图像呢,看一下效果:

【Emgu.CV教程】4.4、无缝融合应用之TextureFlattening()纹理扁平化_第3张图片

        这个函数是用于图像平滑处理的,后面专门有一大章节是讲平滑的,还会有很多的类似函数。但是在讲平滑之前,下面一大章先讲一下图像的几何变换,这个更基础一些,预计下周隆重登场。

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

你可能感兴趣的:(Emgu,CV使用教程,计算机视觉,c#,图像处理,Emgu.CV)