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算子边缘提取的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 学习课1.2 编译生成带有 OpenCV_contrib 的 OpenCV 库