热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

图像直方图及直方图均衡总结(一)经典方法(附matlab和opencv端算法实现)

直方图的概念理解图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种

直方图的概念理解

图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。

图像灰度直方图:一副数字图像有[0~255]灰度级,直方图定义如下:
h(gk)=nk
其中,gk是第k个灰度级(如:255),nk是该灰度级的个数。
归一化直方图定义如下:
p(gk)=h(gk)n=nkn
即:第k个灰度级出现的数量,比上所有灰度级数量总和。


直方图均衡化

均衡化的基本思想是:尽量使得每个灰度级的像素数量相等。

if length(size(H))>2H=rgb2gray(H);
end[m,n]=size(H);
p=zeros(1,256);
for i=0:255 p(i+1)=length(find(H==i))/(m*n);
end
subplot(2,2,1);
imshow(H);
title('原图');
subplot(2,2,2);
bar(0:255,p,'b');
title('原图直方图'); s=zeros(1,256);
for i=1:256 for j=1:i s(i)=p(j)+s(i); end
end a=round(s*255);
b=H;
for i=0:255 b(find(H==i))=a(i+1);
end
subplot(2,2,3);
imshow(b)
title('均衡化后图像'); for i=0:255 GPeq(i+1)=sum(p(find(a==i)));
end
subplot(2,2,4);
bar(0:255,GPeq,'b'); title('均衡化后的直方图');
OutImg=Img;
R = Img(:,:,1);
G = Img(:,:,2);
B = Img(:,:,3); R = histeq(R, 256);
G = histeq(G, 256);
B = histeq(B, 256); OutImg(:,:,1) = R;
OutImg(:,:,2) = G;
OutImg(:,:,3) = B; figure,
subplot(1,2,1),
imshow(Img);title('原始图像');
subplot(1,2,2),
imshow(OutImg); title('均衡化后结果');
}

opencv中直方图均衡化的源码程序如下:

CV_IMPL void cvEqualizeHist( const CvArr* srcarr, CvArr* dstarr ) { CvMat sstub, *src = cvGetMat(srcarr, &sstub); CvMat dstub, *dst = cvGetMat(dstarr, &dstub); CV_Assert( CV_ARE_SIZES_EQ(src, dst) && CV_ARE_TYPES_EQ(src, dst) && CV_MAT_TYPE(src->type) == CV_8UC1 ); CvSize size = cvGetMatSize(src); if( CV_IS_MAT_CONT(src->type & dst->type) ) { size.width *= size.height; size.height = 1; } int x, y; const int hist_sz = 256;//0到255,一共256个灰度值 int hist[hist_sz]; memset(hist, 0, sizeof(hist)); for( y = 0; y data.ptr + src->step*y; for( x = 0; x data.ptr + src->step*y; uchar* dptr = dst->data.ptr + dst->step*y; for( x = 0; x
下面是实例程序及结果:

#include using namespace cv;
using namespace std;int main()
{灰度图像均衡//Mat srcImage = imread("D:\\fcq_proMatlab\\vessel_edge_extration\\image\\6.jpg");//if (!srcImage.data)// return 1;//Mat srcGray;//cvtColor(srcImage, srcGray, CV_BGR2GRAY);//imshow("srcGray", srcGray);直方图均衡化 //Mat heqResult;//equalizeHist(srcGray, heqResult);//imshow("heqResult", heqResult);//彩色图像均衡Mat srcImage = imread("D:\\fcq_proMatlab\\vessel_edge_extration\\image\\6.jpg");if (!srcImage.data)return 1;// 存储彩色直方图及图像通道向量 Mat colorHeqImage;vector BGR_plane;// 对BGR通道进行分离,分别对各个通道进行直方图均衡化 split(srcImage, BGR_plane);for (int i = 0; i }
效果图:





自适应直方图均衡化(Adaptive histgram equalization/AHE)


限制对比度自适应直方图均衡(Contrast Limited Adaptive histgram equalization/CLAHE)

关于自适应均衡方法,还是单独拿出来写吧,东西太多了看起开也不方便~

以上算法实现都亲自测试过,如果有问题还请告知啊。


参考:

《冈萨雷斯--图像处理》

http://blog.jobbole.com/84215/

http://blog.csdn.net/baimafujinji/article/details/50614332

http://blog.csdn.net/wenhao_ir/article/details/51240973

http://blog.csdn.net/zxc024000/article/details/49130605

http://blog.csdn.net/zizi7/article/details/50518798




推荐阅读
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ... [详细]
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 深度学习理论解析与理解
    梯度方向指示函数值增加的方向,由各轴方向的偏导数综合而成,其模长表示函数值变化的速率。本文详细探讨了导数、偏导数、梯度等概念,并结合Softmax函数、卷积神经网络(CNN)中的卷积计算、权值共享及池化操作进行了深入分析。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
author-avatar
mobiledu2502923007
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有