图像梯度及其性质:
该向量有一个重要的几何性质,它指出了f在位置(x,y)处的最大变化率的方向。
向量的大小(长度)表示为M(x,y),即:
它是梯度向量方向变化率的值。其中,M(x,y)都是和原图大小相同的图像,是x,y在f中的所有像素位置上变化时产生的。
M(x,y)称为梯度图像。梯度向量的方向由下列对于x轴度量的角度给出:
边缘模型:
台阶模型 斜坡模型 屋顶模型
,一阶导数的幅度可用于检测图像中的某个点处是否存在一个边缘。二阶导数的符号可用于确定一个便于像素位于该边缘的俺的一侧还是亮的一侧。
图像的每条边缘,二阶导数生成两个值(一条不希望的特点)。二阶导数的零交叉点(二阶导数级之间的连线与零灰度轴的交点称为该二阶导数的零交叉点),可用于定位粗边缘的中心。
梯度算子
一维模板
罗伯特交叉梯度算子
Roberts Prewitt Sobel
,,,
沿对角线方向有最大响应:
Prewitt Sobel
二维梯度幅值和角度:
原图 x方向梯度,y方向梯度,梯度图像+
代码:
#include<iostream>
#include"opencv.hpp"
using namespace cv;
using namespace std;
#define N 3
#ifdef _DEBUG
#pragma comment(lib,"opencv_core2413d.lib")
#pragma comment(lib,"opencv_imgproc2413d.lib")
#pragma comment(lib,"opencv_highgui2413d.lib")
#pragma comment(lib,"opencv_features2d2413d.lib")
#pragma comment(lib,"opencv_calib3d2413.lib")
#else
#pragma comment(lib,"opencv_core2413.lib")
#pragma comment(lib,"opencv_imgproc2413.lib")
#pragma comment(lib,"opencv_highgui2413.lib")
#pragma comment(lib,"opencv_features2d2413.lib")
#pragma comment(lib,"opencv_calib3d2413.lib")
#endif
int kernel_size = 3;
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
int main(){
Mat src = imread("Fig1016(a)(building_original).tif", 0);
if (!src.data){
cout << "error src image" << endl;
}
if (src.channels() != 1){
cvtColor(src, src, CV_BGR2HLS);
}
resize(src, src, Size(500, 500), 0.5, 0.5);
imwrite("o.jpg", src);
Mat dst=Mat::zeros(src.rows,src.cols,CV_8UC1);
Mat grad_x, abs_grad_x, src_gray, grad_y, abs_grad_y, grad;
Sobel(src, grad_x, src.type(), 1, 0, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
imshow("abs_grad_x", abs_grad_x);
Sobel(src, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);
// Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
convertScaleAbs(grad_y, abs_grad_y);
imshow("abs_grad_y", abs_grad_y);
/// 合并梯度(近似)
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
imshow("abs_grad", grad);
waitKey();
imwrite("x.bmp", abs_grad_x);
imwrite("y.bmp", abs_grad_y);
imwrite("g.bmp", grad);
return 0;
}
角度图像不像幅度图像那么有用,当可作为用梯度幅值从图像中提取的信息的补充。图中恒定灰度区域,如斜屋顶的前变暖和前墙顶部的水平条带,
说明在这些区域中的所有像素位置处的梯度方向是相同的。
(不知道角度图像用哪个函数,暂时未实现)。
此外,梯度可以和阈值处理相结合,例如,将阈值设为梯度图像的最大值的33%的像素显示为白色,而低于该阈值的像素显示为黑色。
为防止噪声干扰,可在求梯度前,先对图像进行平滑处理。
参考文献:《数字图像处理》(第三版)冈萨雷斯