OpenCV C++ 图像处理实战 ——《多尺度自适应Gamma矫正的低照图像增强》

该博客介绍了如何使用OpenCV C++实现多尺度自适应Gamma矫正来增强低照度图像。通过HSI颜色空间转换、多尺度Retinex分解和自适应Gamma矫正,提升图像亮度和对比度,同时保持色彩自然。文章包含各步骤的功能源码,适用于低对比度图像的增强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、结果演示

在这里插入图片描述
在这里插入图片描述

二、多尺度自适应Gamma矫正的低照度图像增强

为了在提高低照图像的亮度和对比度的同时,保持图像的色彩自然度,提出了多尺度自适应Gamma 矫正的低照图像增强方法。 鉴于 HSI 颜色空间的明度分量 I 决定着图像的明暗程度,以及明度分量的多尺度特性,首先,将图像转换到 HSI 颜色空间,对明度分量 I 进行多尺度 Retinex 分解;然后,对分解得到的多尺度光照图像分别进行自适应的 Gamma 矫正,其中 Gamma 指数自适应于暗区像素的占比,鲁棒地改善光照图像的光照分布,经 Retinex 反变换得到增强的多尺度明度分量;最后,将增强的多尺度明度分量的线性融合作为增强的明度分量 I’,与色相分量 H 和饱和度分量 S 重组,得到最后的增强图像。

在这里插入图片描述
读了上面这篇文章,实验

如果您希望对图像进行切块处理以防止过亮,您可以按照以下方式修改上述代码: ```cpp #include <opencv2/opencv.hpp> int main() { // 读取图像 cv::Mat image = cv::imread("input.jpg", cv::IMREAD_COLOR); if (image.empty()) { std::cout << "Failed to read image!" << std::endl; return -1; } // 定义切块的大小 int blockSize = 64; // 获取图像的宽度和高度 int width = image.cols; int height = image.rows; // 遍历图像切块 for (int y = 0; y < height; y += blockSize) { for (int x = 0; x < width; x += blockSize) { // 计算切块的区域 int blockWidth = std::min(blockSize, width - x); int blockHeight = std::min(blockSize, height - y); cv::Rect blockRect(x, y, blockWidth, blockHeight); // 提取切块图像 cv::Mat blockImage = image(blockRect); // 将切块图像转换为浮点型 cv::Mat floatBlockImage; blockImage.convertTo(floatBlockImage, CV_32F, 1.0 / 255.0); // 计算切块图像的平均亮度 cv::Scalar mean, stdDev; cv::meanStdDev(floatBlockImage, mean, stdDev); // 计算切块图像的伽马校正参数 float gamma = log(0.5) / log(mean[0] / 255.0); // 应用伽马校正 cv::Mat correctedBlockImage; cv::pow(floatBlockImage, gamma, correctedBlockImage); // 将校正后的切块图像转换回8位无符号整型 cv::Mat outputBlockImage; correctedBlockImage.convertTo(outputBlockImage, CV_8U, 255.0); // 将校正后的切块图像复制回原图像中 outputBlockImage.copyTo(image(blockRect)); } } // 显示原始图像和处理后的图像 cv::imshow("Original", image); cv::waitKey(0); return 0; } ``` 在上述代码中,我们添加了一个嵌套循环来遍历图像的切块。每个切块都被提取出来,并按照之前的步骤进行伽马校正。然后,将校正后的切块复制回原始图像中。这样,您就可以对图像进行切块处理,以防止过亮。 请注意,在代码中的`input.jpg`处,您需要替换为您自己的图像文件路径。还可以根据需要调整`blockSize`变量的值以适应不同的切块大小。 希望这对您有所帮助!如有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zero___Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值