OpenCV计算拉普拉斯算子,拉普拉斯算子也是一种基于图像导数运算的高通线性滤波器,它通过计算二阶导数来度量图像函数的曲率。
如何实现
在OpenCV中,可用cv::Laplacian
函数计算图像的拉普拉斯算子。它与cv::Sobel
函数非常类似。实际上,为了获得核心矩阵,它们使用了同一个基本函数cv::getDerivKernels
。根据定义,它采用二阶导数,因此和cv::Sobel
函数唯一的区别是它没有用来表示导数的阶的参数。
我们为这个算子创建一个简单的类,封装几个与拉普拉斯算子有关的运算。基本的属性和方法如下所示:
class LaplacianZC {
private:
// 拉普拉斯算子
cv::Mat laplace;
// 拉普拉斯内核的孔径大小
int aperture;
public:
LaplacianZC() : aperture(3) {}
// 设置内核的孔径大小
void setAperture(int a) {
aperture= a;
}
// 计算浮点数类型的拉普拉斯算子
cv::Mat computeLaplacian(const cv::Mat& image) {
// 计算拉普拉斯算子
cv::Laplacian(image, laplace, CV_32F, aperture);
return laplace;
}
拉普拉斯算子的计算在浮点数类型的图像上进行。与上文一样,要对结果做缩放处理才能使其正常显示。缩放基于拉普拉斯算子的最大绝对值,其中数值0对应灰度级128。类中有一个方法可获得下面的图像表示:
// 获得拉普拉斯结果,存在8位图像中
// 0表示灰度级128
// 如果不指定缩放比例,那么最大值会放大到255
// 在调用这个函数之前,必须先调用computeLaplacian
cv::Mat getLaplacianImage(double scale=-1.0) {
if (scale<0) {
double lapmin, lapmax;
// 取得最小和最大拉普拉斯值
cv::minMaxLoc(laplace, &lapmin, &lapmax);
// 缩放拉普拉斯算子到127
scale= 127/ std::max(-lapmin, lapmax);
}
// 生成灰度图像
cv::Mat laplaceImage;
laplace.convertTo(laplaceImage, CV_8U, scale,128);
return laplaceImage;
}
使用这个类,从7×7内核计算拉普拉斯图像的方法为:
// 用LaplacianZC类计算拉普拉斯算子
LaplacianZC laplacian;
laplacian.setAperture(7); // 7×7的拉普拉斯算子
cv::Mat flap= laplacian.computeLaplacian(image);
laplace= laplacian.getLaplacianImage();
得到的图像如下所示。
酷客网相关文章:
评论前必须登录!
注册