计算拉普拉斯算子 - sumpig/OpenCV GitHub Wiki

在OpenCV 中,可用 cv::Laplacian 函数计算图像的拉普拉斯算子。

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;
        }

        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;
        }
};
// 用LaplacianZC 类计算拉普拉斯算子
LaplacianZC laplacian;
laplacian.setAperture(7); // 7×7 的拉普拉斯算子
cv::Mat flap = laplacian.computeLaplacian(image);
laplace = laplacian.getLaplacianImage();

用拉普拉斯算子增强图像的对比度

通过从图像中减去它的拉普拉斯图像,可以增强图像的对比度。

高斯差分

现在用两个不同带宽的高斯滤波器对一幅图像做滤波,然后将这两个结果相减,就能得到由较高的频率构成的图像。这些频率被一个滤波器保留,被另一个滤波器丢弃。这种运算称为高斯差分(Difference of Gaussians,DoG)。

cv::GaussianBlur(image, gauss20, cv::Size(), 2.0);
cv::GaussianBlur(image, gauss22, cv::Size(), 2.2);

// 计算高斯差分
cv::subtract(gauss22, gauss20, dog, cv::Mat(), CV_32F);

// 计算DoG 的过零点
zeros = laplacian.getZeroCrossings(dog);