OpenCV_(Laplacian Transform to find the edges)图像拉普拉斯变换查找边缘 图像识别

//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卷积核的大小
};




你可能感兴趣的:(OpenCV_(Laplacian Transform to find the edges)图像拉普拉斯变换查找边缘 图像识别)