//6. laplacian transform 拉普拉斯变换--------------------------------------------------------------------
cv::Mat laplace;
LaplacianZCC laplacian;
laplacian.setAperture(7);
cv::Mat flap = laplacian.computeLaplacian(image);//计算
laplace = laplacian.getLaplacianImage();//获取
cv::namedWindow("laplace");//显示
cv::imshow("laplace", laplace);
//显示图像部分laplacian数据:从点(130,150)开始12X12
std::cout << std::endl;
for (int i = 0; i<15; i++) {
for (int j = 0; j<15; j++)
std::cout << std::setw(5) << static_cast<int>(flap.at<float>(i+135 , j+362) / 100) << " ";
std::cout << std::endl;
}
std::cout << std::endl;
cv::Mat LaplacianZCC::computeLaplacian(const cv::Mat & image)
{
cv::Laplacian(image, laplace, CV_32F, aperture);
img = image.clone();//备份原图像用于零点交叉画线使用
return laplace;
}
//返回8位图像存储的Laplacian结果,零点交叉于灰度值128,若 未指定scale,则最大值将被放缩至强度255
//使用前先调用computeLaplacian 计算laplace
cv::Mat LaplacianZCC::getLaplacianImage(double scale)
{
if (scale < 0)
{
double lapmin, lapmax;
cv::minMaxLoc(laplace, &lapmin, &lapmax);
scale = 127 / std::max(-lapmin, lapmax);
}
cv::Mat laplaceImage;
laplace.convertTo(laplaceImage, CV_8U, scale, 128);
return laplaceImage;
}
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
class LaplacianZCC
{
public:
LaplacianZCC() :aperture(3)
{
}
~LaplacianZCC();
void setAperture(int a)
{
aperture = a;
}
cv::Mat computeLaplacian(const cv::Mat &image);
cv::Mat getLaplacianImage(double scale = -1.0);
private:
cv::Mat img; //原图
cv::Mat laplace; //laplacian的32位浮点图像
int aperture; //laplacian卷积核的大小
};