Python图像处理【23】分布式图像处理

news/2024/7/21 4:55:32 标签: python, 图像处理, 分布式

分布式图像处理

    • 0. 前言
    • 1. Dask 简介
    • 2. 使用 Dask 进行分布式图像处理
      • 2.1 将 RGB 图像块转换为灰度图像块
      • 2.2 使用分布式 Sobel 滤波器检测图像边缘
    • 小结
    • 系列链接

0. 前言

Python 已逐渐成为数据分析/处理领域中的主要语言,这得益于 Python 丰富的第三方库,但是,这些库的设计并未在分布式上进行扩展。Dask 是为了原生地扩展这些 Python 库及其生态系统而开发的,它能够与现有的 Python 生态系统兼容,将其扩展到多核计算机和分布式集群中。

1. Dask 简介

Dask 是一个功能强大,可扩展且灵活的并行计算库,也是一个构建分布式应用程序的平台。它可以利用单个计算机的多核CPU,也可以扩展至多计算机群集。
在本节中,我们将学习如何使用 DaskSobel 滤波器的分布式实现在图像中进行分布式边缘检测。大型数据集通常无法将所有数据放入一个文件中,因此可能需要将它们分区并存储在不同的文件中,有时甚至可能存储在不同计算机中,为了模拟这种情况,我们将一个大图像分为四个较小的图像部分,并将这些部分作为单独的图像存储。然后,我们将介绍如何使用 Dask 读取这些图像块,并在每个图像上运行分布式边缘检测滤波器,最后组合图像以获取完整的边缘图像。
为了使用 Dask,我们首先需要使用 pip 命令进行安装:

$ pip install dask
$ pip install dask_image 

2. 使用 Dask 进行分布式图像处理

(1) 导入所有必需的库,模块和函数:

python">from skimage.io import imread, imsave
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pylab as plt
import dask_image.imread
import dask.array
import dask_image.ndfilters
import os, glob
from IPython.display import display

(2) 实现函数 partion_image() 以分割图像,将图像分割为不重叠的图像块(默认情况下为 2x2=4 个图像),然后,将这些文件保存到同一文件夹中:

python">def partion_image(imgfile, n_h=2, n_w=2, plot=True):
    im = imread(imgfile)
    h, w, _ = im.shape
    h_s, w_s = h // n_h, w // n_w
    k = 0
    for i in range(n_h):
        for j in range(n_w):
            imsave(imgfile[:-4] + '_part_{:03d}'.format(k) + imgfile[-4:], im[i*h_s:(i+1)*h_s, j*w_s:(j+1)*w_s, :])          
            k += 1
    if plot:
        k = 0
        plt.figure(figsize=(20,16))
        plt.subplots_adjust(0,0,1,1,0.05,0.05)
        for i in range(n_h):
            for j in range(n_w):
                im = plt.imread(imgfile[:-4] + '_part_{:03d}'.format(k) + imgfile[-4:])
                plt.subplot(n_h, n_w, k+1), plt.imshow(im), plt.title('image part-{}'.format(k+1), size=20)
                k += 1
        plt.show()

(3) 调用函数 partion_image() 将输入图像分块:

python">def plot_image(image):
    plt.figure(figsize=(20,20))
    plt.imshow(image, cmap='gray')
    plt.show()

imgfile = 'save.png'
partion_image(imgfile)

图像分割结果

(4) 使用 dask_image的imread() 函数读取所有图像块:

python">filename_pattern = os.path.join('./', imgfile[:-4] + '_part_*' + imgfile[-4:])
partitioned_images = dask_image.imread.imread(filename_pattern)
print(partitioned_images)
# dask.array<_map_read_frame, shape=(4, 467, 825, 3), dtype=uint8, chunksize=(1, 467, 825, 3), chunktype=numpy.ndarray>

从以上输出可以看出,创建了一个 dask 数组,其形状为 (4, 467, 825, 3),这意味着它包含四个图像帧,每个图像帧具有 467 行、825 列和 3 个颜色通道。

2.1 将 RGB 图像块转换为灰度图像块

RGB 图像块转换为灰度图像块的语法与将函数应用于多个图像或 Dask 块是相同的,这就是为什么 skimage.colors 中的 rgb2gray() 函数可以直接应用于 Dask 图像块。

(1) 绘制获得的第一个灰度图像块,Dask 能够使用现有的 scikit-image 函数将图像块转换为灰度:

python">result  = (rgb2gray(partitioned_images))
print(result.shape)
plot_image(result[0])

第一图像块
(2) 使用 dask.array.block() 函数,利用图像块创建组合图像,并绘制组合图像:

python">data = [result[i, ...] for i in range(result.shape[0])]
data = [data[i:i+2] for i in range(0, len(data), 2)]
combined_image = dask.array.block(data)
print(combined_image.shape)    
plot_image(combined_image)

