1 引言

图像层叠(Image Stacking)是数字图像处理中的常用的一种技术,它针对同一场景拍摄多张图像,然后将这组图像层叠在一起来减小图像噪声.
我们在低光照场景下拍摄的图像经常会带有噪声,为了将多张拍摄的图像进行堆叠,需要对不同图像上同一位置上像素进行校准.


上图所示,左侧为我们在低光照下拍摄的图像,右侧图像我们使用8张图像进行层叠后的效果.

2 实现

本文需要对以下4张包含不同噪声的四张图进行层叠,所选择的样例图像如下所示:

在进行图像层叠时,对同一位置来自不同图像的像素可以有多种处理方式,一般常用的方式有 均值,中值和最值,我们来写上述几种处理方式的相关代码.

def blendStack(stack, modo='median', axis=0):if modo == 'arithmetic mean':blend = np.mean(stack, axis)if modo == 'geometric mean':blend = stats.gmean(stack, axis)if modo == 'harmonic mean':blend = stats.hmean(stack, axis)if modo == 'median':blend = np.median(stack, axis)if modo == 'minimum':blend = np.amin(stack, axis)if modo == 'maximum':blend = np.amax(stack, axis)return blend.astype(stack.dtype)

上述实现中:

  • stack 参数为我们传入的图像array
  • mode 参数为我们选择的层叠方式
  • axis 参数为我们进行操作的坐标轴

3 处理效果

3.1 获取图像序列

我们一次读取一个目录下所有的图像序列,代码如下:

def stackRead(pathname):'''pathname defined by "glob" pattern.i.e.: "directory/sequence_folder/image_*.jpg"'''SEQ_IMG = glob.glob(pathname)n = len(SEQ_IMG)print("total num is {}".format(n))sample = imageio.imread(SEQ_IMG[0])# x and y are the dimensions# c is the number of channelsy, x, c = sample.shape  # (512,512,3)# define stackstack = np.zeros((n, y, x, c), dtype=sample.dtype)# image stackingfor FILE in SEQ_IMG:index = SEQ_IMG.index(FILE)image = imageio.imread(FILE)stack[index] = imagereturn stack

调用代码如下:

stack = stackRead('./image/sample.*.jpg')
# print(len(stack))
panel(stack , (3, 1),interval=[0, 1],dims=(1200, 400),texts=['{:04}'.format(i + 1) for i in range(10)],save_text = "./result/stack.jpg")

这里显示了取前3张图,运行结果如下:

3.2 中值效果

采用中值进行多幅图像的层叠,所进行的操作为对同一位置的像素点执行取中值操作,代码如下:

median = blendStack(stack)
sample_blend = np.array([stack[0] , median ])
panel(sample_blend, (2, 1),interval=[0, 1],texts=['sample 0001', 'median'],save_text= "./result/median.jpg")

运行结果如下:

3.3 均值效果

采用均值进行多幅图像的层叠,所进行的操作为对同一位置的像素点执行取均值操作,均值的计算包括算术均值,几何均值以及调和均值,调用代码如下:

mean_a = blendStack(stack, modo='arithmetic mean')
mean_g = blendStack(stack, modo='geometric mean')
mean_h = blendStack(stack, modo='harmonic mean')
sample_blend = np.array([mean_a, mean_g, mean_h])
panel(sample_blend, (3, 1),dims=(1200, 400),interval=[0, 1],texts=['arithmetic mean', 'geometric mean', 'harmonic mean'],save_text = './result/mean.jpg',)

运行效果如下:


从左往右依次为 算术均值,几何均值以及调和均值计算后的结果.

3.4 最值效果

采用最值进行多幅图像的层叠,所进行的操作为对同一位置的像素点执行取最大值或最小值操作,相应的调用代码如下:

minimum = blendStack(stack , modo='minimum')
maximum = blendStack(stack , modo='maximum')
sample_blend = np.array([minimum, maximum])
panel(sample_blend, (2, 1),interval=[0, 1],texts=['minimum', 'maximum'],save_text= './result/extremes.jpg')

运行效果如下:


上述图像中,左侧为取最小值运算后的结果,右侧为取最大值运算后的结果.

