基本概念
sobel算子是一个主要用于边缘检测的离散微分算子。他结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度,在图像的任何一点使用此算子,都会产生对应的梯度矢量或者是其他矢量。
sobel算子的计算过程
sobel算子函数:sobel()函数
void Sobel( InputArray src, // 输入图像。Mat类即可
OutputArray dst,// 目标图像,函数输出参数,需要和源图片有一样的尺寸和类型
int ddepth,// 输出图像的深度,比如src.depth(),和dddepth的组合
int dx, 、// x方向的差分阶数
int dy, // y方向的差分阶数
int ksize = 3,// 有默认值3,表示sobel核的大小,必须取1,3,5,7
double scale = 1,// 计算导数值可选的缩放因子,默认值是1,表示默认情况下是没有应用缩放的
double delta = 0,// 表示在结果存入目标图(第二个参数dst)之前可选的值belda,有默认值为0
int borderType = BORDER_DEFAULT ); //边界模式
参数详解
代码实现
NSString *image = @"try.png";
UIImage *image1 = [UIImage imageNamed:image];
Mat im;
UIImageToMat(image1, im);
if (im.empty()) {
return;
}
// 创建X,Y方向梯度图像的变量
Mat grad_x,grad_y;
// 梯度的绝对值
Mat abs_grad_x,abs_grad_y;
// 转换为灰度图像
cvtColor(im, src, COLOR_RGBA2GRAY);
// 求x方向的梯度
Sobel(src, grad_x, CV_16S, 1, 0);
convertScaleAbs(grad_x, abs_grad_x);
// 求y方向的梯度
Sobel(src, grad_y, CV_16S, 0, 1);
convertScaleAbs(grad_y, abs_grad_y);
// 合并梯度
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
self.secondImageView.image = MatToUIImage(dst);
其中函数convertScaleAbs() ,使用线性变换转换输入数组元素成8位无符号整数