美文网首页
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