0. 前言
Python
已逐漸成為數(shù)據(jù)分析/處理領(lǐng)域中的主要語(yǔ)言,這得益于 Python
豐富的第三方庫(kù),但是,這些庫(kù)的設(shè)計(jì)并未在分布式上進(jìn)行擴(kuò)展。Dask
是為了原生地?cái)U(kuò)展這些 Python
庫(kù)及其生態(tài)系統(tǒng)而開(kāi)發(fā)的,它能夠與現(xiàn)有的 Python
生態(tài)系統(tǒng)兼容,將其擴(kuò)展到多核計(jì)算機(jī)和分布式集群中。
1. Dask 簡(jiǎn)介
Dask
是一個(gè)功能強(qiáng)大,可擴(kuò)展且靈活的并行計(jì)算庫(kù),也是一個(gè)構(gòu)建分布式應(yīng)用程序的平臺(tái)。它可以利用單個(gè)計(jì)算機(jī)的多核CPU,也可以擴(kuò)展至多計(jì)算機(jī)群集。
在本節(jié)中,我們將學(xué)習(xí)如何使用 Dask
的 Sobel
濾波器的分布式實(shí)現(xiàn)在圖像中進(jìn)行分布式邊緣檢測(cè)。大型數(shù)據(jù)集通常無(wú)法將所有數(shù)據(jù)放入一個(gè)文件中,因此可能需要將它們分區(qū)并存儲(chǔ)在不同的文件中,有時(shí)甚至可能存儲(chǔ)在不同計(jì)算機(jī)中,為了模擬這種情況,我們將一個(gè)大圖像分為四個(gè)較小的圖像部分,并將這些部分作為單獨(dú)的圖像存儲(chǔ)。然后,我們將介紹如何使用 Dask
讀取這些圖像塊,并在每個(gè)圖像上運(yùn)行分布式邊緣檢測(cè)濾波器,最后組合圖像以獲取完整的邊緣圖像。
為了使用 Dask
,我們首先需要使用 pip
命令進(jìn)行安裝:
$ pip install dask
$ pip install dask_image
2. 使用 Dask 進(jìn)行分布式圖像處理
(1) 導(dǎo)入所有必需的庫(kù),模塊和函數(shù):
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) 實(shí)現(xiàn)函數(shù) partion_image()
以分割圖像,將圖像分割為不重疊的圖像塊(默認(rèn)情況下為 2x2=4
個(gè)圖像),然后,將這些文件保存到同一文件夾中:
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) 調(diào)用函數(shù) partion_image()
將輸入圖像分塊:
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()
函數(shù)讀取所有圖像塊:
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>
從以上輸出可以看出,創(chuàng)建了一個(gè) dask
數(shù)組,其形狀為 (4, 467, 825, 3)
,這意味著它包含四個(gè)圖像幀,每個(gè)圖像幀具有 467
行、825
列和 3
個(gè)顏色通道。
2.1 將 RGB 圖像塊轉(zhuǎn)換為灰度圖像塊
將 RGB
圖像塊轉(zhuǎn)換為灰度圖像塊的語(yǔ)法與將函數(shù)應(yīng)用于多個(gè)圖像或 Dask
塊是相同的,這就是為什么 skimage.colors
中的 rgb2gray()
函數(shù)可以直接應(yīng)用于 Dask
圖像塊。
(1) 繪制獲得的第一個(gè)灰度圖像塊,Dask
能夠使用現(xiàn)有的 scikit-image
函數(shù)將圖像塊轉(zhuǎn)換為灰度:
result = (rgb2gray(partitioned_images))
print(result.shape)
plot_image(result[0])
(2) 使用 dask.array.block()
函數(shù),利用圖像塊創(chuàng)建組合圖像,并繪制組合圖像:
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 濾波器檢測(cè)圖像邊緣
(1) 使用 Dask
自動(dòng)為每個(gè)塊創(chuàng)建計(jì)算圖:
edges = dask_image.ndfilters.sobel(combined_image)
print(edges)
display(edges.visualize())
上圖顯示了 Dask
計(jì)算圖,從圖中可以明顯的看出許多步驟能夠并行完成。
(2) 最后,裁剪輸出圖像的像素值,使值在 [0,1]
范圍內(nèi),并繪制邊緣輸出圖像:
edges = np.clip(edges, 0, 1)
plot_image(edges)
小結(jié)
分布式處理可以將位于不同地點(diǎn)的、或具有不同功能的、或擁有不同數(shù)據(jù)的多臺(tái)計(jì)算機(jī)通過(guò)通信網(wǎng)絡(luò)連接起來(lái),在控制系統(tǒng)的統(tǒng)一管理控制下,協(xié)調(diào)地完成大規(guī)模信息處理任務(wù),利用分布式處理可以提高信息處理速度。在本節(jié)中,我們學(xué)習(xí)了如何使用 Dask
完成分布式圖像處理,從而提高圖像處理速度。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-842545.html
系列鏈接
Python圖像處理【1】圖像與視頻處理基礎(chǔ)
Python圖像處理【2】探索Python圖像處理庫(kù)
Python圖像處理【3】Python圖像處理庫(kù)應(yīng)用
Python圖像處理【4】圖像線性變換
Python圖像處理【5】圖像扭曲/逆扭曲
Python圖像處理【6】通過(guò)哈希查找重復(fù)和類似的圖像
Python圖像處理【7】采樣、卷積與離散傅里葉變換
Python圖像處理【8】使用低通濾波器模糊圖像
Python圖像處理【9】使用高通濾波器執(zhí)行邊緣檢測(cè)
Python圖像處理【10】基于離散余弦變換的圖像壓縮
Python圖像處理【11】利用反卷積執(zhí)行圖像去模糊
Python圖像處理【12】基于小波變換執(zhí)行圖像去噪
Python圖像處理【13】使用PIL執(zhí)行圖像降噪
Python圖像處理【14】基于非線性濾波器的圖像去噪
Python圖像處理【15】基于非銳化掩碼銳化圖像
Python圖像處理【16】OpenCV直方圖均衡化
Python圖像處理【17】指紋增強(qiáng)和細(xì)節(jié)提取
Python圖像處理【18】邊緣檢測(cè)詳解
Python圖像處理【19】基于霍夫變換的目標(biāo)檢測(cè)
Python圖像處理【20】圖像金字塔
Python圖像處理【21】基于卷積神經(jīng)網(wǎng)絡(luò)增強(qiáng)微光圖像
Python圖像處理【22】基于卷積神經(jīng)網(wǎng)絡(luò)的圖像去霧文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-842545.html
到了這里,關(guān)于Python圖像處理【23】分布式圖像處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!