您的位置:首页 > 运维架构

利用OpenCV的Sobel算子求得图像的梯度信息

2014-08-30 17:03 253 查看
第一次写博客,之前都是看别人的博文,把自己每天做的记下来,以便今后查阅。言简意赅!

Sobel算子X方向:



y方向:



原图:



源码:

#include "stdafx.h"
#include <opencv\cv.h>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>

using  namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
// 读取图像
Mat img = imread("E:\\VC++Projects\\road.jpg");

// 转换为灰度图像
Mat gray;
cvtColor(img,gray,CV_BGR2GRAY);

// 求得x和y方向的一阶微分
Mat sobelx;
Mat sobely;
Sobel(gray, sobelx, CV_32F, 1, 0, 3);
Sobel(gray, sobely, CV_32F, 0, 1, 3);

// 求得梯度和方向
Mat norm;
Mat dir;
cartToPolar(sobelx, sobely, norm, dir);

// 转换为8位单通道图像进行显示
double normMax;
minMaxLoc(norm, NULL, &normMax);
Mat grad;
norm.convertTo(grad, CV_8UC1, 255.0/normMax, 0);

double dirMax;
minMaxLoc(dir, NULL, &dirMax);
Mat angle;
dir.convertTo(angle, CV_8UC1, 255.0/dirMax, 0);

namedWindow("grad");
imshow("grad",grad);
namedWindow("angle");
imshow("angle",angle);

waitKey(0);
img.release();
gray.release();
sobelx.release();
sobely.release();
norm.release();
dir.release();
grad.release();
angle.release();

return 0;
}


结果,梯度幅度:



梯度方向:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: