图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

提问:图像直方图均衡化有啥效果?

答:看了下面的两幅截图你就知道了:

从上面两幅的截图中我们发现,将直方图均衡化算法应用于左侧的亮图、对比度不同的各个图像后,得到了右侧直方图大致相同的图像,这体现了直方图均衡化作为强大自适应性的增强工具的作用。当原始图像的直方图不同而图像结构性内容相同时,直方图均衡化所得到的结果在视觉上几乎是完全于致的,其原理我在下面对算法的描述中有详细介绍。这种结果对于在进行图像分析和比较之前将图像转化为统一的形式是十分有益

提问:为啥要在MATLAB下写的图像直方图均衡化源码?MATLAB不是提供了histeq()专门做图像的直方图均衡化吗?

答案:因为二者的结果不一致,不利于算法验证的统一,故在在MATLAB下写图像直方图均衡化源码,函数名取为“my_histeq()"

算法原理及实现步骤如下:

⑴统计图像中各灰度级的出现次数,存储在数组hist_sz中,比如hist_sz(1,200)=2代表第199灰度级的出现次数为2,注意灰度级是199而不是200,因为灰度级的范围是0-255,而MATLAB矩阵是从1开始编号;

⑵建立图像直方图均衡化映射表,并存储在数组lut中,比如lut(1,200)=204代表我们将把原图像中像素灰度值为200的点重新映射为204,建立映射表的方法如下:

①统计小于等于某一级的像素的点有多少个,并存储在变量sum中,比如语句sum=sum+hist_sz(1,3)→sum=4+2→6的意思是:灰度级小于等于1的点数有4个,灰度级为2的点数有2个,所以灰度级小于等于2的点数有6个;
②用对应灰度等级的sum值乘以scale=255/像素总点数,即“scale=255/(height*width); val=sum*scale;”就得到对应灰度级的映射值,并存储在lut数组中!
其实均衡化的核心就在第⑵部,均衡化的原理在于统计小于等于某一级的像素的点有多少个,这实际上是一种新的权重,我们容易发现,在这种权重的支配下,若第i灰度级的像素个数越多,则第i灰度级新的映射值与第i-1灰度级新的映射值之间的差距就越大,这样,就让整幅图像去突出显示占整幅图中个数较多的像素所代表的信息。实际上就是让整幅图按一种规则去显示图像,这种规则就是突出显示点数较多像素所代表的信息,而弱化点数较少像素所代表的信息。所以不管你对原图像怎样调整对比度,均衡化后的图像在对比度上看起来会感觉很相似。

⑶利用存储在lut数组中的映射表去把源图像的像素值作一个新的映射!语句dst(y,x)=lut(1,src_y_x);就实现了这个功能!

my_histeq() 对应的M文件下载链接:http://pan.baidu.com/s/1pLxiUUZ

my_histeq() 源码如下:

function dst = my_histeq(src)
%因为MATLAB自带的histeq()函数与OpenCV中的cvEqualizeHist()结果不一样,所以按OpenCV中的算法写了这个M函数
%作者:wenhao_ir 交流QQ 2487872782
%输入参数src要求是灰度图像,输出dst和src的大小相同,类型也为uint8[height width]=size(src);
dst=zeros(height,width);
hist_sz=zeros(1,256);
src=src+1; %注意,因为MATLAB的数组索引是1到256所以需要加1,主要是因为后面要用像素值作为索引值,%这里加了1,由于整个过程都是线性变换,所以最后的dst输出减1就可以了for y=1:heightfor x=1:widthsrc_y_x=src(y,x);hist_sz(1,src_y_x)=hist_sz(1,src_y_x)+1;endendscale=256/(height*width);%由于对src加了1,所以像素的最大值为256,而不是OpenCV源程序中的255
sum=0;
lut=zeros(1,257); %不知道为啥OpenCV为啥要把这个大小设定为257,个人感觉256就够了for i=1:256sum=sum+hist_sz(1,i);val=sum*scale;lut(1,i)=uint8(val);
endlut(1,1)=0;for y=1:heightfor x=1:widthsrc_y_x=src(y,x);dst(y,x)=lut(1,src_y_x);end
enddst=uint8(dst);
dst=dst-1;

--------------------------------------------------------------

以下是调用自己写的my_histeq的MATLAB实例:

clear all;
close all;
clc;
I=imread('pout.jpg');
I=rgb2gray(I);
histeq_out=histeq(I); %这是系统自带的图像均衡化函数
my_histeq_out=my_histeq(I); %这是自己写的图像均衡化函数

以下是OpenCV的cvEqualizeHist函数源码,位于histogram.cpp中,我写的调用cvEqualizeHist的C源码下载链接如下:

