美文网首页
sobel(iOS)算子(边缘检测)

sobel(iOS)算子(边缘检测)

作者: 傻傻小萝卜 | 来源:发表于2017-05-15 10:35 被阅读237次

最全OpenCV教程及图像处理、目标跟踪、识别案例

基本概念

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位无符号整数

展示效果:

相关文章

网友评论

      本文标题:sobel(iOS)算子(边缘检测)

      本文链接:https://www.haomeiwen.com/subject/kaxtxxtx.html