点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

如何为图像生成直方图,如何使直方图相等,最后如何将图像直方图修改为与其他直方图相似。

01. 什么是图像直方图?

在开始定义直方图之前,为简单起见我们先使用灰度图像,稍后再解释彩色图像的处理过程。

图像直方图表示图像的像素分布情况。换言之,图像直方图显示具有特定像素值的图像点数量。例如,假设正常图像的像素强度在0到255之间变化。为了生成其直方图,我们只需要计算像素值为0的像素数量,然后计算1并继续到255即可。在图1中,我们有一个5 * 5的样本图像,我们通过计算每个像素强度的数量来创建直方图表。

图1:生成图像直方图的过程

02. 如何生成图像直方图?

在python中,我们可以使用以下两个函数来创建然后显示图像的直方图。

import matplotlib.pyplot as plt
import numpy as npdef generate_histogram(img, do_print):"""@params: img: can be a grayscale or color image. We calculate the Normalized histogram of this image.@params: do_print: if or not print the result histogram@return: will return both histogram and the grayscale image """if len(img.shape) == 3: # img is colorful, so we convert it to grayscalegr_img = np.mean(img, axis=-1)else:gr_img = img'''now we calc grayscale histogram'''gr_hist = np.zeros([256])for x_pixel in range(gr_img.shape[0]):for y_pixel in range(gr_img.shape[1]):pixel_value = int(gr_img[x_pixel, y_pixel])gr_hist[pixel_value] += 1'''normalizing the Histogram'''gr_hist /= (gr_img.shape[0] * gr_img.shape[1])if do_print:print_histogram(gr_hist, name="n_h_img", title="Normalized Histogram")return gr_hist, gr_imgdef print_histogram(_histrogram, name, title):plt.figure()plt.title(title)plt.plot(_histrogram, color='#ef476f')plt.bar(np.arange(len(_histrogram)), _histrogram, color='#b7b7a4')plt.ylabel('Number of Pixels')plt.xlabel('Pixel Value')plt.savefig("hist_" + name)

代码1:生成直方图

在大多数情况下,当我们创建直方图时,我们通过将每个强度值的像素数除以归一化因子(即图像宽度和图像高度的乘积)来对直方图进行归一化。为了便于使用,如果generate_histogram函数的输入图像是彩色图像,我们首先将其转换为灰度图像(请参见第6行)。

03. 如何均衡图像直方图?

直方图均衡化通常用于增强图像的对比度。因此,该技术不能保证始终提高图像质量。计算CDF(累积分布函数)是均衡图像直方图的常用方法。在图2中,我们计算了在图1中创建的样本图像的CDF。此外,在图3中,我们显示了先前样本的均衡直方图。

图2:计算CDF。

图3:均方图。

为了计算python中的均衡直方图,我们创建了以下代码:

def equalize_histogram(img, histo, L):eq_histo = np.zeros_like(histo)en_img = np.zeros_like(img)for i in range(len(histo)):eq_histo[i] = int((L - 1) * np.sum(histo[0:i]))print_histogram(eq_histo, name="eq_"+str(index), title="Equalized Histogram")'''enhance image as well:'''for x_pixel in range(img.shape[0]):for y_pixel in range(img.shape[1]):pixel_val = int(img[x_pixel, y_pixel])en_img[x_pixel, y_pixel] = eq_histo[pixel_val]'''creating new histogram'''hist_img, _ = generate_histogram(en_img, print=False, index=index)print_img(img=en_img, histo_new=hist_img, histo_old=histo, index=str(index), L=L)return eq_histo

代码2:均衡直方图

这是我们拍摄的3张不同图片,并用作示例。如图4所示,对于第一个图像,直方图显示低强度像素的数量多于明亮像素。对于第二张图像,情况完全相反,其中较亮像素的密度远大于较暗像素的密度。第三张图片似乎具有半正态直方图。

图4:三种不同类型的图像及其直方图和均等的直方图。

使用均衡直方图增强图像

