sobel算子_OpenCV 学习:4 Sobel算子

bdde53b64d4f1a9ccb462775ad3164e4.png

1 背景介绍

图像底层的处理对象,比如图像的噪点、边缘、直线、圆、特征点等为目的。那么本章主要解决的问题是如何提取图形中的边缘?是我们关心中的重点。那么,其数学原理是一阶离散差分的形式。故我们知道把一个图像处理转变为灰度图像,就是处理这张图像的每个像素灰度的变化,那么在边缘处,灰度变化比较明显(对应着其梯度或者灰度矢量的变化)。

2 Sobel算子的形式

  • 图像处理绝大数在卷积操作,Opencv 会提供一个
    或者
    或者其他大小的 kernel,也就是卷积核。对于卷积核操作,首先我们要明白卷积原理。

卷积公式:

我擦,看到他的定义瞬间懵掉了。那么他到底解释的什么?我给出引用其他小伙伴的卷积解释卷积到底是什么?我还是一脸雾水,当我看到以下证明时,我才完全明白其来源和含义:

设二维连续型随机变量

的概率密度函数为
,则随机变量
的概率密度​
的求解过程为:

那么:

则:

其实,卷积函数就是二阶积分一种特殊情况的一元积分形式。

  • Sobel 卷积算子,
    轴方向的变化和
    轴方向的变化

dea98aae6181ad565a5479c409e3693f.png

看到

你会疑问为什么 Sobel 算子会长成这个样子?要解决这一个疑问,首先要知道,一阶差分方程形式为:

在求
方向上变化,
在求
方向上变化。至于为什么会出现数字2,我的思考是当前像素位置 上类似于高斯权重的分配。左右变换大为
,上下变换大为

为原始图像,那么在
方向上的卷积为:

那么在

方向上的卷积为:

具体计算方式如下:

其中

表示图像
点的灰度值。

那么,改点的灰度梯度为:

如果梯度

大于某一阀值则认为该点
为边缘点。


Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。

3 API 函数介绍

void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy,
                int ksize, double scale, double delta, int borderType )

第一个参数:_src 输入的源影像 

第二个参数:_dst输出的目标影像,大小和通道数与源影像相同。深度由ddepth来决定

第三个参数:目标影像的深度;当源源影像的深度为CV_8U时,一般ddepth选择为CV_16S

第四个参数:x方向上的导数因子

第五个参数:Y方向上的导数因子

第六个参数:

如果ksize<0的时候,那么使用scharr内核过滤因子。scharr的内核过滤因子大小为3。

dx大于等于0,dy大于等于0,并且dx+dy==1
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
    Mat image  = imread("/Users/cc/Desktop/OpenCV/demo/MyOpenCvDemo/MyDemo/swk.jpeg");
    if (image.empty())
    {
        cout << "could not find the image resource ..." << endl;
        return -1;
    }

    Mat grayImg;
    cvtColor(image, grayImg, COLOR_BGR2GRAY);
    Mat sobelx;
    Sobel(grayImg, sobelx, CV_32F, 1, 0);
    double minVal, maxVal;
    minMaxLoc(sobelx, &minVal, &maxVal);
    Mat draw;
    sobelx.convertTo(draw, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));

    namedWindow("My Image", CV_WINDOW_AUTOSIZE);
    imshow("My Image", draw);
    waitKey(0);

    return 0;
}

4 运行结果

8070e857f3ddd26ab71568479ee0eead.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值