空域变换-直方图匹配(直方图规定化)
目录
1. 介绍
2. 相关函数介绍
2.1 cv2.calcHist
2.2 cv2.normalize
2.3 hist_norm.cumsum()
3. 代码
3.1 第一步:计算直方图
3.2 第二步:归一化直方图
3.3 第三步:归一化累计直方图
3.4 第四步:对应灰度值映射
3.5 print
4. code
1. 介绍
之前介绍的直方图均衡化,它能够产生一个直方图具有均匀分布的输出图像。当我们想要自动增强图像的时候,这种方法是适用的,因为目标的结果只有一个,所以是自动增强图像,并且这种技术的结果是可以预测的。
然而有些图像使用直方图均衡化是不合适的,或者说有些图像的直方图转换成均匀分布是不合适的
所以我们希望有一种方法能够帮助我们将图像的直方图转化成想要的形式,这种图像增强的技术就是直方图规定化或者说直方图匹配
直方图匹配:用于生成规定直方图图像的方法
实现的原理也很简单,只需要将原图和目标图像分别均衡化,然后找对应图像的映射就可以了
例如:原图灰度0----> 均衡化为1<------目标灰度2,那我们就可以得到原图灰度1映射到目标图像灰度2的映射关系
2. 相关函数介绍
因为我们需要利用一下有的函数完成直方图规定化
这里我们只作简单介绍,不具体介绍函数
2.1 cv2.calcHist
cv 库中用于计算图像直方图的函数,
cv2.calcHist 用于计算图像的直方图
我们手动建立一个维度为(2,3)的图像,因为是单通道的(没有channe)所以通道为[0],不需要掩膜None。生成的图像可以看出最大是3,我们可以这是一副2bit图像,也就是说灰度级为4的图像,所以histSize设置为4,动态范围为0-3,最后一个参数设置为[0,4]
可以观察calcHist函数的输出是维度(L,1)的矩阵,L是图像的灰度级,这里是4
返回值hist里面的index对应灰度的动态范围,value对应灰度值的像素个数
index = 0的时候,value = 1,说明图像灰度值为0的时候,有1个像素
index = 1的时候,value = 2,说明图像灰度值为1的时候,有2个像素....
所以,这和我们创建图像的时候是对应的
2.2 cv2.normalize
Ctrl + 鼠标左键查看注释文档
cv2.normalize 可以用于计算归一化直方图,即图像中的灰度值除以总的像素个数
灰度值为0的个数有一个,所以占总像素的概率是1 / 6 约等于 0.16666667,以此类推
2.3 hist_norm.cumsum()
.cumsum() 用于计算归一化累计直方图
其中第二个值是前两个像素占总像素的概率,这里灰度是0的有1个,灰度为1的有2个,所以3 / 6 =0.5
3. 代码
3.1 第一步:计算直方图
3.2 第二步:归一化直方图
3.3 第三步:归一化累计直方图
3.4 第四步:对应灰度值映射
映射的步骤:
- 建立映射表
- 遍历映射表index ,将index对应的value作为直方图匹配的值。
如何找对应匹配的直方图的值呢?
通过之前的直方图均衡化我们知道均衡化的步骤,将归一化累计直方图的值乘上L-1,然后四舍五入映射为新的灰度值
那么既然原图和目标图像的归一化累计直方图都要乘上 L -1的话,那我们可以跳过这个步骤,直接将原图和目标图像的归一化累计直方图进行最接近的匹配
例如:原图[0.1 , 0.3 ,0.8,1.0] ,目标图像[0.12 , 0.,33,0.82,1.0],那我们直接将0.1映射成0.12就可以了,也就是把原图灰度为0的映射到灰度为0的地方,剩下的以此类推
3. 所以内层的for 只是为了将原图index里面的value,把他匹配到最接近的目标图像的value里面(注:因为我们需要的都是index,所以只是把目标图像的下标 j 赋值到transforms的index里面)而index对应的value只是概率,帮助我们映射而已
3.5 print
4. code
import cv2
import numpy as np
import matplotlib.pyplot as pltdef transforms(x,y): # x 是原图像 y 是目标图像transform = np.zeros(256) # 建立一个映射表,形如[1 2 3 4],index代表原图像灰度值,value代表变化后的灰度值for index in range(256):gray_value = 0 # 更新映射表transform的值value_min = np.fabs(x[index] - y[0]) # 从0开始建立映射表for j in range(256):diff = np.fabs(x[index] - y[j]) # 检索归一化累计直方图灰度值最近的点if (diff < value_min):gray_value = j # 和原图灰度值为i最接近的匹配灰度值为jvalue_min = difftransform[index] = gray_value # 更新映射表img_out = transform[img].astype(np.uint8) # 图像映射return img_outimg = cv2.imread('./old.png',0) # 原图
dst = cv2.imread('./after.png',0) # 目标图像img_hist= cv2.calcHist([img],[0],None,[256],[0,256]) # 计算原图的直方图
dst_hist= cv2.calcHist([dst],[0],None,[256],[0,256]) # 计算匹配图像的直方图img_hist_norm = cv2.normalize(img_hist, None, norm_type=cv2.NORM_L1) # 直方图归一化
dst_hist_norm = cv2.normalize(dst_hist, None, norm_type=cv2.NORM_L1) # 计算匹配图像的直方图归一化img_hist_norm_accu = img_hist_norm.cumsum() # 归一化累计直方图
dst_hist_norm_accu = dst_hist_norm.cumsum() # 目标图像的归一化累计直方图img_transforms = transforms(img_hist_norm_accu,dst_hist_norm_accu) # 直方图匹配old_hist = cv2.calcHist([img],[0],None,[256],[0,256])
dst_hist = cv2.calcHist([dst],[0],None,[256],[0,256])
after_hist = cv2.calcHist([img_transforms],[0],None,[256],[0,256])plt.plot(old_hist,color = 'r',label='img') # 原图的直方图
plt.plot(dst_hist,color = 'g',label = 'dst') # 匹配图像的直方图
plt.plot(after_hist,color = 'b',label = 'img_transform') # 直方图匹配后的图像直方图
plt.legend()
plt.show()cv2.imshow('img',np.hstack((img,img_transforms))) # 展示原图和直方图匹配后的图像
cv2.waitKey()
cv2.destroyAllWindows()
输入图像:
匹配的图像:
绘制的直方图:
输出图像为:
空域变换-直方图匹配(直方图规定化)相关推荐
- 直方图匹配(直方图规定化)
直方图处理可以增加图像的动态范围,但是直方图处理针对的是图像整体偏暗偏亮(注意是整体),若一幅图像即存在偏暗又存在偏亮的区域,此时想要增加图像的动态范围,不宜采用直方图处理.(例如想要增加偏暗区域的动 ...
- c++ opencv 图像处理:直方图处理(直方图均衡化,直方图匹配(规定化))
文章目录 前言 一.直方图(histogram) 二.直方图处理 1.直方图均衡化 2.直方图匹配(规定化) 三.opencv函数总结 1.equalizeHist图像均衡化 2.calcHist获取 ...
- 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波9 - 直方图处理 - 直方图匹配(规定化)灰度图像,彩色图像都适用
直方图匹配(规定化) 连续灰度 s=T(r)=(L−1)∫0rpr(w)dw(3.17)s = T(r) = (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.1 ...
- 数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 注意:本文是<数字图像直方图匹配或规定化Histogram Matching ( ...
- 直方图匹配(规定化)
直方图匹配 直方图均衡技术,可以自动地确定变换函数,而产生具有均匀直方图的输出图像.但是不同图像出现的问题不尽相同,有时根据图像的某种缺陷,我们需要得到处理后具有特殊直方图的图像.均衡化这样单一的方法 ...
- 在OpenCV下写的直方图匹配(直方图规定化)C++源码!
直方图匹配的原理就不多作解释了,我曾经还将MATLAB源码改写成过C源码,详情可见我的博文 根据MATLAB的histeq函数改写的运行在OpenCV下的直方图规定化C源码! 本文已转移到 https ...
- 直方图规定化(直方图匹配)
在介绍直方图规定化之前,先介绍一下统计直方图和累积直方图.参考自:http://blog.csdn.net/tkp2014/article/details/40151515 对颜色特征的表达方式有许多 ...
- 直方图应用:直方图均衡化,直方图匹配,对比直方图
直方图均衡化 直方图均衡化(Histogram Equalization)是直方图最典型的应用,是图像点运算的一种.对于一幅输入图像,通过运算产生一幅输出图像,点运算是指输出图像的每个像素点的灰度值由 ...
- 【OpenCV】直方图应用:直方图均衡化,直方图匹配,对比直方图
本文链接:https://blog.csdn.net/xiaowei_cqu/article/details/7606607 ...
- 直方图均衡化和直方图匹配
一.直方图均衡化 直方图均衡化,这样柱条具有均匀分布的高度,平均利用了可用的亮度级,从而能在所有的亮度级上较好地展现细节信息. 直方图均衡化算法分为三个步骤, •第一步是统计直方图每 ...
最新文章
- Android 开源项目及其学习
- 如何删除链表的最后一个节点_面试:删除链表的节点
- 第一天接触网络电话,熟悉了sip协议
- Java8 中用法优雅的 Stream,性能也优雅吗?
- php查找文件内元素,如何查看当前文档某个元素的子节点?有几种方法
- FPGA设计者的5项基本功
- matlab拟合四次函数表达式,用matlab编写程序求以幂函数作基函数的3次、4次多项式的最小二乘曲线拟合,画出数据散点图及拟合曲线图...
- 会议交流 - CNCC 技术论坛 | NLP中知识和数据怎么选?当然是全都要!——第四届中文信息技术发展战略研讨会...
- 云原生时代,底层性能如何调优?
- 大小不固定的图片、多行文字的水平垂直居中
- raster | 多图层栅格对象的一些处理方法
- 修改 MyEclipse 编辑区域背景颜色
- 【回归预测】基于matlab鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 1554期】
- 练字在现代社会的意义还大不大,尤其是电脑普及的情况下,花费大量的时间去练字还值得么?
- mysql数据库导入语句_mysql导入命令 mysql导入数据库语句
- 20172020图片对比_50张迷人的对比摄影照片作品
- 210所高校21届保研率曝光!这些211保研率堪比985!
- 【云速建站】网站的基本设置
- Git 与 Github 基础一步入门
- 人工神经网络模型定义,人工神经网络基本框架