[英]Vectorizing image thresholding with Python/NumPy
我一直在嘗試找到一種更有效的方法來遍歷圖像並在閾值上拆分其屬性。 在網上搜索並與一些編程朋友討論時,他們向我介紹了矢量化(特別是使用numpy)函數的概念。 經過大量的搜索和反復試驗后,我似乎無法理解它。 可以給我一個鏈接,或建議如何使以下代碼更高效嗎?
Im = plt.imread(img)
Imarray = np.array(Im)
for line in Imarray:
for pixel in line:
if pixel <= 20000:
dim_sum += pixel
dim_counter += 1
if pixel > 20000:
bright_sum += pixel
bright_counter += 1
bright_mean = bright_sum/bright_counter
dim_mean = dim_sum/dim_counter
基本上,每個像素的亮度量在0到30000之間,而我試圖分別平均所有低於20000和高於20000的像素。 我知道如何做到這一點的最好方法是使用for循環(在python中很慢)並使用if語句搜索每個像素。
NumPy通過其arrays
和ufuncs
支持並鼓勵矢量化。 在您的情況下,您有一個NumPy數組作為輸入圖像。 因此,這些比較可以單向/矢量化的方式進行,以提供形狀與輸入數組相同的布爾數組。 這些布爾數組用於索引輸入數組時,將從其中選擇有效元素。 這稱為boolean-indexing
並在這種向量化選擇中形成關鍵特征。
最后,我們使用NumPy ndarray.mean
再次以矢量化方式運行,以向我們提供所選元素的平均值。
因此,要將所有這些內容放入代碼中,我們將-
bright_mean, dim_mean = Im[Im > 20000].mean(), Im[Im <= 20000].mean()
對於此特定問題,從代碼效率的角度來看,一次執行比較會更有意義。 比較將為我們提供一個布爾數組,該數組可以在以后使用兩次,一次就這樣,第二次反轉。 因此,我們可以選擇-
mask = Im > 20000
bright_mean, dim_mean = Im[mask].mean(), Im[~mask].mean()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.