上一篇写了图像提取 和方位纠正 这篇 进行图片增强
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class GammaCorrection {
static {
String opencvLibPath = "D:\\Program Files\\desk\\opencv\\build\\java\\x64\\opencv_java4100.dll";
// System.setProperty("java.library.path",
// System.getProperty("java.library.path") + ";" + opencvLibPath);
System.load(opencvLibPath);
}
// Gamma校正 fGamma=0.45是常用值
public static void gammaCorrection(Mat src, Mat dst, float fGamma) {
// 检查输入图像是否为空
if (src.empty()) {
throw new IllegalArgumentException("输入图像为空");
}
// 构建查找表
byte[] lut = new byte[256];
for (int i = 0; i < 256; i++) {
lut[i] = (byte) Math.min(255, Math.pow(i / 255.0, fGamma) * 255.0);
}
// 克隆输入图像到输出图像
src.copyTo(dst);
// 获取图像的通道数
int channels = dst.channels();
if (channels == 1) {
// 单通道图像
for (int i = 0; i < dst.rows(); i++) {
for (int j = 0; j < dst.cols(); j++) {
byte[] data = new byte[1];
dst.get(i, j, data);
data[0] = lut[data[0] & 0xFF];
dst.put(i, j, data);
}
}
} else if (channels == 3) {
// 三通道图像
for (int i = 0; i < dst.rows(); i++) {
for (int j = 0; j < dst.cols(); j++) {
byte[] data = new byte[3];
dst.get(i, j, data);
data[0] = lut[data[0] & 0xFF];
data[1] = lut[data[1] & 0xFF];
data[2] = lut[data[2] & 0xFF];
dst.put(i, j, data);
}
}
}
}
public static void main(String[] args) {
// 加载OpenCV库
// 读取图像
Mat image = Imgcodecs.imread("D:\\newWorK\\knanaEWB_new/src.jpg");
// 克隆图像并进行类型转换
Mat src = image.clone();
src.convertTo(src, CvType.CV_32FC3, 1.0 / 255);
// 高斯模糊
Mat gauss = new Mat();
Imgproc.GaussianBlur(src, gauss, new Size(101, 101), 0);
// 图像处理
Mat dst = new Mat();
Core.divide(src, gauss, dst);
dst.convertTo(dst, CvType.CV_8UC3, 255);
// Gamma变换
Mat matGamma = new Mat();
gammaCorrection(dst.clone(), matGamma, 1.5f);
// 显示最终结果
// HighGui.namedWindow("Source", HighGui.WINDOW_NORMAL);
HighGui.namedWindow("dst", HighGui.WINDOW_NORMAL);
HighGui.imshow("Source", image);
HighGui.imshow("dst", matGamma);
HighGui.waitKey();
// 释放资源
image.release();
src.release();
gauss.release();
dst.release();
matGamma.release();
}
}