如前所述,我们可以使用图像的均衡直方图修改图像的对比度。如代码2第12行所示,对于输入图像中的每个像素,我们可以使用其均等值。结果可能比原始图像更好,但不能保证。在图5中,我们描述了3张图像的修改版本。如图所示,使用其均等的直方图修改图像会产生对比度更高的图像。此功能在许多计算机视觉任务中很有用。

图5:使用均衡直方图的对比度修改。最左列是原始图像。中间一栏是对比度修改的结果。

最右边的列是修改后的图像的直方图。

04. 什么是直方图匹配?

假设我们有两个图像,每个图像都有其特定的直方图。因此,我们想在进一步解决此问题之前,是否可以根据另一幅图像的对比度来修改一幅图像?答案是肯定的。实际上,这就是直方图匹配的定义。换句话说,给定图像A和B,可以根据B修改A的对比度。

当我们要统一一组图像的对比度时,直方图匹配非常有用。实际上,直方图均衡也可以视为直方图匹配,因为我们将输入图像的直方图修改为与正态分布相似。

为了匹配图像A和B的直方图,我们需要首先均衡两个图像的直方图。然后,我们需要使用均衡后的直方图将A的每个像素映射到B。然后,我们基于B修改A的每个像素。

让我们使用图6中的以下示例来阐明以上段落。

图6:直方图匹配

在图6中,我们将图像A作为输入图像,将图像B作为目标图像。我们要基于B的分布来修改A的直方图。第一步,我们计算A和B的直方图和均等直方图。然后,我们需要根据该值映射A的每个像素它的均衡直方图求B的值。因此,例如,对于A中强度级别为0的像素,A均衡直方图的对应值为4。现在,我们看一下B均衡直方图并找到强度值对应于4,即0。因此我们将0强度从A映射到0 从B开始。对于A的所有强度值,我们继续进行。如果从A到B的均衡直方图中没有映射,我们只需要选择最接近的值即可。

def find_value_target(val, target_arr):key = np.where(target_arr == val)[0]if len(key) == 0:key = find_value_target(val+1, target_arr)if len(key) == 0:key = find_value_target(val-1, target_arr)vvv = key[0]return vvvdef match_histogram(inp_img, hist_input, e_hist_input, e_hist_target, _print=True):'''map from e_inp_hist to 'target_hist '''en_img = np.zeros_like(inp_img)tran_hist = np.zeros_like(e_hist_input)for i in range(len(e_hist_input)):tran_hist[i] = find_value_target(val=e_hist_input[i], target_arr=e_hist_target)print_histogram(tran_hist, name="trans_hist_", title="Transferred Histogram")'''enhance image as well:'''for x_pixel in range(inp_img.shape[0]):for y_pixel in range(inp_img.shape[1]):pixel_val = int(inp_img[x_pixel, y_pixel])en_img[x_pixel, y_pixel] = tran_hist[pixel_val]'''creating new histogram'''hist_img, _ = generate_histogram(en_img, print=False, index=3)print_img(img=en_img, histo_new=hist_img, histo_old=hist_input, index=str(3), L=L)

代码3: Python中的直方图匹配

图7:直方图匹配示例。我们修改了左图像的直方图以匹配中心图像的直方图。

图7示出了直方图匹配的示例。如大家所见,尽管最左边的图像是明亮的图像,但就对比度级别而言,可以将中心图像视为更好的图像。因此,我们决定使用中心图像的收缩来修改最左边的图像。结果,即最右边的图像已得到改善。

代码链接:https://github.com/aliprf/CV-HistogramMatching

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

