边缘提取

1、Sobel算子

使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差分

void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );
src
输入图像.
dst
输出图像.
xorder
x 方向上的差分阶数
yorder
y 方向上的差分阶数
aperture_size
扩展 Sobel 核的大小,必须是 1, 3, 5 或 7。 除了尺寸为 1, 其它情况下, aperture_size ×aperture_size 可分离内核将用来计算差分。对 aperture_size=1的情况, 使用 3x1 或 1x3 内核 (不进行高斯平滑操作)。这里有一个特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器,可以给出比 3x3 Sobel 滤波更精确的结果。Scharr 滤波器系数是:

\begin{bmatrix}     -3 & 0 & 3 \\     -10 & 0 & 10 \\     -3 & 0 & 3  \end{bmatrix}

对 x-方向 或矩阵转置后对 y-方向。

函数 cvSobel 通过对图像用相应的内核进行卷积操作来计算图像差分:

dst(x,y) = \frac{d^{xorder+yorder}src} {dx^{xorder} dy^{yorder}} |(x,y)

由于Sobel 算子结合了 Gaussian 平滑和微分,所以,其结果或多或少对噪声有一定的鲁棒性。通常情况,函数调用采用如下参数 (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 来计算一阶 x- 或 y- 方向的图像差分。第一种情况对应:

\begin{bmatrix}     -1 & 0 & 1 \\     -2 & 0 & 2 \\     -1 & 0 & 1  \end{bmatrix} 核。

第二种对应:

\begin{bmatrix}     -1 & -2 & -1 \\     0 & 0 & 0 \\     1 & 2 & 1  \end{bmatrix}

或者

\begin{bmatrix}     1 & 2 & 1 \\     0 & 0 & 0 \\     -1 & -2 & -1  \end{bmatrix}

核的选则依赖于图像原点的定义 (origin 来自 IplImage 结构的定义)。由于该函数不进行图像尺度变换,所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即像素的位深)。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。当然可以用函数 cvConvertScale 或 cvConvertScaleAbs 把运算结果(dst)转换为 8 位的。除了8-位图像,函数也接受 32-位 浮点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。

具体实现程序如下

// sobel.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"

int _tmain(int argc, _TCHAR* argv[])
{
	//声明指针
	IplImage* pImg = NULL;
	IplImage* pSobelImg_dx = NULL;
	IplImage* pSobelImg_dy = NULL;	 
	//载入图像
	pImg = cvLoadImage("qb.jpg",0);

	//为soble微分图像申请空间,创建图片函数
	pSobelImg_dx = cvCreateImage(cvGetSize(pImg),32,1);
	pSobelImg_dy = cvCreateImage(cvGetSize(pImg),32,1);

	//用sobel算子计算图像微分
	cvSobel(pImg , pSobelImg_dx, 1, 0, 3);
	cvSobel(pImg , pSobelImg_dy, 0, 1, 3);
	//cvCanny(pImg,pSobelImg,100,500,3);

	//创建窗口
	cvNamedWindow("src",1);
	cvNamedWindow("sobel_dx",1);
	cvNamedWindow("sobel_dy",1);

	//显示图像
	cvShowImage("src",pImg);
	cvShowImage("sobel_dx",pSobelImg_dx);
	cvShowImage("sobel_dy",pSobelImg_dy);

	//等待按键
	cvWaitKey(0);

	//销毁窗口
	cvDestroyWindow("src");
	cvDestroyWindow("sobel_dx");
	cvDestroyWindow("sobel_dy");

	//释放图像
	cvReleaseImage(&pImg);
	cvReleaseImage(&pSobelImg_dx);
	cvReleaseImage(&pSobelImg_dy);

 return -1;
}

用指针法计算速度较快,参考http://whitebaby323.blog.163.com/blog/static/110427620112252119479/

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值