直方图均衡化实现暗光增强

直方图均衡化(Histogram Equalization, HE) 是一个很经典的方法,可以用来实现暗光图像增强(Low Light Image Enhancement, LLIE) ,尽管现在深度学习很发达,但是从实用和效率的角度而言,该方法还是很好用的。并且该方法也是无监督的,它不需要任何正常光图片作为监督学习。只需要导入暗光图片即可。
具体代码也很简单

import matplotlib.pyplot as plt
from skimage import io, exposure

# Load RGB image
image = io.imread('./low/1.png')

# Apply histogram equalization to each color channel separately
image_eq = exposure.equalize_hist(image, nbins=256)

# Display the original and the equalized image
fig, ax = plt.subplots(ncols=2, figsize=(10, 5))
ax[0].imshow(image)
ax[0].set_title('Original')
ax[1].imshow(image_eq)
ax[1].set_title('Histogram equalization')
plt.show()

实验结果如下
在这里插入图片描述
图片用的是LLIE中很常用的一个数据集LOL-v1
为了更好地验证生成图像的好坏,可以引入PSNR(峰值信噪比,Peak Signal-to-Noise Ratio)和SSIM(结构相似度,Structure Similarity)两个metrics来计算增强图像的质量。其中PSNR越大,图像差异越小,SSIM越大,两张图像越相似,并且SSIM<=1。

计算他们也很简单. 由于之前HE生成的图像是(0,1)区间的,原图是(0,255),需要对image_eq 乘255.

from skimage import io, metrics

# Load the original and reconstructed images
img_original = io.imread('./high/1.png')
img_reconstructed = image_eq*255

# Calculate PSNR
psnr = metrics.peak_signal_noise_ratio(img_original, img_reconstructed)

# Calculate SSIM
ssim = metrics.structural_similarity(img_original, img_reconstructed, multichannel=True)

# Print the results
print(f"PSNR: {psnr:.2f}")
print(f"SSIM: {ssim:.2f}")

计算结果为psnr: 20.94, SSIM: 0.67

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++直方图均衡化是一种常用的图像增强方法,它通过重新分布图像的像素值来增强图像的对比度。下面是C++实现直方图均衡化的一般步骤: 1. 计算直方图:遍历图像的每个像素,统计每个像素值出现的频次,得到原始图像的直方图。 2. 计算累积直方图:对直方图进行累加操作,得到累积直方图。累积直方图表示每个像素值在原始图像中出现的概率。 3. 计算映射表:根据累积直方图,计算每个像素值的映射表。映射表将原始图像中的像素值映射到均衡化后的像素值。 4. 均衡化图像:遍历原始图像的每个像素,根据映射表将原始像素值替换为均衡化后的像素值。 下面是一个简单的C++代码示例,实现直方图均衡化: ```cpp #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; Mat histogramEqualization(const Mat& image) { Mat result = image.clone(); // 计算直方图 Mat hist; int histSize = 256; float range[] = {0, 256}; const float* histRange = {range}; calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange); // 计算累积直方图 Mat cumulativeHist; hist.copyTo(cumulativeHist); for (int i = 1; i < histSize; i++) { cumulativeHist.at<float>(i) += cumulativeHist.at<float>(i - 1); } // 计算映射表 Mat lookupTable(1, histSize, CV_8U); float totalPixels = image.rows * image.cols; for (int i = 0; i < histSize; i++) { lookupTable.at<uchar>(i) = saturate_cast<uchar>(255 * cumulativeHist.at<float>(i) / totalPixels); } // 均衡化图像 LUT(image, lookupTable, result); return result; } int main() { // 读取图像 Mat image = imread("input.jpg", IMREAD_GRAYSCALE); if (image.empty()) { cout << "Failed to read image!" << endl; return -1; } // 直方图均衡化 Mat enhancedImage = histogramEqualization(image); // 显示原始图像和增强后的图像 imshow("Original Image", image); imshow("Enhanced Image", enhancedImage); waitKey(0); return 0; } ``` 以上是一个简单的C++实现直方图均衡化的示例代码。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值