EmguCV Image类中的函数(三)几种边缘检测算法和仿射变换

一、边缘检测
(1)、Sobel导数
Sobel算子结合了高斯平滑和微分求导。可以用来计算图像灰度函数的近似梯度。计算时是将原图像分别与水平方向和竖直方向的奇数大小的内核进行卷积,然后再图像的每一点上进行计算(求根号下两数的平方和,有时会用两数的绝对值和)得出近似梯度。
当内核大小等于3时使用Sobel内核的误差会比较大,在这里可以使用Scharr内核进行计算(将内核大小设为-1时调用的是Scharr内核)。
在求导时,最好水平竖直分开求然后再加起来,效果会好一点。
使用方式如下:

imageBox1.Image = a.Sobel(1, 0, 3).AddWeighted(a.Sobel(0, 1, 3), 0.5, 0.5, 0);

效果:
EmguCV Image类中的函数(三)几种边缘检测算法和仿射变换_第1张图片
(2)Laplace 算子
Laplacian 算子 的定义:
这里写图片描述
是对二维图像求的二阶偏导数,在函数中由于 Laplace使用了图像梯度,它内部调用了 Sobel 算子。
在Laplace算子中无法调用Scharr内核。

imageBox1.Image = a.Laplace(3);

效果图:
EmguCV Image类中的函数(三)几种边缘检测算法和仿射变换_第2张图片
(3)、Canny算法
Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法。可传入彩色图
函数为:Image<Gray, byte> Canny(double thresh, double threshLinking);
用法:imageBox1.Image = a.Canny(100, 60);
效果图:
EmguCV Image类中的函数(三)几种边缘检测算法和仿射变换_第3张图片

二、仿射变换
这个可以使用函数WarpAffine来实现。
一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移),可以用仿射变换来表示:旋转 、平移、缩放操作。用于变换的矩阵为一个2*3的矩阵。

在上图中可以看出这三个点有着对应的关系,可以通过这三个点来确定一个仿射变换。
用法:

Mat mat = new Mat(new Size(3, 2), DepthType.Cv32F, 1);
PointF[] srcTri = new PointF[3];
PointF[] dstTri = new PointF[3];
srcTri[0] = new PointF(0, 0); 
srcTri[1] = new PointF(a.Width - 1, 0);
srcTri[2] = new PointF(0, a.Height - 1);
dstTri[0] = new PointF(a.Width * 0.0f, a.Height * 0.33f);
dstTri[1] = new PointF(a.Width * 0.85f, a.Height * 0.25f);
dstTri[2] = new PointF(a.Width * 0.15f, a.Height * 0.7f);
mat = CvInvoke.GetAffineTransform(srcTri, dstTri);
imageBox1.Image = a.WarpAffine(mat,a.Width,a.Height, Inter.Area, Warp.Default, BorderType.Constant, new Bgra(255, 255, 0, 255));

效果图:
EmguCV Image类中的函数(三)几种边缘检测算法和仿射变换_第4张图片

你可能感兴趣的:(EmguCV)