图像处理:直方图规定化
直方图均衡化能够自动的扩展图像灰度的动态范围从而提高图像的对比度增强视觉效果。但是并非所有的图像都适合直方图均衡化,例如图像中大部分灰度值接近0时,由于接近0的像素多权重大,根据均衡原理使用(L-1)*累计概率会造成暗像素的值急剧上升,最终图像亮度变高出现“冲淡效果”。而直方图规定化是使图像具有指定的概率密度分布,在一些情况下能够获得更好的处理效果。
简单叙述一下具体的步骤:
(1)计算图像直方图并进行直方图均衡化得到变化后的灰度。
(2)利用规定的直方图进行直方图均衡化获得变换函数G的所有值,将G的值存入表中。
(3)对于每个均衡化灰度S,在G值得表中找相应的Z值,使得G的值最接近S值,并存储S到Z的映射。
(4)建立原始图想灰度R到Z的映射,最后根据映射关系重建图像,即可获得均衡化图像。
代码本来想在网上撸一个,结果感觉都看不懂,还是根据原理自己使用C++写一个吧,关键是使用数据结构Map建立映射表。主要代码封装成下面函数HistogramSpecification(Mat &src, Mat &dst, float zhist[])。
/************************************************
@参数:Mat &src 输入图像
@参数:Mat &dst 输出图像
@参数:float zhist[] 规定化的归一化直方图
************************************************/
void HistogramSpecification(Mat &src, Mat &dst, float zhist[])
{src.copyTo(dst); //src拷贝到dstint h = src.rows; //图像高度int w = src.cols; //图像宽度int hist[256] = {0}; //各级像素数目int S[256] = { 0 };map<int, int> S2Z; //S到Z的映射map<int, int> r2z; //r到Z的映射//直方图统计for (int i = 0; i < h; i++) {uchar* p = src.ptr<uchar>(i);for (int j = 0; j < w; j++){int vaule = p[j];hist[vaule]++;}}//归一化累加直方图float sumhist[256] = { 0 };for (int i = 0; i < 256; i++){int sum = 0;for (int j = 0; j <= i; j++)sum += hist[j];sumhist[i] = sum*1.0 / (h*w);}//根据sumhist建立均衡化后灰度级数组Sfor (int i = 0; i < 256; i++)S[i] = 255 * sumhist[i] + 0.5;//根据zsumhist建立均衡化后灰度级数组Gint G[256] = { 0 };float zsumhist[256] = { 0.0 };for (int i = 0; i < 256; i++){float sum = 0;for (int j = 0; j <= i; j++)sum += zhist[j];zsumhist[i] = sum;}for (int i = 0; i < 256; i++)G[i] = zsumhist[i] * 255 + 0.5;//令G(Z)=S 建立S->Z的映射表for (int i = 0; i < 256; i++) {for (int j = 1; j < 256; j++){if (abs(S[i] - G[j - 1]) < abs(S[i] - G[j])){S2Z[S[i]] = j - 1; break;}}}S2Z[S[255]] = G[255];//建立r->z映射,即为原像素到规定化像素的映射for (int i = 0; i < 256; i++)r2z[i] = S2Z[S[i]];//重建图像for (int i = 0; i < h; i++) {uchar *pdata = dst.ptr<uchar>(i);for (int j = 0; j < w; j++){*(pdata + j) = r2z[*(pdata + j)];}}
}
由于规定化的直方图是根据实际需求而设计的,所以没有统一标准。在这里我的直方图如下:
对比一下均衡化的效果和规定化的效果:
上图下对比还是比较明显的,均衡化的效果真的不好,规定化的效果稍微强一点(主要是我使用的规定化直方图是瞎整的)。若想要获得更好的效果可以更具实际情况改变规定化直方图。
图像处理:直方图规定化相关推荐
- 数字图像处理 直方图规定化 MATLAB实验
一.原理 直方图规定化是使原图像灰度直方图变成规定形状的直方图而对图像做修正的增强方法. 二.步骤 ①读入原图像huafen.jpg,并显示图像及其直方图: ②读入参考图像rice.tif,并显示图像 ...
- 【学习图像处理】之实验二——灰度图像直方图规定化
灰度图像直方图规定化 图像增强 一.实验内容 二.灰度直方图 1.什么是灰度直方图? 2.直方图均衡化 3.直方图规定化 三.代码实现与分析 0.辅助功能实现 1.绘制原图像直方图SH 2.绘制均衡直 ...
- 直方图规定化、均衡化变换—Matlab数字图像处理(三)
直方图变换 灰度直方图反映了数字图像中每一灰度级与其出现像素频率间的统计关系,由于图像灰度分布集中在狭窄的区间,会引起图像的细节不清晰.采用直方图修正,可以使图像的灰度间距拉开或均匀,从而增大反差 ...
- java 灰度直方图_【数字图像处理】灰度直方图、直方图均衡化、直方图规定化...
灰度直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少. 图像的灰度直方图是灰 ...
- 根据MATLAB的histeq函数改写的运行在OpenCV下的直方图规定化C源码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 2016-6-8日用C++也实现了直方图规定化, ...
- [图像处理] 直方图均衡化原理 - 数学推导
直方图均衡化 效果 代码 import cv2 as cv import numpy as np import matplotlib.pyplot as pltsrc = cv.imread(&quo ...
- 【图像处理 直方图 OpenCV实现】
直方图与直方图匹配 最后一个代码比较实用,对于小角度的模板匹配,还是可以用此函数的. 文章目录 前言 一.直方图 二.使用步骤 1.引入库 2.绘制直方图 总结 前言 直方图统计的原理.直方图代表的图 ...
- 直方图规定化(直方图匹配)
在介绍直方图规定化之前,先介绍一下统计直方图和累积直方图.参考自:http://blog.csdn.net/tkp2014/article/details/40151515 对颜色特征的表达方式有许多 ...
- 直方图规定化之SML和GML映射
参考: 章毓晋. 图像工程(上册):图像处理[M]. 北京: 清华大学出版社,2006. 灰度直方图规定化实现方法的分析 pdf http://blog.csdn.net/juyingmin/arti ...
最新文章
- 帧中继-实验(第三篇)
- 牛客java面试题总结版(二)
- 05-CA/TA编程:hmac demo
- Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透
- windows查看文件MD5值
- android 字符串特殊字符转义
- MySQL group-by-modifiers
- java db4o,DB4O--java对象数据库
- 你不知道的二手车分期购车背后的套路
- ssd网络结构简单说明
- excel删除无尽空白行_Word技巧:快速删除Word文档中的空行
- 记一款价廉物美的小型DAC+耳放----Dr.DAC
- 高仿QQ创建搜索框以及拼音检索好友
- android 转盘菜单,Android实现可点击的幸运大转盘
- 计算机里多了一个硬盘q,电脑上多了个本地磁盘Q怎么回事
- 微信小程序云开发连接MySQL数据库
- strtus1 html5,struts1.x的入门级学习教程
- 2.Spring Cloud + Spring Boot + Mybatis + Uniapp微服务、云架构分布式企业快速开发架构之Linux 简介
- Unity间接光 ibl(基于图像的渲染)和SH(球谐光照)
- 从2.3.3到4.1.1:最全的android系统源码下载大集合