讓說我有一個二維數組通過形狀改進二維數組最大過濾器的性能
let img = [[0, 1, 2, 1, 3, 0],
[1, 1, 1, 1, 1, 1],
[1, 2, 1, 0, 1, 1],
[1, 1, 1, 1, 1, 1],
[0, 1, 4, 1, 5, 0],
]
let shape = [[0,1,0],
[1,1,1],
[0,1,0]]
let diamon_shape = [[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[0, 0, 1, 0, 0]]
形狀(菱形)到每一列則每行的我的地方中心獲得裏面的造型最大數量( = 1),然後用最大數字替換形狀中心。這個喜歡在圖像形態膨脹和腐蝕
這是我在斯威夫特實現:
class func maximum_filter(image:[[Int]], shape:[[Int]]) -> [[Int]]{
let wShape = shape[0].count
let hShape = shape.count
let wImage = image[0].count
let hImage = image.count
var final = Array(repeating: Array(repeating: 0.0, count: image[0].count), count: image.count)
for i in 0..<hImage {
for ii in 0..<wImage {
var startOfWZ = 0
var startOfHZ = 0
var wStart = ii - wShape/2
if wStart < 0 {
wStart = 0
startOfWZ = 1
}
var wEnd = ii + wShape/2
if wEnd >= wImage {
wEnd = wImage - 1
}
var hStart = i - hShape/2
if hStart < 0 {
hStart = 0
startOfHZ = 1
}
var hEnd = i + hShape/2
if hEnd >= hImage {
hEnd = hImage - 1
}
var hz = startOfHZ
var maxNumber = 0.0
for x in hStart...hEnd {
var wz = startOfWZ
for xx in wStart...wEnd {
if shape[hz][wz] == 1 {
let currentNumber = image[x][xx]
if currentNumber > maxNumber {
maxNumber = currentNumber
}
}
wz += 1
}
hz += 1
}
final[i][ii] = maxNumber
}
}
return final
}
首先2個循環迭代我矩陣的每個元素放置形狀的中心上。然後接下來的2個循環,我得到圖像映射的所有元素與形狀的元素(= 1),然後比較它們以獲得最大數量。沒什麼複雜。 結果是:
1 2 2 3 3 3
1 2 2 1 3 1
2 2 2 1 1 1
1 2 4 1 5 1
1 4 4 5 5 5
但是,當我嘗試用真實圖像爲4096x4096(在雙不在詮釋樣品輸入)和菱形爲41x41。與python(1秒)相比,性能超慢(10秒)。這裏我使用python result = maximum_filter(img, footprint=shape)
的代碼。我看不到maximum_filter
的源代碼,所以我自己實現它。我得到了同樣的結果,但表現比他們的慢得多。
因此使用相同的圖像和類似的代碼(方法)蟒蛇在1秒內完成,在迅速需要10秒? – Scriptable
我看不到Python中的代碼。我自己實現了這個代碼 – hoangpx
如果你沒有看到Python代碼,你怎麼知道它在1秒內完成了相同的計算? –