聚焦堆栈图像的工具。

focus-stack的Python项目详细描述


聚焦叠加

Python中的焦点堆叠

我写了focusstack,一个简单的图像聚焦叠加工具,用我的显微镜创建有趣的图像。在

Wikipedia:聚焦叠加是一种数字图像处理技术,它将在不同焦距下拍摄的多幅图像组合起来,得到的图像具有比任何单个源图像更大的景深(DOF)。在

请参阅below以获取对算法的详细解释。在

《思维时间》有一个很好的解释视频on Youtube。在


安装

focusstack可以通过运行pip install focusstack来安装。它需要python3.6.0+、OpenCV<;3.4.2和numpy。在

您可以使用opencv4.X+,但是由于SIFT算法是专有的,所以必须在源代码中将use_sift设置为False。在

或者,您可以从源安装:

git clone https://github.com/momonala/focus-stack
cd focus-stack
pip install  -e .

使用

^{pr2}$

选项:

$focusstack --help

usage: Tool to focus stack a list of images. [-h] -i INPUT -o OUTPUT
                                             [-d DEBUG][-g GAUSSIAN][-l LAPLACIAN]

optional arguments:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        directory of images to focus stack
  -o OUTPUT, --output OUTPUT
                        Name of output image.
  -d DEBUG, --debug DEBUG
                        Debug mode.
  -g GAUSSIAN, --gaussian GAUSSIAN
                        Size of gaussian blur kernel.
  -l LAPLACIAN, --laplacian LAPLACIAN
                        Size of laplacian gradient kernel.

focusstack是一个性能良好的Unix风格的命令行工具:

  • 如果没有消息来源传给它,它什么也不做

  • 它将从指定的输入目录中读取图像,并写入相对于当前工作目录的输出图像。在

  • 除非发生内部错误,否则退出,代码为0。在


工作原理:

聚焦叠加算法的工作原理是从一组图像中优先选择焦点最集中的区域,并将它们组合成输出图像。在

用户必须首先创建一组具有不同聚焦平面的图像,所有这些图像都是从固定的有利位置拍摄的。软件将读取所有的图像,并将它们对齐,因为改变焦距会给图像添加一些扭曲或perspective distortion。该工具使用OpenCV中的SIFT算法来查找所有图像中相对于集合中第一个图像的关键点。计算一个单应矩阵并用于扭曲图像并对齐这些关键点(理论上是整个图像)。在

下一步,我们必须找出每幅图像的哪个部分最为集中。这是用拉普拉斯梯度来完成的。拉普拉斯梯度可以看作是图像的二阶导数(其中Sobel梯度是一阶)。它是对像素变化程度的度量。您可以查看Khan Academy's视频,或PyImageSearch's blog来获取此概念的插管。在

alt text

所有的图像都是模糊的,使用高斯模糊滤波器,使一些估计更容易。计算了拉普拉斯梯度。取梯度绝对值的最大值,并将其用作聚焦区域的代理。在

所有的图像都是堆叠的,对于图像中的每个x,y位置,堆栈的最大值被发送到输出图像。我们有了它,一个聚焦叠加图像!在


许可证

麻省理工学院

此代码和算法的灵感来自以下来源:

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Jsonify使用Jackson来定义嵌套对象   在Swing中禁用java图形调试   java Selenium Webdriver拖放在Jenkins上不起作用   java我对一个显示器的问题有一个非常不切实际的询问   java增强的“for”循环导致ArrayIndexOutOfBoundsException   ArrayAdapter适用于Java中的安卓编程,字符串数组   linux在Ubuntu上通过PulseAudio播放Java音频文件时出错   java在Spring应用程序中加载内部(类路径)和外部属性文件   java使用Maven连接到mySQL   Java应用程序的设计   websocket在电报api java中与dc的连接   java XMLStreamException,因为xml中的(&N)   java从控制台输出到JTextArea   Java导出文本文件   java实现parseInt方法   java为什么servlet容器会同步对特定资源/servlet的多个请求的访问?   循环中的Java“while”变量   用Java编程一个国际象棋游戏,gameOver布尔不起作用   java如何获得真正的JPanel大小?