图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace

执行边缘检测的三个基本步骤:
1、为降噪对图像进行平滑处理。(导数对噪声具有敏感性。图像的正负分量检测困难)
2、边缘点的检测。(提取边缘点的潜在候选者)
3、边缘定位。(从候选者中选出真是边缘点成员)
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第1张图片
基本算子:梯度算子(表征某点边缘强度和方向,又称边缘检测子)
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第2张图片
梯度幅值

较为简单的边缘检测算子模板:
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第3张图片
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第4张图片
sobel模板能较好地抑制噪声。
常用绝对值来近似梯度幅值,保持灰度级的相对变化,代价是导致滤波器不再是各向同性的。
近似梯度幅值

sobel计算过程

图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第5张图片
Opencv库函数调用方法:

void Sobel (
InputArray src,
OutputArray dst,
int ddepth,
int dx, x方向上的差分阶数
int dy, y方向上的差分阶数
int ksize=3, 核的大小,为奇数
double scale=1, 计算导数时的缩放因子
double delta=0, 将结果存入目标图像前可选的值
int borderType=BORDER_DEFAULT ) ;
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第6张图片

int main()
{
	// Read image 读取图像
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字体为绿色
	//载入原图
	Mat srcImage = imread("D:\\opencv_picture_test\\形态学操作\\coin_inv.png",0);	//读取灰度图
	//判断图像是否加载成功
	if (srcImage.empty())
	{
		cout << "图像加载失败!" << endl;
		return -1;
	}
	else
		cout << "图像加载成功!" << endl << endl;
	Mat gradx, grady;
	Mat abs_gradx, abs_grady;
	Mat dstImage;
	//求x方向的梯度
	Sobel(srcImage,gradx,CV_16S,1,0,3,1,1,BORDER_DEFAULT);//	x方向1阶差分 y方向0 核大小3
	convertScaleAbs(gradx, abs_gradx);		//绝对值
	//求y方向的梯度
	Sobel(srcImage, grady, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);//	x方向1阶差分 y方向0 核大小3
	convertScaleAbs(grady, abs_grady);		//绝对值
	addWeighted(abs_gradx,0.5, abs_grady,0.5,0,dstImage);

	imshow("srcImage", srcImage);
	imshow("x方向", abs_gradx);
	imshow("y方向", abs_grady);
	imshow("整体", dstImage);
	waitKey(0);
	return 0;
}

图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第7张图片
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第8张图片
经过ImageWatch放大发现,提取出的边缘比较粗。
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第9张图片
减少精密细节的两种方法:
1、对图像进行平滑处理(例如用均值滤波,得到主要边缘)
2、对梯度图像进行阈值处理(梯度幅值大于等于阈值为黑白,小于阈值为黑),不过这一方法容易断线。
当为了突出主要边缘并尽可能维护连续性时,平滑处理和阈值处理两者都要使用。
roberts、prewitt,sobel算子都是以一个或多个模板进行滤波,而未对图像特性和噪声内容采取防护措施。

接下来介绍一种最优的边缘检测方法:canny算子

●低错误率:标识出尽可能多的实际边缘,同时尽可能地减少噪声产生的误报。
●高定位性:标识出的边缘要与图像中的实际边缘尽可能接近。
●最小响应:图像中的边缘只能标识-一次,并且可能存在的图像噪声不应标
识为边缘。

canny算子计算过程

图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第10张图片
Opencv库函数调用方法:

void Canny (InputArray image , OutputArray edges, double threshold1,
double threshold2 , 两个阈值较小的用于边缘连接,较大的用于控制强边缘的初始端,一般比例控制在3:1或者2:1
int apertureSize=3, sobel核大小
bool L2gradient=false )

int main()
{
	// Read image 读取图像
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字体为绿色
	//载入原图
	Mat srcImage = imread("D:\\opencv_picture_test\\形态学操作\\coin_inv.png",0);	//读取灰度图
	//判断图像是否加载成功
	if (srcImage.empty())
	{
		cout << "图像加载失败!" << endl;
		return -1;
	}
	else
		cout << "图像加载成功!" << endl << endl;
	Mat dstImage;
	Canny(srcImage,dstImage,100,33,3,false);

	imshow("srcImage", srcImage);

	imshow("整体", dstImage);
	waitKey(0);
	return 0;
}

效果:
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第11张图片
经过ImageWatch放大,可以发现,边缘只有一格
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第12张图片
总的看来,canny算子确实具有优越性。

laplace计算过程

图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第13张图片
3*3孔径的模板:
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第14张图片
opencv库函数调用:
图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第15张图片


int main()
{
	// Read image 读取图像
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字体为绿色
	//载入原图
	Mat srcImage = imread("D:\\opencv_picture_test\\形态学操作\\coin_inv.png", 0);	//读取灰度图
	//判断图像是否加载成功
	if (srcImage.empty())
	{
		cout << "图像加载失败!" << endl;
		return -1;
	}
	else
		cout << "图像加载成功!" << endl << endl;
	Mat dstImage,abs_dst;
	GaussianBlur(srcImage,srcImage,Size(3,3),0);	//高斯模糊
	Laplacian(srcImage,dstImage,CV_16S,3,1,0);
	convertScaleAbs(dstImage, abs_dst);
	imshow("srcImage", srcImage);

	imshow("整体", dstImage);
	waitKey(0);
	return 0;
}

图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace_第16张图片

你可能感兴趣的:(图像处理)