簡體   English   中英

圖像區域密度的矢量化計算

[英]Vectorize calculation of density of image regions

我正在嘗試在 python 中實現圖像點畫算法,並希望矢量化計算標記圖像區域(Voronoi 細胞)的密度(平均亮度)。 目前我可以使用循環來做到這一點,但這對於大量區域來說計算量太大。 如何矢量化此操作?

import numpy as np
from skimage import io
from scipy.interpolate import griddata

number_of_points = 1000
img = io.imread('https://www.kindpng.com/picc/m/111-1114964_house-icon-png-old-house-easy-drawing-transparent.png', as_gray=True)
height, width = img.shape

# generate random points
rng = np.random.default_rng()
points = rng.random((number_of_points,2)) * [width, height]

# calculate labelled regions
grid_x, grid_y = np.mgrid[0:width, 0:height]
labels = griddata(points, np.arange(number_of_points), (grid_x, grid_y), method='nearest')

# calculate density per region (mean of grayscale values of pixels in each region)
point_idxs = np.arange(len(points))
density = [np.mean(img[labels.T==i]) for i in point_idxs] # <-- this is the bottleneck

問題不在於循環,而在於該算法效率不高。 使用矢量化會使用大量的 memory (這很慢)並且幾乎不會加速循環。 實際上, img已完全讀取len(point_idxs) 可以使用np.add.atnp.bincount讀取一次:

sumByLabel = np.zeros(np.max(labels)+1)
np.add.at(sumByLabel, labels.T, img)
countByLabel = np.bincount(labels.reshape(-1))
density = sumByLabel / countByLabel

這在我的機器上需要 32 毫秒,而初始代碼需要 539 毫秒(快 17 倍)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM