第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.17} s=T(r)=(L1)0rpr(w)dw(3.17)
    定义关于变量zzz的一个函数GGG,它具有如下性质:
    G(z)=(L−1)∫0zpz(v)dv=s(3.18)G(z) = (L - 1) \int_{0}^{z} p_z(v) \text{d} v = s \tag{3.18} G(z)=(L1)0zpz(v)dv=s(3.18)
    因此zzz必定满足条件:
    z=G−1(s)=G−1[T(r)](3.19)z = G^{-1}(s) = G^{-1}[T(r)] \tag{3.19}z=G1(s)=G1[T(r)](3.19)

使用如下步骤可以得到一幅灰度级具有规定PDF的图像:

  1. 由输入图像得到式(3.17)中使用的pr(r)p_{r}(r)pr(r)
  2. 在式(3.18)中使用规定的PDF即pz(z)p_{z}(z)pz(z)得到函数G(z)G(z)G(z)
  3. 计算反变换z=G−1(s)z=G^{-1}(s)z=G1(s);输出图像中的像素值是sss。对于均衡化后的图像中值为sss的每个像素执行逆映射z=G−1(s)z=G^{-1}(s)z=G1(s),得到输出图像中的对应像素。使用这个变换处理完所有像素后,输出图像的PDF即pz(z)p_{z}(z)pz(z)将等于规定的PDF。
  • 离散灰度
    sk=T(rk)=(L−1)∑j=0kpr(rj),k=0,1,2,…,L−1(3.20)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.20}sk=T(rk)=(L1)j=0kpr(rj),k=0,1,2,,L1(3.20)
    G(zq)=(L−1)∑i=0qpz(zi),q=0,1,2,…,L−1(3.21)G(z_{q}) = (L -1) \sum_{i=0}^q p_{z}(z_{i}),\quad q = 0, 1, 2, \dots, L-1 \tag{3.21}G(zq)=(L1)i=0qpz(zi),q=0,1,2,,L1(3.21)
    G(zq)=sk(3.22)G(z_{q}) = s_{k} \tag{3.22}G(zq)=sk(3.22)
    zq=G−1(sk)(3.23)z_{q} = G^{-1}(s_{k}) \tag{3.23}zq=G1(sk)(3.23)

离散直方图规定化的过程

  1. 计算输入图像的直方图pr(r)p_{r}(r)pr(r),并在式(3.20)中用它将输入图像中的灰度映射到直方图均衡化后的图像中的灰度。将得到的值sks_{k}sk四舍五入到整数区间[0,L−1][0, L-1][0,L1]
  2. 用式(3.21)对q=0,1,2,…,L−1q = 0, 1, 2, \dots, L-1q=0,1,2,,L1计算函数G(zq)G(z_{q})G(zq)的所有值,其中pz(zi)p_{z}(z_{i})pz(zi)是规定直方图的值。将GGG的值四舍五入到区间[0,L−1][0, L-1][0,L1]内的整数。并存储到一个查找表中。
  3. sk,k=0,1,2,…,L−1s_{k}, k=0, 1, 2, \dots, L-1sk,k=0,1,2,,L1的每个值,用步骤2中存储的GGG值找到zqz_{q}zq的对应值,使得G(zq)G(z_{q})G(zq)最接近sks_{k}sk。存储从ssszzz的这些映射。当多个zqz_{q}zq值给出相同的匹配(即映射不唯一)时,按照约定选择最小的值。
  4. 使用步骤3中找到的映射,将每个均衡化后的像素sks_{k}sk值映射到直方图规定化图像中值为zqz_{q}zq的对应像素,并形成直方图规定化后的图像。
