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

这篇具有很好参考价值的文章主要介绍了Python图像处理【23】分布式图像处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0. 前言

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

1. Dask 简介

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

$ pip install dask
$ pip install dask_image 

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

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

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 个图像),然后,将这些文件保存到同一文件夹中:

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() 将输入图像分块:

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

imgfile = 'save.png'
partion_image(imgfile)

Python图像处理【23】分布式图像处理,Python图像处理实战,python,图像处理,分布式

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

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 函数将图像块转换为灰度:

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

Python图像处理【23】分布式图像处理,Python图像处理实战,python,图像处理,分布式
(2) 使用 dask.array.block() 函数,利用图像块创建组合图像,并绘制组合图像:

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)

Python图像处理【23】分布式图像处理,Python图像处理实战,python,图像处理,分布式

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

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

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

Python图像处理【23】分布式图像处理,Python图像处理实战,python,图像处理,分布式

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

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

edges = np.clip(edges, 0, 1)
plot_image(edges)

Python图像处理【23】分布式图像处理,Python图像处理实战,python,图像处理,分布式

小结

分布式处理可以将位于不同地点的、或具有不同功能的、或拥有不同数据的多台计算机通过通信网络连接起来,在控制系统的统一管理控制下,协调地完成大规模信息处理任务,利用分布式处理可以提高信息处理速度。在本节中,我们学习了如何使用 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】基于卷积神经网络的图像去雾文章来源地址https://www.toymoban.com/news/detail-842545.html

到了这里,关于Python图像处理【23】分布式图像处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式调用与高并发处理 Zookeeper分布式协调服务

    单机架构 一个系统业务量很小的时候所有的代码都放在一个项目中就好了,然后这个项目部署在一台服务器上,整个项目所有的服务都由这台服务器提供。 缺点: 服务性能存在瓶颈,用户增长的时候性能下降等。 不可伸缩性 代码量庞大,系统臃肿,牵一发动全身 单点故障

    2024年02月12日
    浏览(48)
  • 分布式处理框架 MapReduce

    3.2.1 什么是MapReduce 源于Google的MapReduce论文(2004年12月) Hadoop的MapReduce是Google论文的开源实现 MapReduce优点: 海量数据离线处理易开发 MapReduce缺点: 实时流式计算 3.2.2 MapReduce编程模型 MapReduce分而治之的思想 数钱实例:一堆钞票,各种面值分别是多少 单点策略 一个人数所有的钞票

    2024年02月11日
    浏览(40)
  • 微服务分布式事务处理

    当我们向微服务架构迁移时,如何处理好分布式事务是必须考虑的问题。这篇文章介绍了分布式事务处理的两种方案,可以结合实际采用合适的解决方案。原文:Handling Distributed Transactions in the Microservice world [1] 如今每个人(包括我)都在思考、构建微服务,分布式系统是微服

    2024年02月04日
    浏览(35)
  • 分布式异步任务处理组件(七)

    分布式异步任务处理组件底层网络通信模型的设计--如图: 使用Java原生NIO来实现TCP通信模型 普通节点维护一个网络IO线程,负责和主节点的网络数据通信连接--这里的网络数据是指组件通信协议之下的直接面对字节流的数据读写,上层会有另一个线程负责网络通信协议的实现

    2024年02月14日
    浏览(33)
  • 分布式异步任务处理组件(八)

    分布式异步任务组件网络通信线程模型设计-- 大概说一下功能场景: 从节点和主节点建立连接,负责和主节点的网络IO通信,通信动作包括投票,心跳,举证等,步骤为读取主节点的信息,写入IO队列中,然后从IO队列中读取解码,翻译成具体的协议命令,发送给上层线程处理

    2024年02月13日
    浏览(34)
  • 分布式异步任务处理组件(五)

    节点上线和下线的逻辑-- 节点下线分为两种--心跳失败主动或被动和主节点断开连接,但是节点本身没有发生重启;第二种就是节点宕机重启--其实这两中情况下处理逻辑都是一样的,只是节点本身如果还能消费到kafka的时候可以继续执行任务但是不能从kafka中拉取新的消息,

    2024年02月14日
    浏览(33)
  • 分布式异步任务处理组件(四)

    基于zookeeper的HA集群设计思路-- 各个节点都可以消费任务,但是由主节点来投票; 主节点通过注册zookeeper的临时节点来选举--主节点需要同步从节点的信息 正常工作机制--各个节点(包括主节点本身)在执行任务之前询问主节点,主节点通过布隆过滤器判断该任务是否被执行

    2024年02月14日
    浏览(38)
  • 分布式异步任务处理组件(二)

    一些关键点的设计脑暴记录----very important!!! 首先,任务存储交给kafka,由节点负责写入kafka,acks=1;失败重试;透传kafka的提交可靠性,保证任务提交成功;后续可以考虑自己实现kafka相关机制---做局部优化,因为强依赖kafka 如何保证消息唯一被消费一次---集群状态维护全

    2024年02月15日
    浏览(29)
  • 分布式事务的安全与加密处理

    分布式事务是在多个独立的系统之间进行协同工作时,需要保证事务的原子性、一致性、隔离性和持久性的一种场景。随着分布式系统的普及和发展,分布式事务的应用也越来越广泛。然而,分布式事务的安全与加密处理是一个非常重要的问题,需要深入了解其核心概念、算

    2024年01月23日
    浏览(82)
  • 分布式任务调度,定时任务的处理方案

    适用场景: Spring 定时任务是 Spring 框架提供的一种轻量级的任务调度方案,它的特点是简单易用、轻量级。Spring 定时任务的执行是在 单个节点 上进行的,如果需要分布式任务调度,需要自己实现相应的解决方案。 1.导入依赖版本自己控制 2.启动类加上@EnableScheduling 3.编写业

    2023年04月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包