sobel边缘检测算子

1.Sobel算子的介绍

Sobel算子

        上式三个矩阵分别为该算子的x向卷积模板、y向卷积模板以及待处理点的邻域点标记矩阵,据此可用数学公式表达其每个点的梯度幅值为:

其实,sobel算子跟canny算子差不多,只是计算梯度的公式不一样而已,亲们可以将两种算子进行比较,结合实际的情况自己选择使用哪一种算子

下面贴出详细的代码

#include <highgui.h> 

#include <math.h>
#include<iostream>
using namespace std;
//函数声明
void ImageGray(IplImage *sourceImage, IplImage *grayImage);
void GaussFliter(IplImage *grayImage,IplImage *gaussImage);
void CalGradient(IplImage *gaussImage,IplImage *edgeImage);
void TraceEdge(int y,int x,int ThrLow, unsigned char *pResult, int *pMag,CvSize temp);


//定义存放高斯滤波像素的数组
char *pCanny;
int main()
{
//确定要读入的AVI视频
CvCapture *capture = cvCreateFileCapture("E:\\新建文件夹\\行车视频.avi");
//将视频文件的下一帧加载到内存
IplImage *tempFrame= cvQueryFrame(capture);
IplImage *grayImage,*gaussImage,*edgeImage;
//创建头并分配数据,取与这一帧图大小一样的尺寸,数据类型为无符号8位整型,单通道
grayImage = cvCreateImage(cvSize(tempFrame->width, tempFrame->height),8,1);
    gaussImage=cvCreateImage(cvSize(tempFrame->width,tempFrame->height),8,1);
edgeImage=cvCreateImage(cvSize(tempFrame->width,tempFrame->height),8,1);
while (IplImage *tempFrame = cvQueryFrame(capture))
{
cvShowImage("原始视频",tempFrame); //播放原视频
ImageGray(tempFrame, grayImage);//得到灰度图
cvShowImage("灰度视频",grayImage);
       GaussFliter(grayImage,gaussImage); 
  cvShowImage("高斯视频",gaussImage);
       CalGradient(gaussImage,edgeImage );
  cvShowImage("边缘视频",edgeImage);
char c = cvWaitKey(33);  
        if (c == 27)  
        {  
              return 0;  
        }  
}
 
cvReleaseCapture(&capture);
cvReleaseImage(&grayImage);
cvReleaseImage(&gaussImage);
cvReleaseImage(&edgeImage);
cvDestroyWindow("原始视频");
cvDestroyWindow("灰度视频");
cvDestroyWindow("高斯视频");
cvDestroyWindow("边缘视频");
}
void ImageGray(IplImage *sourceImage, IplImage *grayImage)
{
for(int i = 0; i < sourceImage->height; i++)
{
for(int j = 0; j < sourceImage->width; j++)
{
unsigned char b = (unsigned char)sourceImage->imageData[i * sourceImage->widthStep + j * 3 + 0];
unsigned char g = (unsigned char)sourceImage->imageData[i * sourceImage->widthStep + j * 3 + 1];
unsigned char r = (unsigned char)sourceImage->imageData[i * sourceImage->widthStep + j * 3 + 2];
   
unsigned char gray = 0.299 * r + 0.587 * g + 0.114 * b;
grayImage->imageData[i * sourceImage->width + j] = gray;
}
}
}


void GaussFliter(IplImage *grayImage,IplImage *gaussImage)
{
//定义一个数组存放高斯模板
int temp[9];
temp[0] = 1;
temp[1] = 2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值