基于OpenCV的直方图匹配相关推荐

  1. 图像目标检索:基于Opencv的颜色空间匹配法

    图像目标检索:基于Opencv的颜色空间匹配法 目标效果:近似于淘宝上--拍照搜索,检索商品的效果,在传统算法领域,也有一些优秀的算法能粗略的实现该效果,本文便基于传统算法中的颜色空间匹配法来实现,代 ...

  2. 基于opencv的模板匹配详解

    1.什么是模板匹配 在OpenCV教程中这样解释模板匹配: 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.这里说的模板是我们已知的小图像,模板匹配就是在一副大图像中搜寻目标. ...

  3. opencv 使用直方图匹配数字

    也是刚学opencv,参考一些资料,完成简单的数字匹配: #pragma once #include <iostream> #include <opencv2/core/utils/ ...

  4. OpenCV基础(17)基于OpenCV、scikit-image和Python的直方图匹配

    在本教程中,您将学习如何使用OpenCV和scikit-image进行直方图匹配. 上周我们讨论了直方图均衡化,这是一种基本的图像处理技术,可以提高输入图像的对比度. 但是,如果你想自动匹配两幅图像的 ...

  5. C#调用C++OpenCV直方图匹配

    C#调用C++ OpenCV4.4.0+VS2019 基于OpenCV4.4.0的直方图匹配 直方图比较 相关系数的标准 卡方系数的标准 相交系数的标准 巴氏系数的标准 步骤 直方图匹配原理 直方图匹 ...

  6. 在OpenCV下写的直方图匹配(直方图规定化)C++源码!

    直方图匹配的原理就不多作解释了,我曾经还将MATLAB源码改写成过C源码,详情可见我的博文 根据MATLAB的histeq函数改写的运行在OpenCV下的直方图规定化C源码! 本文已转移到 https ...

  7. 【OpenCV】直方图应用:直方图均衡化,直方图匹配,对比直方图

    本文链接:https://blog.csdn.net/xiaowei_cqu/article/details/7606607                                       ...

  8. 【OpenCV 例程200篇】48. 图像增强—彩色直方图匹配

    [OpenCV 例程200篇]48. 图像增强-彩色直方图匹配 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像直 ...

  9. 【OpenCV 例程200篇】47. 图像增强—直方图匹配

    [OpenCV 例程200篇]47. 图像增强-直方图匹配 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像直方图 ...

最新文章

  1. C语言打印九九乘法口诀
  2. C# 面向对象三大特性:封装、继承、多态
  3. [置顶]团队开发经验:如何带领一个项目团队并做好项目总结
  4. Windows下配置安装Git(一)
  5. Atitit session机制的实现 目录 1. Web状态管理 Cookie 和 Session。 token 1 2. session 管理设计 1 2.1. session 的存储(可以
  6. sql server的linux版命令行,Linux配置SQLServer
  7. uniapp 小程序授权登录时 获取不到用户头像等信息 只能得到灰色缺省头像以及nickname 为“微信用户”等
  8. 手机麦克风声音太大_手机麦克风没声音怎么设置?瞬间声音变大,一键设置即可...
  9. 基于 SpringBoot 和 webSocket 的匿名聊天室
  10. Office Tool Plus 下载使用 365 2021/2019等版本
  11. 中国漆画名品东京展出 促中日文化交流
  12. C#编程各种成员前面的小图标是什么意思?
  13. ei会议被检索的时间一般多久,中文期刊论文有doi吗
  14. 小学生计算机德育渗透总结,小学科学教师德育工作总结
  15. 安卓USB开发教程 <五> 安卓 AOA 1.0
  16. arp 已知mac找ip_知道IP查MAC地址,知道MAC地址查IP
  17. 聊一聊WEB前端安全那些事儿
  18. 正态分布 概率密度函数PDF
  19. 去哪儿(社招)测开面经-机票业务线
  20. P60:类变量 static

热门文章

  1. 微软“叛变”谷歌 Chromium!
  2. 港中大、商汤开源目标检测工具包mmdetection,对比Detectron如何?
  3. 整合PyTorch 0.4和Caffe 2,PyTorch 1.0能挑战TensorFlow吗?
  4. 为什么汉字不能当密码,假如用汉字做密码,又会怎样?
  5. 爱了!Intellij IDEA 自带的 Vim 插件真心不错
  6. 深度学习最常用的10个激活函数!(数学原理+优缺点)
  7. 【廖雪峰python入门笔记】while循环
  8. 自制机械臂,能给葡萄缝针的那种,成本1万块,网友:能把脑子开源一下?
  9. 毕业典礼上,硕士情侣现场求婚!校长也被甜到全程“姨母笑”
  10. 26岁已经是“双一流”高校博导!读博期间也曾两次想要退学......