图像空域增强:直方图方法
直方图方法
- 直方图均衡化
- 直方图规定化
- 单映射规则
- 组映射规则
直方图均衡化
直方图均衡化是一种借助图像直方图变换实现灰度映射,从而增强图像的方法。基本思想是把原始图像的直方图变换为均匀分布的形式,这样就增加了像素灰度值的动态范围,从而可实现增强图像整体对比度的效果。
增强函数需要满足如下2个条件:
- 它在0≤f≤L−10≤f≤L-10≤f≤L−1范围内是一个单值单增函数,这是为了保证原始图像各灰度级在变换后仍保持从黑到白(或从白到黑)的排列次序。
- 对于0≤f≤L−10≤f≤L-10≤f≤L−1,有0≤g≤L−10≤g≤L-10≤g≤L−1,这个条件能够保证变换前后灰度值动态范围的一致性。
累积分布函数(CDF)满足上述2个条件并能将f的分布转换为g的均匀分布。
- 计算灰度图像直方图(概率密度):
Pf(fk)=nkN,k=0,1,2,...255=L−1P_f(f_k) = \frac{n_k}{N},k = 0, 1, 2, ... 255 = L - 1Pf(fk)=Nnk,k=0,1,2,...255=L−1
- fkf_kfk : kkk级灰度值
- nkn_knk : 图像中第kkk级灰度值的数量
- NNN : 灰度图像素总个数
2.灰度图分布函数
Gk=∑k=0L−1niN=∑k=0L−1Pf(fk),0<=fk<=1G_k = \sum_{k=0}^{L-1} \frac{n_i}{N} = \sum_{k=0}^{L-1} P_f(f_k),0 <= f_k <= 1Gk=k=0∑L−1Nni=k=0∑L−1Pf(fk),0<=fk<=1
3.直方图均衡化过程:
- 原始灰度图像灰度级 fk:[0,1,2,3,4,...L−1]f_k : [0, 1, 2, 3, 4, ... L-1]fk:[0,1,2,3,4,...L−1]
- 原始灰度级对应的概率 P(fk)P(f_k)P(fk)
- 原始灰度图概率分布 G(fk)G(f_k)G(fk)
- 转换灰度级数 fk→gkf_k \to g_kfk→gk : gk=int[(L−1)×G(fk)+0.5]g_k = int[(L - 1) \times G(f_k) + 0.5]gk=int[(L−1)×G(fk)+0.5]
Python实现直方图均衡化
import cv2 as cv
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
def histogram_equalization(img_gray):hist = np.bincount(img_gray.ravel(), minlength=256)hist_norm = hist/hist.sum()hist_cdf = hist_norm.cumsum() gray_img = img_gray.copy()for i in range(0, 256):gray_img[img_gray == i] = 255*hist_cdf[i]gray_img = np.clip(gray_img, 0, 255).astype(int)return gray_img
测试用例:
RGB空间图像增强
- 直接基于灰度图均衡化结果映射
- 分别对RGB通道进行直方图均衡化
直方图规定化
直方图规定化也是一种借助直方图变换来增强图像的方法,它通过将原始图像的直方图转换为某种期望的直方图来获得预期的增强效果。直方图均衡化是得到全局均衡化的直方图。在实际应用中,有时需要变换直方图使之成为某个特定的形状,以有选择地增强某个灰度值范围内的对比度,这时可以采用比较灵活的直方图规定化方法。
直方图规定化步骤:
- 计算原始灰度图的概率密度:Pf(fk)P_f(f_k)Pf(fk)
- 原始灰度级的概率分布:Gf(fk)G_f(f_k)Gf(fk)
- 进行直方图均衡化: f(x,y)→u(x,y)f(x,y) \to u(x, y)f(x,y)→u(x,y)
- 计算均衡化后的灰度图概率密度和概率分布:Pu(uk)、Gu(uk)P_u(u_k)、G_u(u_k)Pu(uk)、Gu(uk)
- 根据映射规则进行灰度级映射:u(x,y)→g(x,y)u(x, y) \to g(x, y)u(x,y)→g(x,y)
映射规则
- 单映射
SML
:根据分布概率从小到大找到概率最接近的fk,ukf_k, u_kfk,uk,然后将灰度级fk→ukf_k \to u_kfk→uk
∣Gf(fk)−Gu(uk)∣,0<=fk<=M−1,0<=uk<=N−1,M>=N\Big|G_f(f_k) - G_u(u_k)\Big|,0<= f_k <=M-1, 0 <= u_k <= N-1, M >= N∣∣∣Gf(fk)−Gu(uk)∣∣∣,0<=fk<=M−1,0<=uk<=N−1,M>=N
- 组映射
GML
:从小到大(均衡后的灰度级[0~N-1])找到最小的uku_kuk灰度级,然后$ <= f_k \to u_k$
∣Gf(fk)−Gu(uk)∣,0<=uk<=N−1\Big|G_f(f_k) - G_u(u_k)\big|,0 <= u_k <= N-1∣∣∣Gf(fk)−Gu(uk)∣∣,0<=uk<=N−1
举个例子:
- fkf_kfk:
0, 1, 2, 3, 4, 5, 6, 7
- G(fk)G(f_k)G(fk):
0.1, 0.15, 0.3, 0.5 , 0.7 , 0.85, 0.90, 1.0
- P(uk)P(u_k)P(uk):
0.0, 0.3 , 0.0, 0.45, 0.0 , 0.0 , 0.25, 0.0
- G(uk)G(u_k)G(uk):
0.0, 0.3 , 0.3, 0.75, 0.75, 0.75, 1.00, 1.0
均衡后的uku_kuk灰度级取值只有1, 3, 6
, 遍历uku_kuk:
- 当uk=1,fk=2u_k = 1,f_k = 2uk=1,fk=2时,∣Gf(fk)−Gu(uk)∣\Big|G_f(f_k) - G_u(u_k)\Big|∣∣∣Gf(fk)−Gu(uk)∣∣∣最小 :∣0.3−0.3∣=0|0.3 - 0.3| = 0∣0.3−0.3∣=0,所以:0,1,2→10, 1, 2 \to 10,1,2→1
- 当uk=3,fk=4u_k = 3,f_k = 4uk=3,fk=4时,∣Gf(fk)−Gu(uk)∣\Big|G_f(f_k) - G_u(u_k)\Big|∣∣∣Gf(fk)−Gu(uk)∣∣∣最小 :∣0.7−0.75∣=0.05|0.7 - 0.75| = 0.05∣0.7−0.75∣=0.05,所以:3,4→33, 4 \to 33,4→3
- 当uk=6,fk=7u_k = 6,f_k = 7uk=6,fk=7时,∣Gf(fk)−Gu(uk)∣\Big|G_f(f_k) - G_u(u_k)\Big|∣∣∣Gf(fk)−Gu(uk)∣∣∣最小 :∣1.0−1.0∣=0|1.0 - 1.0| = 0∣1.0−1.0∣=0,所以:5,6,7→65,6,7 \to 65,6,7→6
Python实现直方图规定化SML
,GML
def histogram_sml(img_gray):hist_orgi = np.bincount(img_gray.ravel(), minlength=256)hist_orgi = hist_orgi/hist_orgi.sum()cdf_orgi = hist_orgi.cumsum()img_uniform = np.zeros_like(img_gray)for i in range(0, 256):img_uniform[img_gray == i] = 255*cdf_orgi[i]img_uniform = np.clip(img_uniform, 0, 255).astype(int)hist_uniform = np.bincount(img_uniform.ravel(), minlength=256)hist_uniform = hist_uniform/hist_uniform.sum()cdf_uniform = hist_uniform.cumsum()# unique gray valuesunique_uniform = np.unique(img_gray_eq)# new_graynew_gray = np.zeros_like(img_gray)for u in unique_uniform:min_k = np.argmin(np.abs(cdf_orgi - cdf_uniform[u]))new_gray[img_gray == min_k] = ureturn new_gray
直方图单映射
def histogram_gml(img_gray):hist_orgi = np.bincount(img_gray.ravel(), minlength=256)hist_orgi = hist_orgi/hist_orgi.sum()cdf_orgi = hist_orgi.cumsum()img_uniform = np.zeros_like(img_gray)for i in range(0, 256):img_uniform[img_gray == i] = 255*cdf_orgi[i]img_uniform = np.clip(img_uniform, 0, 255).astype(int)hist_uniform = np.bincount(img_uniform.ravel(), minlength=256)hist_uniform = hist_uniform/hist_uniform.sum()cdf_uniform = hist_uniform.cumsum()# unique gray valuesunique_uniform = np.unique(img_gray_eq)# new_graynew_gray = np.zeros_like(img_gray)prev_k = 0for u in unique_uniform:curr_k = np.argmin(np.abs(cdf_orgi - cdf_uniform[u]))new_gray[np.logical_and(img_gray > prev_k, img_gray <= curr_k)] = uprev_k = curr_kreturn new_gray
直方图组映射
RGB颜色空间增强:均衡化
、SML
、GML
def RGB_image_enhancement(img, img_gray, gray_enhance):#img:原始图像,img_gray:灰度图,gray_enhance:增强后灰度图new_img = img*((gray_enhance/(img_gray+0.01)).reshape(img.shape[0], img.shape[1], 1))new_img = np.clip(0, 255, new_img1).astype(int)return new_img
图像空域增强:直方图方法相关推荐
- 数字图像处理笔记-02(图像空域增强技术及联合运用)
数字图像处理笔记-02(图像空域增强技术及联合运用) (一) 图像增强 1.1 基本概念 由于图像在传输或者处理过程中会引入噪声或使图像变模糊,从而降低了图像质量,甚至淹没了特 征,给分析带来了困难. ...
- 目标检测:python实现多种图像数据增强的方法(光照,对比度,遮挡,模糊)
图像数据增强的内容(可根据需要自定义选择): 1.直方图均衡化 2.clahe自适应对比度直方图均衡化 3.白平衡 4.亮度增强 5.亮度,饱和度,对比度增强 6.去除图像上的高光部分 7.自适应亮度 ...
- 图像空域增强技术及联合运用
实验内容: 1.从硬盘中读取需进行增强的人体骨骼图像; 2.求原图像的Laplacian变换,对图像进行锐化处理; 3.用Sobel算子计算原图像的梯度图像; 4.图像的算术运算,包括加和乘; 5.图 ...
- YOLO自带的图像数据增强方法
yolo数据增强code: V3: https://github.com/ultralytics/yolov3/blob/master/utils/datasets.py V4: https://gi ...
- 2.3 Python图像的空域增强处理-直方图修正
2.3 Python图像的空域增强处理-直方图修正 文章目录 2.3 Python图像的空域增强处理-直方图修正 1 算法原理 2 代码 3 效果 1 算法原理 直方图均衡化算法和直方图规定化 对于灰 ...
- 2.1 Python图像的空域增强处理-灰度映射
2.1 Python图像的空域增强处理-灰度映射 文章目录 2.1 Python图像的空域增强处理-灰度映射 1 算法原理 2 代码 3 效果 空域增强处理,包括给定变化曲线的灰度映射(求反.动态范围 ...
- 一种基于灰度映射以及直方图规定化的遥感图像对比度增强技术研究
目录 一.绪论 二.基于灰度映射的对比度增强技术 2.1 线性映射 2.2 动态范围压缩 2.3 Gamma校正 2.4 对比度增强实例分析 三.基于直方图的对比度增强技术 3.1 直方图均衡化 3. ...
- python opencv图像对比度增强_图像增强、锐化, Python-OpenCV 来实现 4 种方法!
图像增强目的使得模糊图片变得更加清晰.图片模糊的原因是因为像素灰度差值变化不大,如片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉 解决这个问题的最直接简单办法,放大像素灰 ...
- 2.4 Python图像的空域增强处理-空域滤波
2.4 Python图像的空域增强处理-空域滤波 文章目录 2.4 Python图像的空域增强处理-空域滤波 1 算法原理 2 代码 3 效果 1 算法原理 空域滤波(线性平滑滤波器.线性锐化滤波器. ...
- 【一文了解】经典图像的增强方法都有些什么?什么又是振铃现象?为什么图像会产生噪声?噪声又有什么分类?
CV_07 图像增强 & 图像噪声 一. 什么是图像增强? 图像增强其实就是有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征.扩大图像中不同物体特征之间的差别 ...
最新文章
- PyTorch 笔记(19)— Tensor 用 GPU 加速
- 开源软件架构总结之——Asterisk(DSL、组件、多线程)
- 图像纹理合成及纹理传输算法学习(附源码)。
- 北航博士,研究所月入两万
- 使用EasyExcel导入导出Excel报表-JAVA解析Excel工具
- java bufferedwriter会自动创建文件吗_Java中为什么会有包装类?自动拆装箱必要吗?关于Wrapping Class这是重点!...
- OpenShift 4 - 如何用Machine Config Operator修改集群节点CoreOS的配置
- java粒子群优化算法_粒子群优化算法的JAVA实现
- java反射最佳实践_Java 反射最佳实践 – 码农网
- MacBook取消自启动程序
- STL之vector去重三步曲(利用unique函数)
- java开发中常用linux指令,Java开发需掌握的常用Linux命令
- 【C/C++】简单的程序小游戏-推箱子代码
- 使用ALLMAPS进行辅助组装得到准染色体水平基因组
- prometheus定义counter指标
- 整理控|四象限系列电脑桌面壁纸分享一波
- 产品经理懂点技术之:常见的网络传输方式
- 标题 穿越雷区 java_蓝桥杯javaB--穿越雷区
- Windows恢复回收站误删文件
- 我来学网络——IIS中出现无效的应用程序池名称
热门文章
- sql如何在两张表中得到每组数据,并知道数据的个数,举例,判断有多少班级,每个班的人数
- java 串行化 序列化_对象串行化 对象序列化
- fastq质量值_高通量测序数据的质量控制FastQC
- C#hashtable使用说明 以及 Hashtable和HashMap的区别【总结性】
- synchornized实现原理
- 活动目录管理中常用的脚本(二)
- bzoj3435 [Wc2014]紫荆花之恋
- OSI参考模型与排错
- OAF_文件系列9_实现OAF解析Excel并读取至数据库JXL
- 【职场攻略】比你的工资更重要的十件事