直方图匹配本质上是让两幅图像的累积直方图尽量相似,累积直方图相似了,直方图也就相似了。

把原图像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实现的更多相关文章

  1. OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)

    1 直方图 灰度级范围为 \([0,L-1]\) 的数字图像的直方图是离散函数 \(h(r_k) = n_k\) , 其中 \(r_k\) 是第\(k\)级灰度值,\(n_k\) 是图像中灰度为 \( ...

  2. 【zz】matlab 直方图匹配

    原文地址:http://www.cnblogs.com/tiandsp/archive/2012/12/19/2825418.html 直方图匹配或叫做直方图规定化都可以,是把原图像的直方图按照给定的 ...

  3. 灰度图像--图像增强 直方图匹配(规定化)Histogram Specification

    学习DIP第39天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

  4. c#数字图像处理(七)直方图匹配

    直方图匹配,又称直方图规定化,即变换原图的直方图为规定的某种形式的直方图,从而使两幅图像具有类似的色调和反差.直方图匹配属于非线性点运算. 直方图规定化的原理:对两个直方图都做均衡化,变成相同的归一化 ...

  5. NFA引擎匹配原理

    1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或 ...

  6. paip.编程语言方法重载实现的原理及python,php,js中实现方法重载

    paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...

  7. CSS选择器以及优先级与匹配原理

    最常用的五类CSS选择器 准确而简洁的运用CSS选择器会达到非常好的效果.我们不必通篇给每一个元素定义类(class)或ID,通过合适的组织,可以用最简单的方法实现同样的效果.在实际工作中,最常用的选 ...

  8. CSS选择器、优先级与匹配原理(转)

    CSS选择器.优先级与匹配原理 导航 为了分析Bootstrap源码,所以的先把CSS选择器相关的东东给巩固好 废话就不多说了 CSS 2.1 selectors, Part 1 计算指定选择器的优先 ...

  9. css匹配原理与优化

    一. 匹配原理 浏览器CSS匹配不是从左到右进行查找,而是从右到左进行查找.比如之前说的 DIV#divBox p span.red{color:red;},浏览器的查找顺序如下:先查找 html 中 ...

随机推荐

  1. Tomcat 调优测试

    测试环境: OS: Ubuntu14.04 64位 (运行在Docker1.9) CPU: Intel i3 双核四线程 Mem: 8G Tomcat版本: Tomcat8.5 Java SDK版本: ...

  2. 大数据技术之kettle安装使用

    kettle是一款开源的ETL工具,纯java编写,可以在Windows.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. kettle的两种设计 简述: Transformation(转 ...

  3. gtid 1032同步异常处理

    gtid  1032同步异常处理 .sql # 在从库中执行 ; ,); ,); ,); ,); ; mysql> select * from fudao_student_lable; +--- ...

  4. 【leetcode】1286. Iterator for Combination

    题目如下: Design an Iterator class, which has: A constructor that takes a string characters of sorted di ...

  5. [人物存档]【AI少女】【捏脸数据】1222今日份的推荐

    AISChaF_20191030183624290.png

  6. Twilio收发短信笔记

    twlio基本使用 Twilio是一个做成开放插件的电话跟踪服务(call-tracking service),可用来进行短信,图片等信息的集中于转发,貌似只支持北美地区的电话. 现有一个需求是:客户 ...

  7. LibreOffice/Calc:带条件判断的求和

    本文适用于LibreOffice Calc 5.1.6.2 + Ubuntu 16.04,熊猫帮帮主@cnblogs 2018/3/7 以下图为例,假设要根据C列对D列中被选中单元进行求和,即对D列中 ...

  8. 灰度图像--图像分割 霍夫变换(Hough Transform)--直线

    学习DIP第50天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://gi ...

  9. 【一起学源码-微服务】Nexflix Eureka 源码二:EurekaServer启动之配置文件加载以及面向接口的配置项读取

    前言 上篇文章已经介绍了 为何要读netflix eureka源码了,这里就不再概述,下面开始正式源码解读的内容. 如若转载 请标明来源:一枝花算不算浪漫 代码总览 还记得上文中,我们通过web.xm ...

  10. codeforces412A

    Poster CodeForces - 412A The R1 company has recently bought a high rise building in the centre of Mo ...