尋找詳細:
kernel = np.zeros((2*radius+1, 2*radius+1))
y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask = x**2 + y**2 <= radius**2
kernel[mask] = 1
第一行:
kernel = np.zeros((2*radius+1, 2*radius+1))
創建零的2-d陣列,其中的中心點和「半徑」點在任一側。對於半徑= 2,你會得到:
# __r__ +1 __r__
[ 0, 0, 0, 0, 0, ] #\
[ 0, 0, 0, 0, 0, ] #_} r
[ 0, 0, 0, 0, 0, ] # +1
[ 0, 0, 0, 0, 0, ] #\
[ 0, 0, 0, 0, 0, ] #_} r
接下來,你從numpy.ogrid
創建的開放網格 2個陣列。網格網格在numpy中是一個「技巧」,它涉及存儲一個「並行」數組或矩陣,該數組或矩陣將特定單元格的x或y座標保存在該單元格的位置。
例如,y
-mesh電網可能是這樣的:
[ 0, 0, 0, 0, 0, ]
[ 1, 1, 1, 1, 1, ]
[ 2, 2, 2, 2, 2, ]
[ 3, 3, 3, 3, 3, ]
[ 4, 4, 4, 4, 4, ]
而一個x
-mesh電網可能是這樣的:
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
如果你看看他們,你」我會意識到Y_grid[x][y] == y
和X_grid[x][y] == x
這是經常使用,它有多個numpy函數來支持它。 ;-)
開放式網格與封閉式網格相似,只不過它只有「一維」。也就是說,不是一對(例如)5x5陣列,而是一個1x5陣列和一個5x1陣列。這就是ogrid
所做的 - 它返回兩個打開的網格。這些值是從-radius到半徑+ 1,根據蟒規則(意味着半徑+ 1被省略了):
y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
所以y是numpy的陣列從例如存儲,-2..2 (含),x是-2..2的數組。下一步是構建一個布爾型掩碼 - 即一個佈滿值的數組。如你所知,當你在一個numpy數組上操作時,你會得到另一個numpy數組。因此,在以恆定的表達涉及兩個陣列產生另一個數組:
mask = x**2 + y**2 <= radius**2
掩模的值將是2色的位圖,其中一個顏色是「真」,而另一顏色是「假。 「位圖將描述實心圓或磁盤。 (由於<=
關係。請記住,x和y包含-2..2,而不是0..4。)
最後,從類型布爾轉換通過使用掩蔽陣列作爲kernel
陣列(的零)上的覆蓋爲int時,零設置到那些每當掩碼爲「真」:
kernel[mask] = 1
在這一點上,內核看起來像:
# __r__ +1 __r__
[ 0, 0, 1, 0, 0, ] #\
[ 0, 1, 1, 1, 0, ] #_} r
[ 1, 1, 1, 1, 1, ] # +1
[ 0, 1, 1, 1, 0, ] #\
[ 0, 0, 1, 0, 0, ] #_} r
你說,掩碼標識圖像中不會被改變的區域。但是,這不是過濾器改變圖像的重點嗎?或者你是說這是圖像的副本,而不是原始圖像本身,它是由濾鏡更改的? – Jim421616
遮罩確實識別圖像中不會被改變的區域。就像你臉上的面具來保護它,面具「保護」原始數據不被改變。這會使圖像的其他部分暴露於過濾。圖像的蒙版部分將通過座標爲1的'內核'meshgrid指示。曝光部分的座標爲0. –
噢,我向後隱藏了0和1!我的錯。謝謝 :) – Jim421616