opencv学习-sobelScharrLaplacian算子边缘提取

Posted 殇堼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习-sobelScharrLaplacian算子边缘提取相关的知识,希望对你有一定的参考价值。

1.API-Sobel

Sobel( src, dst, ddepth, dx, dy, ksize, scale,delta,borderType )
InputArray src,
OutputArray dst,
int ddepth, 输出图像深度
int dx,导数x的阶数
int dy,导数y的阶数
int ksize = 1\\3\\5\\7,扩展Sobel内核的大小;它必须是1、3、5或7。
double scale = 1, 计算派生值的可选比例因子;默认情况下,不应用缩放
double delta = 0, 给所选的像素值添加一个值delta。
int borderType = BORDER_DEFAULT 用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
);
Sobel(grayimg, gx, CV_16S, 1, 0,3,1,0,BORDER_DEFAULT);
后三位均可不填,输出默认值,即:Sobel(grayimg, gx, CV_16S, 1, 0,3)
x方向和y方向:
在这里插入图片描述

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	Mat img, grayimg, gx, gy, gx1, gy1, src;

	img = imread("D:/images/lena.png");
	if (!img.data)
	{
		cout << "could not load image !";
		return -1;
	}
	imshow("原图", img);
	cvtColor(img, grayimg, COLOR_BGR2GRAY);
	imshow("灰度图", grayimg);
	//在X方向上求导,能获得竖直边缘
	Sobel(grayimg, gx, CV_16S, 1, 0, 3);
	//在Y方向上求导,能获得水平边缘
	Sobel(grayimg, gy, CV_16S, 0, 1, 3);
	//由于经过sobel算子操作后,像素可能会变成负值,要将所有像素值取绝对值
	convertScaleAbs(gx, gx1);//计算图像gx的像素绝对值,输出到图像gx1
	convertScaleAbs(gy, gy1);//计算图像gy的像素绝对值,输出到图像gy1
	//将X和Y方向增强的图像进行加权处理
	addWeighted(gx1, 0.5, gy1, 0.5, 0, src);
	imshow("|Sobelx|", gx1);
	imshow("|Sobely|", gy1);
	imshow("|Sobelx|+|Sobelx|", src);

	waitKey(0);
	return 0;
}

在这里插入图片描述
为了更形象地体现soble在x和y方向上的处理效果,选用一张有明显竖直线和水平线的图像。
X-清晰地显示竖直线
在这里插入图片描述
Y-清晰地显示水平线在这里插入图片描述
X+Y
竖直线和水平线合并
在这里插入图片描述

2.API-Scharr算子

Scharr算子是sobel的加强版
在这里插入图片描述

参数等同于soble算子

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	Mat img, grayimg, gx, gy, gx1, gy1, src;

	img = imread("D:/images/house.png");
	if (!img.data)
	{
		cout << "could not load image !";
		return -1;
	}
	imshow("原图", img);
	cvtColor(img, grayimg, COLOR_BGR2GRAY);
	imshow("灰度图", grayimg);
	Scharr(grayimg, gx, CV_16S, 1, 0, 1);
	Scharr(grayimg, gy, CV_16S, 0, 1, 1);
	//由于经过sobel算子操作后,像素可能会变成负值,要将所有像素值取绝对值
	convertScaleAbs(gx, gx1);//计算图像gx的像素绝对值,输出到图像gx1
	convertScaleAbs(gy, gy1);//计算图像gy的像素绝对值,输出到图像gy1
							 //将X和Y方向增强的图像进行加权处理
	addWeighted(gx1, 0.5, gy1, 0.5, 0, src);
	imshow("|Sobelx|", gx1);
	imshow("|Sobely|", gy1);
	imshow("|Sobelx|+|Sobelx|", src);

	waitKey(0);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.API-Laplacian算子

Laplacian( src, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
Laplacian(grayimg, gx, CV_16S, 3, 1, 0);
src: 输入图像。
dst: 输出图像
ddepth: 输出图像的深度。 因为输入图像的深度是 CV_8U ,这里我们必须定义 ddepth = CV_16S 以避免外溢。
kernel_size: 内部调用的 Sobel算子的内核大小,此例中设置为3。
scale, delta 和 BORDER_DEFAULT: 使用默认值。

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	Mat img, grayimg, gx, gx1;

	img = imread("D:/images/house.png");
	if (!img.data)
	{
		cout << "could not load image !";
		return -1;
	}
	imshow("原图", img);
	cvtColor(img, grayimg, COLOR_BGR2GRAY);
	imshow("灰度图", grayimg);
	Laplacian(grayimg, gx, CV_16S, 3, 1, 0);
	//由于经过Laplacianl算子操作后,像素可能会变成负值,要将所有像素值取绝对值
	convertScaleAbs(gx, gx1);//计算图像gx的像素绝对值,输出到图像gx1
	
	imshow("result", gx1);

	waitKey(0);
	return 0;
}

在这里插入图片描述

以上是关于opencv学习-sobelScharrLaplacian算子边缘提取的主要内容,如果未能解决你的问题,请参考以下文章

视觉学习---opencv函数学习

youcans 的 OpenCV 学习课1.2 编译生成带有 OpenCV_contrib 的 OpenCV 库

youcans 的 OpenCV 学习课1.2 编译生成带有 OpenCV_contrib 的 OpenCV 库

OPenCv学习一:opencv安装与环境配置

opencv学习- - -播放视频

OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建