第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波8 - 直方图处理 - 直方图均衡化(全局直方图均衡化)

直方图均衡化

  • 灰度映射函数:
    s=T(r),0≤r≤L−1(3.8)s = T(r), \quad 0\leq r \leq L -1 \tag{3.8}s=T(r),0rL1(3.8)

  • 假设:

  • (1) T(r)T(r)T(r)在区间0≤r≤L−10 \leq{r} \leq{L-1}0rL1 上是一个单调递增函数。

  • (2) 对于0≤r≤L−10 \leq{r} \leq{L-1}0rL1 ,有0≤T(r)≤L−10 \leq{T(r)} \leq{L-1}0T(r)L1

  • 逆变换
    r=T−1(s),0≤s≤L−1(3.9)r = T^{-1}(s), \quad 0 \leq s \leq L-1 \tag{3.9} r=T1(s),0sL1(3.9)

将条件(1)改为:

  • (1’) T(r)T(r)T(r)在区间0≤r≤L−10 \leq{r} \leq{L-1}0rL1 上是一个严格单调递增函数。

(1)中T(r)T(r)T(r)单调递增的条件保证输出灰度值从不小于对应的输入值,从而防止灰度反转而产生伪像。
(2)保证输出灰度的范围与输入的范围相同。
(1’)保证从sss返回到rrr的映射是一对一的,从而防止出现歧义。

图像的灰度可视为区间[0,L−1][0, L-1][0,L1]内的一个随机变量。令pr(r)p_{r}(r)pr(r)ps(s)p_{s}(s)ps(s)表示两幅不同图像中灰度值rrrsssPDF(概率密度函数)ppp的下标表明pr(r)p_{r}(r)pr(r)ps(s)p_{s}(s)ps(s)是不同的函数。若已知pr(r)p_{r}(r)pr(r)T(r)T(r)T(r),且T(r)T(r)T(r)是连续的且在感兴趣的值域上是可微的,则变换(映射)后的变量sss的PDF是
ps(s)=pr(r)∣drds∣(3.10)p_{s}(s) = p_{r}(r) \bigg\lvert \frac{\text{d}r}{\text{d}s}\bigg\rvert \tag{3.10}ps(s)=pr(r)dsdr(3.10)
可以看到输出灰度变量sss的PDF是由输入灰度的PDF和所有的变换函数确定的

图像处理中的一个特别重要的变换函数是
s=T(r)=(L−1)∫0rpr(w)dw(3.11)s = T(r) = (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.11} s=T(r)=(L1)0rpr(w)dw(3.11)
www是一个假积分变量,右侧的积分是随机变量rrr累积分布函数(CDF)

根据莱布尼茨积分法则可知
drds=dT(r)dr=(L−1)ddr[∫0rpr(w)dw]=(L−1)pr(r)(3.12)\frac{\text{d}r}{\text{d}s} = \frac{\text{d}T(r)}{\text{d}r} = (L - 1) \frac{\text{d}}{\text{d}r} \Bigg[\int_{0}^{r} p_r(w) \text{d} w \Bigg] = (L-1)p_{r}(r)\tag{3.12}dsdr=drdT(r)=(L1)drd[0rpr(w)dw]=(L1)pr(r)(3.12)
用这个结果代替式(3.10)的drds\frac{\text{d}r}{\text{d}s}dsdr,并且所有的概率值都是正的,有:
ps(s)=pr(r)∣drds∣=pr(r)∣1(L−1)pr(r)∣=1L−1,0≤s≤L−1(3.10)p_{s}(s) = p_{r}(r) \bigg\lvert \frac{\text{d}r}{\text{d}s}\bigg\rvert = p_{r}(r) \bigg\lvert \frac{1}{(L-1)p_{r}(r)}\bigg\rvert = \frac{1}{L - 1}, \;0 \leq s \leq L - 1\tag{3.10}ps(s)=pr(r)dsdr=pr(r)(L1)pr(r)1=L11,0sL1(3.10)