4 总结

本文介绍了使用图像序列进行图像层叠的原理和多种实现方式,并给出了相应的代码示例和运行效果.

您学废了吗?

5 参考

参考 链接一

关注公众号《AI算法之道》,获取更多AI算法资讯。

注: 完整代码,关注公众号,后台回复 图像层叠 , 即可获取。

Python图像处理之图像层叠相关推荐

  1. 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除

    9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 文章目录 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 1 算法原理 2 代码 3 效果 1 ...

  2. 8.1 Python图像处理之图像典型分割-SUSAN边缘检测

    8.1 Python图像处理之图像典型分割-SUSAN边缘检测 文章目录 8.1 Python图像处理之图像典型分割-SUSAN边缘检测 1 算法原理 2 代码 3 效果 1 算法原理 SUSAN 的 ...

  3. 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)

    9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形态平滑.高帽变换.低帽变换) 文章目录 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形 ...

  4. 9.3 Python图像处理之图像数学形态学-灰度形态学

    9.3 Python图像处理之图像数学形态学-灰度形态学 文章目录 9.3 Python图像处理之图像数学形态学-灰度形态学 1 算法原理 2 代码 3 效果 1 算法原理 灰度图像与二值图像的区别在 ...

  5. 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充

    9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 文章目录 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 1 算法原理 2 代码 3 效果 1 ...

  6. 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测

    9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 文章目录 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 1 算 ...

  7. 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀、膨胀、开启、闭合)

    9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 文章目录 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 1 算法原理 1.1 ...

  8. 8.3 Python图像处理之图像典型分割-分水岭分割

    8.3 Python图像处理之图像典型分割-分水岭分割 文章目录 8.3 Python图像处理之图像典型分割-分水岭分割 1 算法原理 2 代码 3 效果 1 算法原理 分水岭概念是以对图像进行三维可 ...

  9. 8.2 Python图像处理之图像典型分割-主动轮廓

    8.2 Python图像处理之图像典型分割-主动轮廓 文章目录 8.2 Python图像处理之图像典型分割-主动轮廓 1 算法原理 2 代码 3 效果 1 算法原理 主动轮廓模型,将图像分割问题转换为 ...

最新文章

  1. 利用AVR单片机 专用下载 USBtinyISP对Arduino UNO下载程序
  2. FC8下安装mplayer
  3. VC++源码分析 - 中国象棋源码分析
  4. 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
  5. extundelete安装_Linux数据安全工具:数据恢复软件extundelete概述
  6. 数据库查询近七天的数据
  7. 百度seo排名点击器app_百度SEO优化和百度竞价优缺点 - 百度整站排名
  8. chap01 .net 基本框架介绍
  9. 企业文化用品展示网页的开发
  10. Linux中w r x数学代码,Linux bc命令实现数学计算器
  11. 指针与数组的关系---初始化
  12. mysql插入用户 5.7_mysql 5.7 用户添加与权限管理
  13. JavaSE基础——代码块、继承、方法重写和final关键字
  14. 计算机操作系统详细学习笔记(四):设备管理 —— I/O 管理
  15. IPv6 寻址方式简介
  16. 常见MFC UI界面库
  17. 3个基于 Spring Boot 的图片识别处理系统
  18. DBeaver,一款数据库管理工具
  19. PS中矢量形状图层的合并交叉等运算
  20. cfa三级真题和mock_cfa mock和真题哪个难(cfa mock和真题差别)

热门文章

  1. c++2013无法卸载_如何卸载mcafee?手把手教你如何卸载mcafee迈克菲?
  2. 怎么测家里的宽带多少兆?
  3. 《Ascento: A Two-Wheeled Jumping Robot》AbstractI
  4. python 鼠标轨迹录制_python记录鼠标滑动轨迹
  5. 【Python】基础入门
  6. java 如何将byte中的有效长度转换为String
  7. 东营职业学院的计算机网络技术,东营职业学院计算机网络技术专业
  8. 6.29黄金非农周坚持做空多头反弹疲软美元指数走强金价承压
  9. 百度绿萝算法打击友链交易
  10. python-opencv实现gif图片分解