组合图像

2.2 使用分布式 Sobel 滤波器检测图像边缘

(1) 使用 Dask 自动为每个块创建计算图:

python">edges = dask_image.ndfilters.sobel(combined_image)
print(edges)
display(edges.visualize())

Dask计算图

上图显示了 Dask 计算图,从图中可以明显的看出许多步骤能够并行完成。

(2) 最后,裁剪输出图像的像素值,使值在 [0,1] 范围内,并绘制边缘输出图像:

python">edges = np.clip(edges, 0, 1)
plot_image(edges)

边缘检测结果

小结

分布式处理可以将位于不同地点的、或具有不同功能的、或拥有不同数据的多台计算机通过通信网络连接起来,在控制系统的统一管理控制下,协调地完成大规模信息处理任务,利用分布式处理可以提高信息处理速度。在本节中,我们学习了如何使用 Dask 完成分布式图像处理,从而提高图像处理速度。

系列链接

Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【6】通过哈希查找重复和类似的图像
Python图像处理【7】采样、卷积与离散傅里叶变换
Python图像处理【8】使用低通滤波器模糊图像
Python图像处理【9】使用高通滤波器执行边缘检测
Python图像处理【10】基于离散余弦变换的图像压缩
Python图像处理【11】利用反卷积执行图像去模糊
Python图像处理【12】基于小波变换执行图像去噪
Python图像处理【13】使用PIL执行图像降噪
Python图像处理【14】基于非线性滤波器的图像去噪
Python图像处理【15】基于非锐化掩码锐化图像
Python图像处理【16】OpenCV直方图均衡化
Python图像处理【17】指纹增强和细节提取
Python图像处理【18】边缘检测详解
Python图像处理【19】基于霍夫变换的目标检测
Python图像处理【20】图像金字塔
Python图像处理【21】基于卷积神经网络增强微光图像
Python图像处理【22】基于卷积神经网络的图像去雾


http://www.niftyadmin.cn/n/5442130.html

相关文章

【小白成长记】使用watch优化获取不同tab下数据的代码逻辑

场景&#xff1a;页面有一个 el-tab&#xff0c;共两个tab&#xff1a;Tab1 与 Tab2。需求要求进入页面默认active第二个tab即Tab2。 开始代码写成如下&#xff1a; <el-tabs v-model"tabActiveName" type"card" before-leave"handleTabsClick&q…

励志开始写博客

找工作有几家都问有没有博客&#xff0c;没有博客直接没有面试机会&#xff0c;工作这么多年没怎么写博客&#xff0c;亏了&#xff0c;亏了&#xff0c;励志今年开始写博客,主打想起哪里写哪里

Java 基础 反射

什么是反射&#xff1f; 反射是各类框架的灵魂&#xff0c;允许我们在JVM运行时提供分析类&#xff0c;操作类的能力。 反射是一种在运行时检查和修改类、方法、属性等程序结构的能力。通过反射&#xff0c;可以动态地获取和操作程序的元数据&#xff0c;包括类的字段、方法、…

什么数据需要存在Redis里?缓存的缺点?怎样进行数据同步?

什么数据需要存在Redis里? 通常需要将频繁访问且对性能要求较高的数据存储在Redis中。 缓存数据&#xff1a;Redis常用于存储缓存数据&#xff0c;如热点数据、频繁查询的结果等&#xff0c;以减少对后端数据库的压力和提高系统响应速度。会话信息&#xff1a;对于Web应用来…

蓝桥杯-礼物-二分查找

题目 思路 --刚开始想到暴力尝试的方法&#xff0c;但是N太大了&#xff0c;第一个测试点都超时。题目中说前k个石头的和还有后k个石头的和要小于s&#xff0c;在这里要能想到开一个数组来求前n个石头的总重&#xff0c;然后求前k个的直接将sum[i]-sum[i-k-1]就行了&#xff0…

SpringCloud Alibaba Nacos 服务注册和配置中心

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十二篇&#xff0c;即介绍 SpringCloud Alibaba Nacos 服务注册和配置中心。 二、Nacos 简介 2.1 为…

Flutter 3.13 之后如何监听 App 生命周期事件

在 Flutter 中&#xff0c;您可以监听多个生命周期事件来处理应用程序的不同状态&#xff0c;但今天我们将讨论 didChangeAppLifecycleState 事件。每当应用程序的生命周期状态发生变化时&#xff0c;就会触发此事件。可能的状态有 resumed 、 inactive 、 paused 、 detached …

OpenCV4.9.0在Android 开发简介

查看&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;使用 Clojure 进行 OpenCV 开发简介 下一篇&#xff1a;暂无 引言&#xff1a; OpenCV是一个跨平台计算机视觉库&#xff0c;广泛用于图像处理、计算机视觉和机器学习等领域…