OpenCV计算拉普拉斯算子

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();

得到的图像如下所示。

OpenCV计算拉普拉斯算子

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!