博客
关于我
直方图均衡化算法原理与c++实现
阅读量:798 次
发布时间:2023-04-15

本文共 2416 字,大约阅读时间需要 8 分钟。

直方图均衡是一种基础的图像增强算法,核心目标是通过非线性拉伸,使图像的灰度级分布更加均匀,从而提升图像的对比度。理解这一算法的优势与局限,对于实际应用至关重要。

优势分析

直方图均衡在处理对比度不足的图像时表现尤为突出。特别是在背景和前景都较亮或较暗的场景中,能够显著增强细节对比度。在技术实现上,该算法计算量较小,完全符合实时处理要求。此外,该算法是可逆的,意味着一旦掌握均衡化函数,就可以准确恢复原始图像。

局限性考量

尽管直方图均衡具有显著的应用价值,但其单一性也带来了局限性。该算法对图像进行处理时,通常会忽略对某些特定区域的精细控制,这可能导致背景噪声增强或重要细节对比度降低。因此,在对特征提取要求较高的场景中,应当谨慎应用这一技术。

算法原理

直方图均衡的核心在于设计一个灰度变换函数f(x),确保输出灰度级不低于输入,同时保持输出灰度范围与输入一致。根据冈萨雷斯的描述,一个经典的变换函数能够满足这一条件,具体推导过程涉及概率论知识。

该变换函数通过直方图数据计算每个灰度级的累积频率,最终确定输出灰度值。这种方法能够有效均衡图像的灰度分布,使其更具对比度。

代码实现

以下是基于OpenCV的直方图均衡实现代码:

#include 
#include
#include
void Histogram_equalization(cv::Mat& src, cv::Mat& dst) { CV_Assert(src.depth() == CV_8U); src.copyTo(dst); int nr = src.rows; int nc = src.cols; int pixnum = nr * nc; if (src.channels() == 1) { int gray[256] = { 0 }; for (int i = 0; i < nr; ++i) { const uchar* ptr = src.ptr
(i); for (int j = 0; j < nc; ++j) { gray[ptr[j]]++; } } int LUT[256]; int sum = 0; for (int k = 0; k < 256; ++k) { sum += gray[k]; LUT[k] = 255 * sum / pixnum; } for (int i = 0; i < nr; ++i) { const uchar* ptr_src = src.ptr
(i); uchar* ptr_dst = dst.ptr
(i); for (int j = 0; j < nc; ++j) { ptr_dst[j] = LUT[ptr_src[j]]; } } } else { int B[256] = { 0 }; int G[256] = { 0 }; int R[256] = { 0 }; for (int i = 0; i < nr; ++i) { for (int j = 0; j < nc; ++j) { B[src.at
(i, j)[0]]++; G[src.at
(i, j)[1]]++; R[src.at
(i, j)[2]]++; } } int LUT_B[256], LUT_G[256], LUT_R[256]; int sum_B = 0, sum_G = 0, sum_R = 0; for (int k = 0; k < 256; ++k) { sum_B += B[k]; sum_G += G[k]; sum_R += R[k]; LUT_B[k] = 255 * sum_B / pixnum; LUT_G[k] = 255 * sum_G / pixnum; LUT_R[k] = 255 * sum_R / pixnum; } for (int i = 0; i < nr; ++i) { for (int j = 0; j < nc; ++j) { dst.at
(i, j)[0] = LUT_B[src.at
(i, j)[0]]; dst.at
(i, j)[1] = LUT_G[src.at
(i, j)[1]]; dst.at
(i, j)[2] = LUT_R[src.at
(i, j)[2]]; } } }}int main() { cv::Mat src = cv::imread("art.jpg"); if (src.empty()) { return -1; } cv::cvtColor(src, src, CV_RGB2GRAY); cv::Mat dst; Histogram_equalization(src, dst); cv::namedWindow("src"); cv::imshow("src", src); cv::namedWindow("dst"); cv::imshow("dst", dst); cv::waitKey(0);}

效果展示

通过上述代码处理后的结果清晰可见,原图与输出图像的对比度得到显著提升,细节更加丰富,图像整体效果更具视觉吸引力。

转载地址:http://frrfk.baihongyu.com/

你可能感兴趣的文章
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>