一、什么是直方图规定化?

1、定义:直方图规定化是指一幅输入图像经过点运算变化,将原图像的灰度直方图改造成所希望的直方图形状。
2、目的:变换直方图使之成为某个想要的形状。但由于数字图像的灰度级是离散并且是有限的,所以直方图规定化的结果一般只是与目标直方图的形状大体接近,并非理想的完全一致。
3、功效:比直方图均衡化更加灵活(直方图均衡化可看成特殊的直方图规定化),常用与图片风格一致性的自动处理。
4、直方图规定化的应用
① 能有效地改善图像的整体或局部特征,广泛运用在图像增强处理中。
② 保证不同图像的影调风格的一致性,在处理艺术图像时十分有用。

二、直方图规定化的原理

直方图规定化有两种方式:SML单映射和GML组映射。
✔ ① SML单映射的实现原理是:首先计算原始图像和规定目标的累计直方图(将统计直方图归一化到(0, 1)之间,再计算累计概率分布函数),然后对原图像的累计直方图寻求一一映射关系(每个灰度值映射到与目标的累计直方图最近的点)。有了映射关系后,遍历原图像的每个像素点,做相应的点运算变换即可。
✔ ② GML单映射的实现原理是:首先计算原始图像和规定目标的累计直方图(将统计直方图归一化到(0, 1)之间,再计算累计概率分布函数),然后对原图像的累计直方图进行分组:先在原图像的累计直方图中找到与目标直方图的每个灰度值距离最近的点(如下图的所示的 0→3;3→5;7→7,即0,3,7为在原图像中要找的点),让点与点之间构成一组,映射到目标直方图中对应的灰度值。有了映射关系后,遍历原图像的每个像素点,做相应的点运算变换即可。

三、直方图规定化的实现

由上述一个简单的小例子可以看出,GML组映射比SML单映射的规定化效果要好,所以我们这里采用GML的方式来实现,具体代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;Mat gray_hist; //直方图计算的结果
void CalHistogram(Mat& img);
void HistMap(Mat& img_src, Mat& img_obj);int main()
{//注意imread后不加参数,默认读取进来的是RGB图像Mat img_src = imread("D:\\数字图像处理\\图片素材\\Bmp Samples\\24位真彩.bmp");Mat img_obj = imread("D:\\数字图像处理\\图片素材\\基本运算\\欧美系\\欧美系2.bmp");Mat imgOutput; //规定化后的输出图像//分割原图像通道vector<Mat> src_channels;Mat src_blue, src_green, src_red;split(img_src, src_channels);src_blue = src_channels.at(0);src_green = src_channels.at(1);src_red = src_channels.at(2);//分割目标图像通道vector<Mat> obj_channels;Mat obj_blue, obj_green, obj_red;split(img_obj, obj_channels);obj_blue = obj_channels.at(0);obj_green = obj_channels.at(1);obj_red = obj_channels.at(2);//分别对BGR通道做直方图规定化HistMap(src_blue, obj_blue);HistMap(src_green, obj_green);HistMap(src_red, obj_red);//合并通道,输出结果merge(src_channels, imgOutput); //显示图像imshow("img_src", img_src);imshow("img_obj", img_obj);imshow("imgOutput", imgOutput);waitKey(0);return 0;
}void CalHistogram(Mat& img)
{if (img.empty())return;//设定bin数目int histsize = 256; //设定取值范围float range[] = { 0, 256 };const float* histRange = { range };//调用OpenCV函数计算直方图,计算结果保存到gray_hist中calcHist(&img, 1, 0, Mat(), gray_hist, 1, &histsize, &histRange);
}void HistMap(Mat& img_src, Mat& img_obj)
{int i, j; //循环变量double gray_temp = 0; //中间结果,用于计算累计直方图double totalPixel; //像素总数//计算原图像直方图,并归一化到(0, 1)CalHistogram(img_src);totalPixel = img_src.rows * img_src.cols;double srcHist[256];for (i = 0; i < 256; i++){srcHist[i] = gray_hist.at<float>(i) / totalPixel;}//计算原图像直方图的累计概率 0 ~ 1double srcCumHist[256];for (i = 0; i < 256; i++){gray_temp = 0;for (j = 0; j <= i; j++){gray_temp += srcHist[j];}srcCumHist[i] = gray_temp;}//计算目标图像直方图CalHistogram(img_obj);totalPixel = img_obj.rows * img_obj.cols;double objHist[256];for (i = 0; i < 256; i++){objHist[i] = gray_hist.at<float>(i) / totalPixel;}//计算目标图像直方图的累计概率 0 ~ 1double objCumHist[256];for (i = 0; i < 256; i++){gray_temp = 0;for (j = 0; j <= i; j++){gray_temp += objHist[j];}objCumHist[i] = gray_temp;}//GML组映射double min = 1; //设置成一个≥1的数即可uchar map[256]; //输入->输出的映射关系uchar groop[256]; //分组序号for (i = 0; i < 256; i++){groop[i] = -1; //初始化}for (i = 0; i < 256; i++) //遍历目标图像的累计直方图{if (objHist[i] == 0) //如果该位置的直方图为0,可以跳出这次循环了,因为不会有点映射到这里来{if (i > 0)groop[i] = groop[i - 1];continue;}min = 1;for (j = 0; j < 256; j++)  //遍历原图像,寻找两个直方图距离最接近的点{if (abs(objCumHist[i] - srcCumHist[j]) < min){min = abs(objCumHist[i] - srcCumHist[j]);groop[i] = j; //最接近的直方图位置(原图像),记录分组序号}}if (i == 0) //灰度值为0的情况有点特殊{for (int pos = 0; pos <= groop[i]; pos++)map[pos] = 0;}else{for (int pos = groop[i - 1] + 1; pos <= groop[i]; pos++) //属于同一组内的元素,映射到同一个灰度值map[pos] = i; //建立映射关系}}//根据映射关系进行点运算,修改原图像uchar* p = NULL; //用于遍历像素的指针int width = img_src.cols;int height = img_src.rows;for (i = 0; i < height; i++){p = img_src.ptr<uchar>(i); //获取第i行的首地址for (j = 0; j < width; j++){p[j] = map[p[j]];}}
}