直方图均衡化或直方图线性变换
式(3.11)变换的离散形式为:
sk=T(rk)=(L−1)∑j=0kpr(rj),k=0,1,2,…,L−1(3.15)s_{k} = T(r_{k}) = (L -1) \sum_{j=0}^k p_{r}(r_{j}),\quad k = 0, 1, 2, \dots, L-1 \tag{3.15}sk=T(rk)=(L1)j=0kpr(rj),k=0,1,2,,L1(3.15)

def my_calhist(img):"""histogram equalizationparam: input img: uint8[0, 255] grayscale imagereturn uint8[0, 255] grayscale image after histogram equalization"""hist, bins = my_hist(img, bins=256, normalized=True)#--------------------------------Numpy-------------------hist_cumsum = np.round(np.cumsum(hist) * 255).astype(int)img_dst = img.copy()img_dst = hist_cumsum[img_dst]#--------------------------------loop----------------------
#     map_dict = {}
#     map_dict = map_dict.fromkeys(bins.astype(int), 0)    
#     for i in bins:
#         s = np.round(255 * hist[:i].sum()).astype(int)
#         map_dict[i] = s#     height, width = img.shape[:2]
#     img_dst = np.zeros([height, width], np.uint8)
#     for h in range(height):
#         for w in range(width):
#             img_dst[h, w] = map_dict[img[h, w]] # dict 用[ ]
#     img_dst = np.clip(img_dst, 0, 255).astype(np.uint8)
#     return img_dst, map_dict         return img_dst, _
# 直方图均衡化
import time
img_1st = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(1)(top_left).tif', 0)
img_2nd = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(2)(2nd_from_top).tif', 0)
img_3rd = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(3)(third_from_top).tif', 0)
img_4th = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(4)(bottom_left).tif', 0)img_list =['img_1st', 'img_2nd', 'img_3rd', 'img_4th']fig = plt.figure(figsize=(20, 20))
start_time = time.time()
for i in range(len(img_list)):# plot orginal imageax = fig.add_subplot(4, 4, i+1)ax.imshow(eval(img_list[i]), cmap='gray', vmin=0, vmax=255), ax.set_title('Original')# plot histogram equalization imageimg_dst, _ = my_calhist(eval(img_list[i]))ax1 = fig.add_subplot(4, 4, i+5)ax1.imshow(img_dst, cmap='gray', vmin=0, vmax=255), ax1.set_title('After Histogram Equalization')# plot orginal histax2 = fig.add_subplot(4, 4, i+9)hist, bins = my_hist(eval(img_list[i]), bins=256)ax2.bar(bins, hist), ax2.set_title('Original Histogram')# plot hist after histogram equalizationax3 = fig.add_subplot(4, 4, i+13)hist, bins = my_hist(img_dst, bins=256)ax3.bar(bins, hist), ax3.set_title('Hist After Histogram Equalization')elapse = time.time() - start_time
print(f'Elapse -> {elapse}s') 
plt.tight_layout()
plt.show()
Elapse -> 2.3357810974121094s

在这里插入图片描述

def my_calhist(img):"""histogram equalizationparam: input img: uint8[0, 255] grayscale imagereturn uint8[0, 255] grayscale image after histogram equalization"""hist, bins = my_hist(img, bins=256, normalized=True)hist_cumsum = np.round(np.cumsum(hist) * 255).astype(int)height, width = img.shape[:2]img_dst = np.zeros([height, width], np.uint8)for h in range(height):for w in range(width):img_dst[h, w] = hist_cumsum[img[h, w]] # dict 用[ ]img_dst = np.clip(img_dst, 0, 255).astype(np.uint8)return img_dst, hist_cumsum
# 直方图均衡化转换函数
img_1st = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(1)(top_left).tif', 0)
img_2nd = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(2)(2nd_from_top).tif', 0)
img_3rd = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(3)(third_from_top).tif', 0)
img_4th = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(4)(bottom_left).tif', 0)img_list =['img_1st', 'img_2nd', 'img_3rd', 'img_4th']fig = plt.figure(figsize=(6, 6))
for i in range(len(img_list)):# plot histogram equalization transform_, map_dict = my_calhist(eval(img_list[i]))ax1 = fig.gca()ax1.plot(map_dict)plt.xlabel('Original gray value', fontsize=12)
plt.ylabel('Transformed gray value', fontsize=12)
plt.xticks([0, 64, 128, 192, 255])
plt.yticks([0, 64, 128, 192, 255])
plt.xlim([0, 255])
plt.ylim([0, 255])
plt.tight_layout()
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 元组和列表区别_Python干货整理:一分钟了解元组与列表使用与区别

