6

के परिधि की गणना करें मैं किसी दिए गए numpy सरणी संरचना के परिधि की गणना करना चाहता हूं। परिधि के साथ मेरा मतलब है कि numpy सरणी में संरचना का सटीक परिधि। संरचना छेद शामिल हो सकता है।numpy array

import numpy 
a = numpy.zeros((6,6), dtype=numpy.int) 
a[1:5, 1:5] = 1;a[3,3] = 0 
# Way 1 
s = ndimage.generate_binary_structure(2,1) 
c = ndimage.binary_dilation(a,s).astype(a.dtype) 
b = c - a 
numpy.sum(b) # The result, however the hole is calculated as 1, although there are 4 edges 

# Way 2 
b = ndimage.distance_transform_cdt(a == 0,metric='taxicab') == 1 
b = b.astype(int) 
numpy.sum(b) # same as above 

enter image description here

आप इसे सभी सन्निकट कक्षों को प्रदर्शित करता है देख सकते हैं, लेकिन उनमें से योग पैच की परिधि के बराबर नहीं है:

मेरे वर्तमान aproach कुछ इस तरह है। उदाहरण सरणी में छेद की गणना 1 के रूप में की जाती है हालांकि यह सही ढंग से 4 किनारों पर है। विभिन्न आकारों के अधिक छेद के साथ समान समस्याएं हैं।

मैंने अतीत में समान प्रश्न पूछे हैं, लेकिन सभी प्रदान किए गए समाधान जो किसी भी तरह से अंत में सही आउटपुट मानों में हल नहीं हुए हैं। किसी को पता है कि इसे कैसे पूरा किया जाए? कृपया numpy, scipy और बेस पैकेज से कोई अन्य पैकेज कृपया।

+1

इस उदाहरण में आप किस मूल्य की अपेक्षा करते हैं? – Eric

+0

एक पूर्णांक मान। उपरोक्त परीक्षण डेटा सेट में अंतिम मान 20 होना चाहिए, क्योंकि 20 किनारे हैं। – Curlew

उत्तर

4

क्या आपका मतलब है, छवि में, लंबाई-1 किनारों की कुल संख्या जो लाल रंग के टाइल्स से नीले रंग के रंग को अलग करती है? इस संख्या के ऊपर की तस्वीर में 28 होगा। उदाहरण में आप कोड में देते हैं (जो थोड़ा अलग है, 4 कोनों को सीमा रेखाओं के बाकी हिस्सों से अलग नहीं है) यह 20 होगा।

यदि आप यही हैं (बाइनरी छवि मान लिया गया है)

numpy.sum(a[:,1:] != a[:,:-1]) + numpy.sum(a[1:,:] != a[:-1,:])

+0

छवि परिणामस्वरूप सरणी (बी) प्लॉट है। – Curlew

+0

हाँ, काम करता है! मैं आपका समाधान चुन रहा हूं, क्योंकि यह काफी छोटा और तेज़ है – Curlew

5

गणना इंटीरियर में और किनारों पर किनारों की संख्या: गणना करने के लिए चाहते हैं, आप की तरह कुछ कर सकते हैं

n_interior = abs(diff(a, axis=0)).sum() + abs(diff(a, axis=1)).sum() 
n_boundary = a[0,:].sum() + a[:,0].sum() + a[-1,:].sum() + a[:,-1].sum() 
perimeter = n_interior + n_boundary 

आप n_boundary अगर छोड़ सकते हैं छवि उचित है वाई शून्य गद्देदार