环境:Windows10专业版 + IDEA2021.2.3 + jdk11.0.1 + OpenCV-460.jar
系列文章:
(一)Python+GDAL实现BSQ,BIP,BIL格式的相互转换
(二)BSQ,BIL,BIP存储格式的相互转换算法
(三)单波段图像的伪彩色合成:密度分割(含介绍OpenCV中的Mat类)
(四)图像的%2线性拉伸
(五)图像的标准假彩色合成
(六)图像的直方图均衡化
(七)图像的均值滤波
(八)图像的中值滤波
(九)图像的高斯低通滤波
(十)图像的梯度倒数加权平滑
(十一)图像的罗伯特梯度锐化
(十二)图像的Sobel梯度锐化
(十三)图像的拉普拉斯梯度锐化
目录
一、拉普拉斯梯度锐化简介
二、算法流程
三、具体实现
四、实验结果
1、读入的图像
2、经过拉普拉斯算子处理后的图像
一、拉普拉斯梯度锐化简介
拉普拉斯梯度锐化是一种基于图像二阶微分处理的图像增强技术,主要用于提高图像的细节清晰度和边缘识别能力。
以下是该技术的关键点:
1、基本原理:拉普拉斯算子的核心是对图像进行二阶微分运算,以突出像素间灰度值变化剧烈的区域。一阶微分可以描述图像灰度的变化方向,而二阶微分则描述了这种变化的速率。因此,通过计算图像每个像素点的二阶导数,可以检测出图像中的边缘和细节部分。
2、操作过程:在数字图像处理中,拉普拉斯算子通常通过卷积核来实现。这个卷积核会在图像上逐像素移动,对每个像素点的邻域进行加权求和计算,得出该点的二阶导数值。如果一个像素点的值小于其邻域内的平均值,它的值会降低,反之则会提高,这样增强了图像中心像素与其周围像素的对比度,从而实现了图像锐化。
3、应用方法:将拉普拉斯图像与原图叠加,可以得到最终的锐化效果。这个过程相当于高通滤波,它增强了图像的高频成分(即边缘和细节),同时衰减和抑制了低频成分(即平滑区域)。
4、应用场景:这种锐化技术广泛应用于电子印刷、医学成像、工业检测等领域,有助于改善图像质量,使图像中的细节更加清晰可见。
5、优缺点:能对任何走向的界线和线条进行锐化,无方向性;但对噪声比较敏感,会放大噪声。
拉普拉斯梯度锐化通过对图像进行二次微分处理,强化了图像的边缘及细节信息,有助于提升图像的清晰度和可识别性。
二、算法流程
(以单波段图像为例)
1、利用OpenCV读入图像,将像素存储在数组里
2、标准拉普拉斯算子的模板为:
3、将经过拉普拉斯算子处理后的像素值存入数组合成图像并存储
三、具体实现
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
/**
* @Author: HNUST_jue_chen
* @Date: 2022/11/05/ 15:29
* @Attention: 转载, 引用请注明出处
*/
public class LaplaceOperator {
//加载本地动态链接库
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
//拉普拉斯算子
public Mat laplaceSharping(String path) {
//使用Mat类存储图像信息
Mat mat = Imgcodecs.imread(path);
//图像的大小
int rows = mat.rows();
int cols = mat.cols();
//获得原图像像素数组
int[][] mat_arr = new int[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
mat_arr[i][j] = (int) mat.get(i, j)[0];
}
}
//使用拉普拉斯算子进行锐化
int[][] mat_arr_laplaceSharp = new int[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
//处理非边缘的像素
if (i != 0 && i != rows - 1 && j != 0 && j != cols - 1) {
mat_arr_laplaceSharp[i][j] = (mat_arr[i - 1][j] + mat_arr[i][j - 1]
+ mat_arr[i][j + 1] + mat_arr[i + 1][j] - mat_arr[i][j] * 4);
} else { //处理边缘像素
mat_arr_laplaceSharp[i][j] = mat_arr[i][j];
}
}
}
//合成图像
Mat mat_laplaceSharp = new Mat(rows, cols, CvType.CV_32SC1);
//将像素放入图像
for (int i = 0; i < rows; i++) {
//一次放入一行像素值
mat_laplaceSharp.put(i, 0, mat_arr_laplaceSharp[i]);
}
return mat_laplaceSharp;
}
public static void main(String[] args) {
LaplaceOperator lo = new LaplaceOperator();
Mat mat = lo.laplaceSharping("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\2_gray.png");
//将经过拉普拉斯锐化后的图像写入文件
Imgcodecs.imwrite("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\2_gray_lo.png", mat);
}
}