元组是 Python 对象的集合,跟列表十分相似。下面进行简单的对比。列表与元组1、python中的列表list是变量,而元组tuple是常量。列表:是使用方括号[],元组:则是使用圆括号()2、两者都可以使用索引读取值列表1.列表中的a…

Maven for Eclipse 第二章 ——安装 m2eclipse插件

m2eclipse 是一个提供了 Maven 与 Eclipse 整合的插件。它的意图是桥接上 Maven 和 Eclipse 之间的缺口。通过 Maven 原型提供的简单直白的接口创建项目,它使 Maven 在 IDE 中非常容易使用。下面是m2eclipse 提供的一些特性。 创建和导入 Maven 项目在 Eclipse 运行…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波9 - 直方图处理 - 直方图匹配(规定化)灰度图像,彩色图像都适用

直方图匹配(规定化) 连续灰度 sT(r)(L−1)∫0rpr(w)dw(3.17)s T(r) (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.17} sT(r)(L−1)∫0r​pr​(w)dw(3.17) 定义关于变量zzz的一个函数GGG,它具有如下性质: G(z)(L−1)∫0zpz(v)d…

C#委托之就是跟委托过不去…

在上一篇博文当中,我们例举了一个机房自动化系统的逻辑控制程序,其中用到了Lambda表达式,因此方便了我们程序功能的实现.然而,我们不能仅仅为实现功能,完成任务而奋斗,应该知其然,知其所以然,也就是说,知道了Lambda表达式能够带来这样的方便,也应该知道为什么能够带来这样的方便…

closewait一直不释放_机床为什么要释放应力?怎么释放应力才好?

在机床行业内一直有种说法,就是机床需要释放应力,而且越是高精密的机床就越要注意应力的释放,最近就有机床粉向小编询问应力是什么?为什么要释放应力?如果释放要释放多久?怎么释放应力才好等一系列关于机床…

HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

点我看题目 题意 :两条平行线上分别有两种城市的生存,一条线上是贫穷城市,他们每一座城市都刚好只缺乏一种物资,而另一条线上是富有城市,他们每一座城市刚好只富有一种物资,所以要从富有城市出口到贫穷城市…

表单元素选择器

无论是提交还是传递数据,表单元素在动态交互页面的作用是非常重要的。jQuery中专门加入了表单选择器,从而能够极其方便地获取到某个类型的表单元素 表单选择器的具体方法描述: 注意事项: 除了input筛选选择器,几乎每个…

怎样在excel表格中画斜线并打字_一日一技丨Excel斜线表头如何制作?标题、表头的4个技巧...

来源 | 迅捷PDF转换器 (ID:xjpdf6)作者丨小小迅「一日一技」是每天的知识分享专栏,一是分享一些PDF、Office、办公小技巧;二是抽取小可爱们在留言中的疑问并解决。希望对大家有所帮助!表头的标题是Excel中的第一道大门,精致好看的…

Retina时代的前端视觉优化

随着New iPad的发布,平板也将逐渐进入Retina时代,在高分辨率设备里图片的显示效果通常不尽人意,为了达到最佳的显示效果就需要对图片进行优化,这里介绍一些优化方法: 一、用CSS替代图片 这一点在任何时候都适用&#x…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波10 - 直方图处理 - 局部直方图处理

