1
A
回答
2
如果您正在尋找python實現,請查看scikit-image。
One of their examples實質上就是您的使用案例。或者,如果你想堅持「直接」scipy,你可以通過連續使用erosions and dilations using scipy.ndimage
來做到這一點。 (As @AxezDNyde提到。)
編輯:鏈接固定。
1
二元圖像上的腐蝕和膨脹(反之亦然)的組合可以幫助擺脫鹽和胡椒一樣的噪音,使小線條完好無損。關鍵詞是「排序過濾器」和「形態過濾器」。
2
實際上有一種叫做張孫細化算法的算法。你可以在這裏找到它的代碼:http://rosettacode.org/wiki/Zhang-Suen_thinning_algorithm
另外我寫了一個Python的向量化版本,比那個代碼快10倍。下面是代碼:
def neighbours_vec(image):
return image[2:,1:-1], image[2:,2:], image[1:-1,2:], image[:-2,2:], image[:-2,1:-1], image[:-2,:-2], image[1:-1,:-2], image[2:,:-2]
def transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9):
return ((P3-P2) > 0).astype(int) + ((P4-P3) > 0).astype(int) + \
((P5-P4) > 0).astype(int) + ((P6-P5) > 0).astype(int) + \
((P7-P6) > 0).astype(int) + ((P8-P7) > 0).astype(int) + \
((P9-P8) > 0).astype(int) + ((P2-P9) > 0).astype(int)
def zhangSuen_vec(image, iterations):
for iter in range (1, iterations):
print iter
# step 1
P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image)
condition0 = image[1:-1,1:-1]
condition4 = P4*P6*P8
condition3 = P2*P4*P6
condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1
condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6)
cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1)
changing1 = numpy.where(cond == 1)
image[changing1[0]+1,changing1[1]+1] = 0
# step 2
P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image)
condition0 = image[1:-1,1:-1]
condition4 = P2*P6*P8
condition3 = P2*P4*P8
condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1
condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6)
cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1)
changing2 = numpy.where(cond == 1)
image[changing2[0]+1,changing2[1]+1] = 0
return image
0
有PyPI上提供了一個叫做thinning,你可以只安裝點子。它實現了郭和霍爾針對顛簸陣列/ opencv灰度圖像的細化算法。
相關問題
- 1. OpenCV:在二進制圖像中繪製對象的輪廓
- 2. Matlab的:獲取二進制圖像輪廓的法線點
- 3. 輪廓opencv:如何消除二進制圖像中的小輪廓
- 4. Matlab在二進制圖像中查找內部輪廓?
- 5. 如何從二進制圖像中刪除細長結構(輪廓)
- 6. 如何比較二進制模式圖像的兩個輪廓?
- 7. MATLAB - 查找二進制位圖的輪廓?
- 8. OpenCV C++:通過輪廓區域對輪廓線進行排序
- 9. 提取外部輪廓或圖像的輪廓在Python
- 10. 圖像的輪廓軸
- 11. 從圖像生成輪廓
- 12. 輪廓線中輪廓線的平滑度
- 13. 爲餅圖繪製輪廓
- 14. 如何在OpenCV(Python)中將灰度圖像轉換爲RGB以便在二進制圖像中處理圖像之後可視化輪廓?
- 15. 在OpenCV中繪製單個輪廓在圖像上
- 16. 不能輪廓線在圖書館
- 17. 在contourf圖頂部覆蓋輪廓線
- 18. 繪製輪廓後找到輪廓
- 19. 輪廓線閃爍
- 20. ContourPlot:風格化的輪廓線
- 21. 如何從Matplotlib格式化輪廓線
- 22. 在改變線條粗細的同時繪製OpenGL中2D形狀的輪廓
- 23. 如何在iPhone中爲圖像繪製輪廓sdk
- 24. 通過matlab在圖像中繪製兩個輪廓
- 25. 如何繪製具有單值解的二維輪廓線
- 26. 檢測圖像中的文字輪廓
- 27. 圖像分割中的輪廓完成
- 28. DrawString與圖像中的輪廓
- 29. 在圖像上搜索輪廓
- 30. 獲取輪廓圖像Linkedin在Rails
我做了一個谷歌搜索「圖形算法細化線」,並得到了不少點擊。你試過這個嗎? – 2012-04-02 16:48:12