Histogram_Equalization_01.cpp_免费高速下载|百度网盘-分享无限制

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 < size.height; y++ ){const uchar* sptr = src->data.ptr + src->step*y;for( x = 0; x < size.width; x++ )hist[sptr[x]]++; //这里实现了hist中存储各灰度值出现的次数}    float scale = 255.f/(size.width*size.height);int sum = 0;uchar lut[hist_sz+1];for( int i = 0; i < hist_sz; i++ ){sum += hist[i]; //逐级累计int val = cvRound(sum*scale);lut[i] = CV_CAST_8U(val);}lut[0] = 0;//这是通过程序计算出的灰度值映射关系,不管你怎么映射,0肯定是0for( y = 0; y < size.height; y++ ){const uchar* sptr = src->data.ptr + src->step*y;uchar* dptr = dst->data.ptr + dst->step*y;for( x = 0; x < size.width; x++ )dptr[x] = lut[sptr[x]];}
}

-------------------------------------------------------------

以下是运行结果对比,大家可以看出自己写的函数my_histeq和OpenCV的cvEqualizeHist运算结果是一致的,但是MATLAB自带的和cvEqualizeHist是不一样的!

下面是利用equalizeHist函数进行灰度直方图均衡化的C++源码:

源码中用到的图片的下载链接为:flower3.jpg_免费高速下载|百度网盘-分享无限制

//OpenCV版本2.4.9
//交流QQ2487872782 #include <opencv2/opencv.hpp>
int main()
{cv::Mat srcImage = cv::imread("flower3.jpg");if( !srcImage.data ) return 1;cv::Mat srcGray;cv::cvtColor(srcImage, srcGray, CV_BGR2GRAY);cv::imshow("srcGray", srcGray);// 直方图均衡化cv::Mat heqResult;cv::equalizeHist(srcGray, heqResult);cv::imshow("heqResult", heqResult);cv::waitKey(0);return 0;
}

运行结果如下图所示:

下面是不利用equalizeHist函数进行灰度直方图均衡化的C++源码:

源码中用到的图片的下载链接为flower3.jpg_免费高速下载|百度网盘-分享无限制:

//OpenCV版本2.4.9
//交流QQ2487872782 #include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main()
{// 图像获取及验证cv::Mat srcImage = cv::imread("flower3.jpg");if( !srcImage.data ) return 1;// 转化为灰度图像cv::Mat srcGray;cvtColor(srcImage, srcGray, CV_BGR2GRAY);// 计算图像的直方图const int channels[1]={0};const int histSize[1]={256};float hranges[2]={0,255};const float* ranges[1]={hranges};cv::MatND hist;calcHist(&srcGray, 1, channels, cv::Mat(),hist, 1, histSize, ranges);float table[256];int nPix = srcGray.cols * srcGray.rows;// 建立映射表for (int i = 0; i < 256; i++) {   float temp[256];// 像素变换temp[i] = hist.at<float>(i) / nPix * 255;if (i != 0) {// 像素累计table[i] = table[i -1] + temp[i];} else {table[i] = temp[i];}}// 通过映射进行表查找cv::Mat lookUpTable(cv::Size(1, 256), CV_8U);for (int i =0; i <256; i++) {lookUpTable.at<uchar>(i) = static_cast<uchar>(table[i]);}cv::Mat histTransResult;cv::LUT(srcGray, lookUpTable, histTransResult);// 显示图像cv::imshow("srcGray",srcGray);cv::imshow("histTransResult",histTransResult);cv::waitKey(0);return 0;
}

最后是彩色直方图均衡的c++源码如下:

源码中用到的图片的下载链接为flower3.jpg_免费高速下载|百度网盘-分享无限制:

//OpenCV版本2.4.9
//交流QQ2487872782 #include <opencv2/opencv.hpp>
int main()
{// 图像获取及验证cv::Mat srcImage = cv::imread("flower3.jpg");if( !srcImage.data ) return 1;// 存储彩色直方图及图像通道向量cv::Mat colorHeqImage;   std::vector<cv::Mat> BGR_plane;  // 对BGR通道进行分离cv::split(srcImage,BGR_plane);// 分别对BGR进行直方图均衡化for(int i=0; i < BGR_plane.size(); i++)cv::equalizeHist(BGR_plane[i], BGR_plane[i]);// 合并对应各个通道cv::merge(BGR_plane,colorHeqImage);cv::imshow("srcImage", srcImage);cv::imshow("colorHeqImage", colorHeqImage);cv::waitKey(0);return 0;
}