这里写目录标题局部直方图处理局部直方图处理 因为像素是由基于整个图像的灰度的变换函数修改的。这种全局性方法适合于整体增强,但当目的是增强图像中几个小区域的细节时,通常就会失败。这是因为在这些小区域中,像素的数量对计算全局变换的…

C++和Rust_后端程序员一定要看的语言大比拼:Java vs. Go vs. Rust

这是Java,Go和Rust之间的比较。这不是基准测试,更多是对可执行文件大小、内存使用率、CPU使用率、运行时要求等的比较,当然还有一个小的基准测试,可以看到每秒处理的请求数量,我将尝试对这些数字进行有意义的解读。为了…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波11 - 直方图处理 - 使用直方图统计量增强图像

使用直方图统计量增强图像 全局均值和方差 μn∑i0L−1(ri−m)np(ri)(3.24)\mu_{n} \sum_{i0}^{L-1} (r_{i} - m)^{n} p(r_{i}) \tag{3.24}μn​i0∑L−1​(ri​−m)np(ri​)(3.24) m∑i0L−1rip(ri)(3.25)m \sum_{i0}^{L-1} r_{i} p(r_{i}) \tag{3.25}mi0∑L−1​ri​p(ri​…

HDU - 1723 - Distribute Message

先上题目: Distribute Message Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1186 Accepted Submission(s): 547 Problem DescriptionThe contest’s message distribution is a big thing in pre…

nodejs 图片处理模块 rotate_学会Pillow再也不用PS啦——Python图像处理库Pillow入门!...

你在用什么软件进行图像处理呢?厌倦了鼠标和手指的拖拖点点,想不想用程序和代码进行图像的高效处理,Python作为简单高效又很强大的一门编程语言,对于图像的处理自然也是轻松拿下,听起来是不是很酷很极客,那…

创建一个追踪摄像机(2)

为了生成曲线,函数需要通过4个在沿着重量值在0和1之间的路径上连贯的位置。由于重量在这些2个值之间增加,曲线返回在更远的路径上的坐标。 当所提供的重量值为0,曲线将返回正确的坐标在第二个输入坐标。当所提供的重量值为1,曲线将…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波12 - 空间域滤波基础 - 卷积运算(numpy 实现的三种卷积运算)

这篇文章比较长,请耐心看空间域滤波基础线性滤波可分离滤波器核空间域滤波和频率域滤波的一些重要比较如何构建空间滤波器第一种卷积方法(公式法)第二种卷积的方法(可分离核)第三种方法(img2col)这是分离核…

hdu_1861_游船出租_201402282130

游船出租 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7238 Accepted Submission(s): 2411 Problem Description 现有公园游船租赁处请你编写一个租船管理系统。当游客租船时,管理员输入船号并按…

acer清理工具 clear下载_SolidWorks绿色版下载-SolidWorks完全清理工具v1.0免费版

SolidWorks完全清理工具(SWCleanUninstall)是一款绿色免费的SolidWorks完全卸载工具。很多SolidWorks安装不成功都是因为之前安装错误做成软件残留。这款工具可以完全清理很多SolidWorks留下的注册表垃圾。软件核心功能1、SWCleanUninstall可以直接删除电脑上的SolidWorks软件2…

ZOJ1221 Risk 图形的遍历

一开始做图形遍历的题都是用链表做的&#xff0c;这次用数组体会到了方便但就是有点浪费。 不过题目给的内存限制已经足够了。 View Code 1 #include<cstdio>2 #include<cstdlib>3 #include<cstring>4 #include<queue>5 #include<iostream>6 7 …

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波13 - 平滑低通滤波器 -盒式滤波器核

这里写目录标题平滑&#xff08;低通&#xff09;空间滤波器盒式滤波器核平滑&#xff08;低通&#xff09;空间滤波器 平滑&#xff08;也称平均&#xff09;空间滤波器用于降低灰度的急剧过渡 在图像重取样之前平滑图像以减少混淆用于减少图像中无关细节平滑因灰度级数量不…