这是无缝融合应用的最后一篇,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。原图和掩码图如下:
假定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()函数显示出来的结果图像,变成了这样:
中间的那部分,就是被平滑了。代码和参数不变,换成另外一张图像呢,看一下效果:
这个函数是用于图像平滑处理的,后面专门有一大章节是讲平滑的,还会有很多的类似函数。但是在讲平滑之前,下面一大章先讲一下图像的几何变换,这个更基础一些,预计下周隆重登场。
原创不易,请勿抄袭。共同进步,相互学习。