● 运行结果如像下图所示,可见原图像完成了向欧美系风格的转变。

【数字图像处理】直方图规定化(含实现代码)相关推荐

  1. 数字图像处理 直方图规定化 MATLAB实验

    一.原理 直方图规定化是使原图像灰度直方图变成规定形状的直方图而对图像做修正的增强方法. 二.步骤 ①读入原图像huafen.jpg,并显示图像及其直方图: ②读入参考图像rice.tif,并显示图像 ...

  2. 数字图像处理——直方图累计

    数字图像处理--直方图累计 %函数名称为Image_Hist,输入参数Image,输出参数Hist function [Hist] = Image_Hist(Image) %获取矩阵的行.列.波段数 ...

  3. 图像直方图均衡化c语言程序,数字图像处理——直方图均衡化

    1.相关了解 直方图均衡化又称为直方图平坦化.直方图均衡化的基本思想是将原始图像的不均衡的直方图变换为均匀分布的形式.即将输入图像转化为在每一灰度级上都有相同的像素点数(即输出的直方图是平坦的,其分布 ...

  4. 图像处理之简化色彩(含OpenCV代码)

    简化色彩的用处:当待检索的图像与图像库中的图像在颜色撒谎能够存在一定的色彩差异时,系统能自动忽略在一定范围内的色彩差异,将在一定色彩差异范围内的图像划分为同一组,使其具有相同(相近)的特征值. 可以将 ...

  5. 数字图像处理之灰度化

    囧,ADK还要更新一大截.所以我还是接着写吧,接下来是数字图像的相关文章,全部使用Python实现. 首先讲的是灰度化. 开始,我们先讲讲什么是灰度. 大家都知道,一幅图片有很多个像素点,对于RGB图 ...

  6. 数字图像处理 直方图均衡化 MATLAB实验

    一.原理 直方图均衡化是通过对原图像进行某种变换使原图像的灰度直方图修正为均匀的直方图的一种方法. 二.步骤 ①读入原图像huafen.jpg,并显示图像及其直方图: ②对图像进行直方图均衡化处理,并 ...

  7. 数字图像处理——直方图均衡化

    直方图均衡化 直方图均衡化(Histogram equalization)是一种常用的灰度变换方法. 基本原理 直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行 ...

  8. 数字图像处理与python实现_数字图像处理学习(2)—— 图像直方图均衡与图像匹配(python实现)...

    数字图像处理学习(2)-- 直方图均衡与图像匹配 1. 直方图均衡(Histogram Equalization) 1.1 直方图均衡化概念 1.2 直方图均衡实现简单思路 1.3 直方图均衡实现代码 ...

  9. 【学习图像处理】之实验二——灰度图像直方图规定化

    灰度图像直方图规定化 图像增强 一.实验内容 二.灰度直方图 1.什么是灰度直方图? 2.直方图均衡化 3.直方图规定化 三.代码实现与分析 0.辅助功能实现 1.绘制原图像直方图SH 2.绘制均衡直 ...

  10. 数字图像处理100问—02灰度化(Grayscale)

    提示:内容整理自:https://github.com/gzr2017/ImageProcessing100Wen CV小白从0开始学数字图像处理 02灰度化(Grayscale) 将图像灰度化,通过 ...

最新文章

  1. Reporting Services 的多值参数究竟能否用在数据集获取途径为存储过程的情景呢?...
  2. Tomcat-公布WEB应用
  3. 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
  4. ITK:拉普拉斯递归高斯图像滤波器
  5. 在Mapnik中显示中文(网上资料整理)
  6. 第三次学JAVA再学不好就吃翔(part113)--对象操作流
  7. 需求、需求工程与需求工程师 — 6. 设计能力的要求
  8. 前端程序升级linux方案,开源:AspNetCore 应用程序热更新升级工具(全网第一份公开的解决方案)...
  9. 2016设置方框的尺寸_手把手教你用Word打印标准尺寸的身份证“复印件”
  10. Atitit atimvc rest原理与自定义实现t33 目录 1.1. Web.xml 1 1.2. MvcFilter 2 1.3. jerserMeth 4 原理 过滤器 过滤即可
  11. nginx基于端口的虚拟主机配置实战
  12. DB2数据库编目及连接
  13. Creator技能按钮冷却效果
  14. source insight中文乱码
  15. winvnc异常,端口变为5901
  16. 《指数基金投资指南》读书笔记_2022002
  17. vue结合elementUI,MinUi
  18. cesium加载geoserver发布的mvt服务
  19. vue element-ui引入第三方图标 在线版
  20. Unity3d之设计模式(二)工厂模式

热门文章

  1. 学前端需要什么基础知识(前端需要掌握什么 )
  2. Altium Designer(AD)软件绘图一般步骤
  3. 数学建模分享part2--主成分分析(spss)
  4. Tensorflow+Keras+VGG19 猫狗大战分类
  5. SASS与 PASS的基本定义、适用范围以及差异
  6. STM8S103之时钟设置
  7. 向日葵如何远程桌面Linux,最快的远程桌面向日葵软件
  8. linux中wifi抓取包,使用wireshark捕获wifi包(linux)
  9. 【caffe】Layer解读之:Date
  10. postman下载与汉化