直方图匹配原理与python、matlab实现
直方图匹配本质上是让两幅图像的累积直方图尽量相似,累积直方图相似了,直方图也就相似了。
把原图像img的直方图匹配到参考图像ref的直方图,包括以下几个步骤:
1. 求出原图像img的累积直方图img_accu;
2. 求出参考图像ref的累积直方图ref_accu;
3. 灰度级g在img_accu中对应的值记为img_accu_g,找出ref_accu中与ref_accu_g最接近的值,记为ref_accu_G,记该值对应的灰度级为G;
4. 根据g和G的对应关系,得到img经过匹配之后的直方图。
为了说明该过程,我们举一个简单的例子,并把计算过程列在表格中。该例子中图像只有10个灰度级,总共3289个像素,如下图所示。

(a) 原图像img的直方图 (b) 参考图像ref的直方图

(c) 原图像img的累积直方图 (d) 参考图像ref的累积直方图
| 灰度级 | ref直方图 | ref累积直方图 | img直方图 |
img累积直方图 | 匹配之后的灰度级 |
匹配之后的img累积直方图 |
匹配之后的img直方图 |
| 1 | 0 | 0 | 927 | 927(匹配第三列第七行的1137) | 7 | 0 | 0 |
| 2 | 0 | 0 | 690 | 1617(匹配第三列第八行的1672) | 8 | 0 | 0 |
| 3 | 20 | 20 | 535 | 2152(匹配第三列第九行的2362) | 9 | 0 | 0 |
| 4 | 112 | 132 | 450 | 2602(匹配第三列第九行的2362) | 9 | 0 | 0 |
| 5 | 221 | 353 | 334 | 2936(匹配第三列第十行的3289) | 10 | 0 | 0 |
| 6 | 334 | 687 | 221 | 3157(匹配第三列第十行的3289) | 10 | 0 | 0 |
| 7 | 450 | 1137 | 112 | 3269(匹配第三列第十行的3289) | 10 | 927 | 927 |
| 8 | 535 | 1672 | 20 | 3289(匹配第三列第十行的3289) | 10 | 1617 | 690 |
| 9 | 690 | 2362 | 0 | 3289(匹配第三列第十行的3289) | 10 | 2152 | 985 |
| 10 | 927 | 3289 | 0 | 3289(匹配第三列第十行的3289) | 10 | 3289 | 687 |
img在匹配之后的效果如下:

(a) img的经过匹配之后的累积直方图 (b) img的经过匹配之后的直方图
1. OpenCV-Python实现直方图匹配
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt img = cv2.imread('C:\\Users\\admin\\Desktop\\original_img3\\testimg\\lena_300_500.jpg')
ref = cv2.imread('C:\\Users\\admin\\Desktop\\original_img3\\testimg\\messi_300_500.jpg') out = np.zeros_like(img)
_, _, colorChannel = img.shape
for i in range(colorChannel):
print(i)
hist_img, _ = np.histogram(img[:, :, i], 256) # get the histogram
hist_ref, _ = np.histogram(ref[:, :, i], 256)
cdf_img = np.cumsum(hist_img) # get the accumulative histogram
cdf_ref = np.cumsum(hist_ref) for j in range(256):
tmp = abs(cdf_img[j] - cdf_ref)
tmp = tmp.tolist()
idx = tmp.index(min(tmp)) # find the smallest number in tmp, get the index of this number
out[:, :, i][img[:, :, i] == j] = idx cv2.imwrite('C:\\Users\\admin\\Desktop\\lena.jpg', out)
print('Done')
效果如下:

2. matlab实现直方图匹配
程序如下:
clear;
% matching img's histogram to ref's histogram.
path = 'C:\\Users\\admin\\Desktop\\original_img3\\yijia0923_9\\';
ref = imread([path, '18.jpg']);
img = imread([path, '21.jpg']); [H, W, colorChannel] = size(ref);
out = zeros(H, W, colorChannel);
for k = 1:colorChannel
disp(k);
hist_ref = imhist(ref(:, :, k)); % ref的直方图
cumHist_ref = []; %ref的累积直方图
for i=1:256
cumHist_ref = [cumHist_ref sum(hist_ref(1:i))];
end img1 = img(:, :, k);
hist_img = imhist(img1); %img的直方图
cumHist_img = []; %img的累积直方图
for i=1:256
cumHist_img = [cumHist_img sum(hist_img(1:i))];
end for i=1:256
tmp{i} = cumHist_ref - cumHist_img(i);
tmp{i} = abs(tmp{i}); % 找到两个累积直方图距离最近的点
[a, index(i)] = min(tmp{i}); % a是tmp{i}中最小的值,index是该值对应的下标
end imgn = zeros(H,W);
for i = 1:H
for j = 1:W
imgn(i,j) = index(img1(i,j)+1)-1; % 由原图的灰度通过索引映射到新的灰度
end
end
out(:, :, k) = imgn;
end out=uint8(out);
% imwrite(out, [path, 'new3.jpg']);
figure; imshow(out); title('out')
disp('Done');
直方图匹配原理与python、matlab实现的更多相关文章
- OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)
1 直方图 灰度级范围为 \([0,L-1]\) 的数字图像的直方图是离散函数 \(h(r_k) = n_k\) , 其中 \(r_k\) 是第\(k\)级灰度值,\(n_k\) 是图像中灰度为 \( ...
- 【zz】matlab 直方图匹配
原文地址:http://www.cnblogs.com/tiandsp/archive/2012/12/19/2825418.html 直方图匹配或叫做直方图规定化都可以,是把原图像的直方图按照给定的 ...
- 灰度图像--图像增强 直方图匹配(规定化)Histogram Specification
学习DIP第39天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...
- c#数字图像处理(七)直方图匹配
直方图匹配,又称直方图规定化,即变换原图的直方图为规定的某种形式的直方图,从而使两幅图像具有类似的色调和反差.直方图匹配属于非线性点运算. 直方图规定化的原理:对两个直方图都做均衡化,变成相同的归一化 ...
- NFA引擎匹配原理
1 为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或 ...
- paip.编程语言方法重载实现的原理及python,php,js中实现方法重载
paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...
- CSS选择器以及优先级与匹配原理
最常用的五类CSS选择器 准确而简洁的运用CSS选择器会达到非常好的效果.我们不必通篇给每一个元素定义类(class)或ID,通过合适的组织,可以用最简单的方法实现同样的效果.在实际工作中,最常用的选 ...
- CSS选择器、优先级与匹配原理(转)
CSS选择器.优先级与匹配原理 导航 为了分析Bootstrap源码,所以的先把CSS选择器相关的东东给巩固好 废话就不多说了 CSS 2.1 selectors, Part 1 计算指定选择器的优先 ...
- css匹配原理与优化
一. 匹配原理 浏览器CSS匹配不是从左到右进行查找,而是从右到左进行查找.比如之前说的 DIV#divBox p span.red{color:red;},浏览器的查找顺序如下:先查找 html 中 ...
随机推荐
- linux 远程配置docker加速器
https://www.jianshu.com/p/dca49964af04 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh ...
- 从零开始实现一个简易的Java MVC框架(三)--实现IOC
Spring中的IOC IoC全称是Inversion of Control,就是控制反转,他其实不是spring独有的特性或者说也不是java的特性,他是一种设计思想.而DI(Dependency ...
- React组件:拖拽布局Dragact v0.1.6 发布
仓库地址:Dragact爽滑的拖拽组件 大家好,新年已经过去,大家又投入了繁忙的工作当中,由于我在国外,因此压根儿没有休息... 少说废话,上周一周的时间里,我陆陆续续的为Dragact组件进行了一系 ...
- 12-SSMS图形化工具中不允许保存修改的解决办法
1.报出的警告 2.解决办法 工具-->选项-->设计器--->表设计和数据库设计器-->阻止保存要求重新创建表的更改 的勾去掉就OK 了
- php类知识点滴---类继承的一些原则
完全重写 <?php class coach { public function __construct() { echo "欢迎来到~北武堂训练~"; } } cl ...
- SQL Prompt 5 功能按键说明
1. Refresh suggestions 未知,按了没反映 2.Format sql 标准化SQL代码书 ...
- ant-design-vue 修改组件样式
/deep/ .ant-input { border-radius: 50px; }
- C# Lambda表达式学习笔记
本笔记摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,记录一下学习过程以备后续查用. 一.Lambda ...
- PC监听鼠标和键盘事件,定时无响应退出
直接上代码: window.onload = function () { initScreenSaver(); } //0912 add function ScreenSaver(settings){ ...
- easyui datagrid 去除单击行选中事件
转:http://www.xue163.com/588880/39049/390490560.html 解决方案: onClickRow: function (rowIndex, rowData) { ...