- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
功能描述
计算图像的拉普拉斯值。
该函数通过使用 Sobel 运算符计算出的 x 和 y 的二阶导数之和来计算源图像的拉普拉斯值:
dst
=
Δ
src
=
∂
2
src
∂
x
2
+
∂
2
src
∂
y
2
\texttt{dst} = \Delta \texttt{src} = \frac{\partial^2 \texttt{src}}{\partial x^2} + \frac{\partial^2 \texttt{src}}{\partial y^2}
dst=Δsrc=∂x2∂2src+∂y2∂2src
当 ksize > 1 时,通过这种方式计算拉普拉斯值。当 ksize == 1 时,通过使用以下 3×3 掩模过滤图像来计算拉普拉斯值:
[
0
1
0
1
−
4
1
0
1
0
]
(3)
\left[ \begin{matrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{matrix} \right] \tag{3}
0101−41010
(3)
在图像处理和计算机视觉领域中,Laplacian 操作是一种常用的边缘检测方法。Laplacian 运算符是一种二阶导数算子,可以用来突出图像中的细节和边缘。在 OpenCV 中,cv::Laplacian() 函数用于计算图像的拉普拉斯算子
函数原型
void cv::Laplacian
(
InputArray src,
OutputArray dst,
int ddepth,
int ksize = 1,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
)
参数
- 参数src 源图像。
- 参数dst 目标图像,与源图像具有相同的大小和通道数。
- 参数ddepth 期望的目标图像深度,参见组合选项。
- 参数ksize 用于计算二阶导数滤波器的孔径大小。详情请参阅 getDerivKernels。大小必须为正奇数。
- 参数scale 计算得到的拉普拉斯值的可选缩放因子。默认情况下,不应用任何缩放。详情请参阅 getDerivKernels。
- 参数delta 一个可选的增量值,在将结果存储到 dst 之前会加到结果上。
- 参数borderType 像素外推方法,参见 BorderTypes。BORDER_WRAP 不被支持。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
// 读取图像
cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/erik.jpg", cv::IMREAD_GRAYSCALE );
if ( !src.data )
{
std::cout << "Error: Could not open or find the image." << std::endl;
return -1;
}
cv::Size sz2Sh( 400, 600 );
cv::resize( src, src, sz2Sh, 0, 0, cv::INTER_LINEAR_EXACT );
// 定义目标图像
cv::Mat dst;
// 设置拉普拉斯算子参数
int ddepth = CV_16S; // 目标图像的深度,这里使用16位整数
int ksize = 3; // 孔径大小,一般选择3或5
double scale = 1; // 缩放因子
int delta = 0; // 增量值
int borderType = cv::BORDER_DEFAULT; // 边界类型
// 应用拉普拉斯算子
cv::Laplacian( src, dst, ddepth, ksize, scale, delta, borderType );
// 将结果转换回8位图像
cv::convertScaleAbs( dst, dst );
// 显示原图和拉普拉斯结果
cv::namedWindow( "Original Image", cv::WINDOW_NORMAL );
cv::imshow( "Original Image", src );
cv::namedWindow( "Laplacian Result", cv::WINDOW_NORMAL );
cv::imshow( "Laplacian Result", dst );
// 等待用户按键
cv::waitKey( 0 );
return 0;
}