def my_histogram_matching(img_src, img_dst):"""historgram specification for two input imagesparam: input img_src: input image used for histogram specification , uint8[0, 255] grayscale imageparam: input img_dst: input image for histogram specification , uint8[0, 255] grayscale imagereturn: uint8[0, 255] grayscale image after histogram specification """bins = 256# img_src -> input, img_dst -> matchinghist_src, bins_src = my_hist(img_src, bins=256, normalized=True)hist_dst, bins_dst = my_hist(img_dst, bins=256, normalized=True)# [原灰度级,均衡化的值]list_src = list([x, y] for x in np.arange(bins) for y in np.arange(bins) if y == 0) for i in bins_src:s = np.round(255 * hist_src[:i].sum()).astype(int)list_src[i][1] = s# [原灰度级,均衡化的值] list_dst = list([x, y] for x in np.arange(bins) for y in np.arange(bins) if y == 0)for i in bins_dst:s = np.round(255 * hist_dst[:i].sum()).astype(int)list_dst[i][1] = s# 映射的关系列表初始化,以下映射关系算法list_dst_1 = list([x, y] for x in np.arange(bins) for y in np.arange(bins) if y == 0)for i in range(256):minv = 1temp_dst = list_dst[i][1]for j in range(256):temp_src = list_src[j][1]if abs(temp_dst - temp_src) < minv:minv = abs(temp_dst - temp_src)idx = int(j)# print(f'dst -> {temp_dst}, src -> {temp_src}, idx -> {idx}')list_dst_1[i][1] = idx#------------------------------Numpy-------------map_dict = np.array(list_dst_1)[:, 1]img_result = img_dst.copy()img_result = map_dict[img_result]
#------------------------------loop-----------------
#     height, width = img_dst.shape[:2]
#     img_result = np.zeros([height, width], np.uint8)
#     for h in range(height):
#         for w in range(width):
#             img_result[h, w] = list_dst_1[img_dst[h, w]][1]
#     img_result = np.clip(img_result, 0, 255).astype(np.uint8)return img_result
# Grayscale image histogram matching, different shape image works
img_1 = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0307(a)(intensity_ramp).tif', 0)
img_2 = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(4)(bottom_left).tif', 0)
hist_1, bins_1 = my_hist(img_1, bins=256, normalized=True)
hist_2, bins_2 = my_hist(img_2, bins=256, normalized=True)img_dst = my_histogram_matching(img_1, img_2,)
hist_dst, bins_dst = my_hist(img_dst, bins=256, normalized=True)plt.figure(figsize=(15, 10))
plt.subplot(2, 3, 1), plt.imshow(img_1, 'gray', vmin=0, vmax=255), plt.title('src')
plt.subplot(2, 3, 2), plt.imshow(img_2, 'gray', vmin=0, vmax=255), plt.title('dst')
plt.subplot(2, 3, 3), plt.imshow(img_dst, 'gray', vmin=0, vmax=255), plt.title('Result')
plt.subplot(2, 3, 4), plt.bar(bins_1, hist_1), plt.xlim([0, 255])
plt.subplot(2, 3, 5), plt.bar(bins_2, hist_2), plt.xlim([0, 255])
plt.subplot(2, 3, 6), plt.bar(bins_dst, hist_dst), plt.xlim([0, 255])
plt.tight_layout()
plt.show()

在这里插入图片描述

# RGB 直方图匹配 opencv读入的是BGR图像,[..., ::-1]可以把BGR转为RGB的图像
img_1 = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0651(a)(flower_no_compression).tif',)[..., ::-1]
img_2 = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif', )[..., ::-1]img_dst = np.zeros_like(img_2, dtype=np.uint8)for i in range(3):img_dst[..., i] = my_histogram_matching(img_1[..., i], img_2[..., i])plt.figure(figsize=(15, 10))
plt.subplot(2, 3, 1), plt.imshow(img_1, vmin=0, vmax=255), plt.title('src')
plt.subplot(2, 3, 2), plt.imshow(img_2, vmin=0, vmax=255), plt.title('dst')
plt.subplot(2, 3, 3), plt.imshow(img_dst, vmin=0, vmax=255), plt.title('Result')
plt.tight_layout()
plt.show()

在这里插入图片描述

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

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

相关文章

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

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

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

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

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

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

表单元素选择器

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

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

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

Retina时代的前端视觉优化

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

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

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

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

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

第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

先上题目&#xff1a; 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入门!...

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

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

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

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

这篇文章比较长&#xff0c;请耐心看空间域滤波基础线性滤波可分离滤波器核空间域滤波和频率域滤波的一些重要比较如何构建空间滤波器第一种卷积方法&#xff08;公式法&#xff09;第二种卷积的方法&#xff08;可分离核&#xff09;第三种方法&#xff08;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 现有公园游船租赁处请你编写一个租船管理系统。当游客租船时&#xff0c;管理员输入船号并按…

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;空间滤波器用于降低灰度的急剧过渡 在图像重取样之前平滑图像以减少混淆用于减少图像中无关细节平滑因灰度级数量不…

WPF 窗体设置

WPF 当窗体最大化时控件位置的大小调整&#xff1a; View Code 1 <Window x:Class"WpfApplication1.MainWindow"2 xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"3 xmlns:x"http://schemas.microsoft.com/wi…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波14 - 平滑低通滤波器 -高斯滤波器核的生成方法

目录平滑&#xff08;低通&#xff09;空间滤波器低通高斯滤波器核统计排序&#xff08;非线性&#xff09;滤波器平滑&#xff08;低通&#xff09;空间滤波器 平滑&#xff08;也称平均&#xff09;空间滤波器用于降低灰度的急剧过渡 在图像重取样之前平滑图像以减少混淆用…

python3.7怎么安装turtle_python怎么安装turtle

turtle库是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始&#xff0c;它根据一组函数指令的控制&#xff0c;在这个平面坐标系中移动&#xff0c;从而在它爬行的路径上绘制了图…