题目来源于:南京师范大学韦玉春教授慕课国家精品课《遥感数字图像处理》程序设计建议
OpenCV如何配置在IDEA中自行百度
环境:win10+IDEA2021.2.3+jdk11.0.1+OpenCV-460.jar
一、简介
背景:直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。
二、算法流程
1.根据图像计算直方图和累计直方图
2.将累计直方图进行区间转换
例如:已知一幅图像的像素分布为7×7,根据像素值,则可以计算得到统计直方图
根据统计直方图,可以算出归一化直方图和累计直方图
由8个灰度级转换为256个灰度级,进行区间转换,转换时对结果进行四舍五入,所以会出现两个灰度级转换并入一个灰度级
二、具体实现
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
/**
* @Author: jue_chen
* @Date: 2022/11/01/ 15:29
* @Attention: 转载, 引用请注明出处
*/
public class HistogramEqualization {
//加载本地动态链接库
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
//直方图均衡化
public Mat histEqualization(String path) {
//以灰度图的形式读入
Mat mat = Imgcodecs.imread(path, 0);
HighGui.imshow("原图", mat);
//定义直方图均衡化后的图像
Mat mat_equalize = new Mat();
//进行直方图均衡化
Imgproc.equalizeHist(mat, mat_equalize);
HighGui.imshow("均衡化后的图像", mat_equalize);
HighGui.waitKey();
return mat_equalize;
}
public static void main(String[] args) {
HistogramEqualization he = new HistogramEqualization();
Mat mat = he.histEqualization("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\10.png");
//将均衡化后的图像存入文件
Imgcodecs.imwrite("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\10_he.png", mat);
}
}
三、结果
1.读入的图像
2.经过均衡化后的图像
从中可以看出图像的对比度得到了较大的提高,突出了更多的细节,直方图均衡化处理之后,原来比较少像素的灰度会被分配到别的灰度去,像素相对集中, 处理后灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像