源码中对彩色直方图均衡的步骤是将RGB颜色空间分类成单个通道,然后在每个通道上进行相应直方图均衡,最后再将各个通道下的直方图均衡结果进行合并。

运行结果如下图所示:

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

详解图像直方图均衡化原理,附MATLAB、C、C++源码相关推荐

  1. OpenCV图像处理学习二十,图像直方图均衡化原理与实现

    一.图像直方图的概念 图像直方图,是指对整个图像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图.直方图反映了图像灰度的分布情况,是图像的统计学特征.图像的灰度直方 ...

  2. 直方图均衡化原理与实现

    直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布变成近似均匀分布,从而增强图像的对比度.直方图 ...

  3. jQuery百叶窗效果原理(附3个demo源码)

    jQuery百叶窗效果原理,附3个demo源码 一.前言 二.原理图解 三.在线演示及源码 一.前言 对于轮播图切换,其实可以有更多效果,其中一类型就是百叶窗.本人参考了网上一些特效,做一些练习和实践 ...

  4. 图像转置的MATLAB和OpenCV源码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 注意,图像转置和图像旋转是两回事,图像转置只是把 ...

  5. 【微信小程序系列】小程序简单连接后端数据库完整示例(附免费下载的源码)(Servlet)

    [微信小程序系列]小程序简单连接后端数据库完整示例(附免费下载的源码)(Servlet) 登录页面 login.wxml <view class="page">< ...

  6. 【2021软件创新实验室暑假集训】SpringMVC框架(设计原理、简单使用、源码探究)

    系列文章目录 20级 Java篇 [2021软件创新实验室暑假集训]计算机的起源与大致原理 [2021软件创新实验室暑假集训]Java基础(一) [2021软件创新实验室暑假集训]Java基础(二) ...

  7. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

  8. 云开发喝酒神器2.0微信小程序源码 附搭建教程【源码好优多】

    简介 云开发喝酒神器2.0微信小程序源码 附搭建教程 微信小程序云开发喝酒神器2.0微信小程序源码(带流量主),云开发小程序无法服务器即可搭建,配置有安装文档教程. 下方资源地址 云开发喝酒神器2.0 ...

  9. 直方图均衡化 原理、流程、公式推导及matlab实现

    附上按照上述流程实现的MATLAB代码: clc;close all;clear all; H= imread('测试图\lena512.bmp'); H=H(:,:,1); %判断是否为三通道彩色图 ...

最新文章

  1. MySQL存储过程总结(二)
  2. 怎么将excel中的url批量转化为图片_阿里云+Power BI,轻松实现图片可视化报告(一)...
  3. 关于《Java编程思想》的简单纠正
  4. python css selector_Python爬虫之Selector的用法
  5. 中国智能高清视频监控未来发展趋势
  6. Spring Boot Oauth2安全性
  7. 微型计算机三总线是指,微机原理复习题(完整参考答案版)
  8. ES查询-基本查询续
  9. 华为nova9 SE官网上架:华为首款1亿像素手机
  10. vs2017中配置openGL环境
  11. java怎么导出有模板的表格_java用模板导出数据表格-Go语言中文社区
  12. 哪三级分类java_技术汇总:第五章:使用angularjs做首页三级分类
  13. 自学硬件真的可行吗?单片机原理知识点之存储器结构的理解(1)
  14. Python selenium 文件自动下载 (自动下载器)
  15. 使用DNSStager在DNS中隐藏Payload
  16. 2022年计算机二级考试C语言程序设计冲刺题及答案
  17. linux 之间复制文件,两台Linux服务器之间复制文件
  18. 福利卡巴斯基一年免费以及一些使用软件
  19. 给定一个英文字符串,请写一段代码找出这个字符串中首先出现三次的那个英文字符(需要区分大小写)。 输入描述:
  20. 跌破150美元、市值蒸发3600亿美元,这个圣诞节苹果过得“太冷了”!

热门文章

  1. python恶搞小程序-知道了这个,你也能写出 Python 趣味小程序
  2. 我在学python-我在大学毕业后学习Linux、python的一些经验
  3. python测试开发自学教程-自动化平台测试开发:Python测试开发实战_PDF电子书
  4. 在开课吧学python的经历-做客李晨nic淘宝直播 胡海泉胡彦斌带货开课吧Python
  5. python如何导入txt文件-python如何导入txt数据库?
  6. python菜鸟编程-Python3 函数
  7. python输入输出-Python input()和print()终端输入输出
  8. python 绘制折线图-怎样用python绘制折线图
  9. python编程实例视屏-python爬视频实例
  10. php7和python3性能对比-ava、Python和PHP三者的区别