OpenCV拉普拉斯变换

时间:2022-02-23 20:05:17

拉帕拉斯变换用来检测物体的边缘信息
在图像平坦(灰度值无变换的区域),拉普拉斯滤波后的图像在该区域的强度值为0.在图像灰度值剧烈变换的区域(边缘),拉普拉斯滤波后的图像的强度值(绝对值)相对较大。
物体边缘一般在强度值的零交点(注意:并不是在强度值为0的点,而是在强度值从正变换到负,或从负变换到正的过程中,隐含存在的为0的亚像素级的点)。

拉普拉斯变换变换可用于图像增强(原图像减去拉普拉斯变换的图像),原理大体为:
图像相对平坦的区域拉普拉斯变换后的值约等于0。像素(原)-0=像素(原),即该区域图像几乎没有变化。
在图像中强度值变换剧烈的地方,通常是物体的边缘处,拉普拉斯变换后的该区域的强度值(绝对值)较大。那么 像素(原)-像素(变换后),肯定会发生变化。例如:150(原)-50(变换后的 )=100,该点处的像素变黑。(拉普拉斯变换后的图像为32位浮点数,需要转换后8位的灰度图。本文转换后,负值和0值,统一变为0,正值仍为正值。具体看下面的代码)
这就相当于,拿了一根黑色的笔,在物体的边缘处描了一圈,让物体的边缘更加凸显(图像增强)。

因为拉普拉斯变换(滤波)的凸显边缘(高频信息)的特性,其属于高通滤波
代码实现
源.cpp

#include"Laplacain.h"
int main()
{
cv::Mat image = cv::imread("D:/images/111.jpg", 0);
Laplacain h;
//拉普拉斯滤波
h.computeLaplacian(image);
//滤波后图像转CV_8U格式
cv::Mat result=h.getLaplacianImage(1);
cv::namedWindow("原图", CV_WINDOW_FREERATIO);
cv::namedWindow("拉普拉斯增强", CV_WINDOW_FREERATIO);
cv::namedWindow("拉普拉斯", CV_WINDOW_FREERATIO);
cv::imshow("原图", image);
//减去拉普拉斯变换图片(CV_8U)格式
//平坦的图像区域不变,边缘区域增强(边缘线条变黑)
image = image - result;
cv::imshow("拉普拉斯增强", image);
cv::imshow("拉普拉斯", result);
cv::waitKey(0);
}

Laplacain.h

#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\core\core.hpp>

class Laplacain
{
private:
cv::Mat image;
cv::Mat laplacian;
int aperture;
public:
Laplacain() :aperture(3){}
//设置核的大小
void setAperture(int i)
{
aperture = i;
}
//拉普拉斯滤波
cv::Mat computeLaplacian(const cv::Mat& image)
{
cv::Laplacian(image, laplacian, CV_32F, aperture);
this->image = image.clone();
return laplacian;
}
//转换为可显示的灰度图格式
cv::Mat getLaplacianImage(double scale = -1.0)
{
cv::Mat laplaceImage;
if (scale < 0)
{
double lapmin, lapmax;
cv::minMaxLoc(laplacian, &lapmin, &lapmax);
scale = 127 / std::max(-lapmin, lapmax);
laplacian.convertTo(laplaceImage, CV_8U, scale, 255);
}
else
{
//0(平坦地区),在边缘处的绝对值大
//通过适当的设置scale和beta(本例-50),可以改变增强图像效果
// newgray=oldgray*scale+(-50)。计算后值大于255设为255,小于0为0。
laplacian.convertTo(laplaceImage, CV_8U, scale, -50);
}


return laplaceImage;
}
};

结果:
OpenCV拉普拉斯变换
OpenCV拉普拉斯变换
OpenCV拉普拉斯变换