python ओपनसीव पायथन के भीतर क्षेत्र प्राप्त करें?



opencv image-processing (1)

मैंने नीचे की तरह एक तस्वीर बनाने के लिए एक अनुकूली थ्रेसहोल्डिंग तकनीक का इस्तेमाल किया है:

मैं इस्तेमाल किया कोड था:

image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)

फिर, मैं इस कोड का उपयोग प्रतिरूप प्राप्त करने के लिए करता हूं:

cnt = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]

मेरा लक्ष्य बाहरी समोच्च में सभी पिक्सल का उपयोग करके मुखौटा बनाना है, इसलिए मैं ऑब्जेक्ट के भीतर सभी पिक्सल को सफेद होने के लिए भरना चाहता हूं। मैं यह कैसे कर सकता हूँ?

मैंने एक मुखौटा बनाने के लिए नीचे दिए गए कोड की कोशिश की है, लेकिन जिसके परिणामस्वरूप मुखौटा छवि को अनुकूली सीमा लागू करने के बाद अलग नहीं लगता

mask = np.zeros(image.shape[:2], np.uint8)
cv2.drawContours(mask, cnt, -1, 255, -1)

आपके पास लगभग सही है यदि आप अपनी थ्रेसहोल्ड छवि पर एक नज़र डालते हैं, तो इसका कारण यह काम नहीं कर रहा है, क्योंकि आपकी जूता ऑब्जेक्ट छवि में अंतराल है विशेष रूप से, आप इसके बाद क्या कर रहे हैं, आप यह उम्मीद करते हैं कि जूते का परिधि इसकी सभी जुड़ा होना है। यदि ऐसा होता है, तो यदि आप सबसे बाहरी समोच्च (जो कि आपका कोड क्या कर रहा है) निकालेगा, तो आपको केवल एक समोच्च होना चाहिए जो ऑब्जेक्ट के बाह्य परिधि को दर्शाता है। एक बार जब आप समोच्च भरें, तो आपके जूते पूरी तरह ठोस हों।

क्योंकि आपके जूते की परिधि पूर्ण और टूटी हुई नहीं है, इसलिए इसका असंबद्ध सफेद क्षेत्रों में परिणाम होता है। क्या आप सभी findContours को खोजने के लिए findContours का उपयोग करना चाहिए, यह केवल प्रत्येक सफेद आकृति के रूप में पाएगा, न कि सबसे बाहरी परिधि के रूप में। जैसे, यदि आप findContours का प्रयास करते हैं और इसका इस्तेमाल करते हैं, तो आप मूल छवि के रूप में उसी परिणाम देंगे, क्योंकि आप केवल छवि के अंदर प्रत्येक श्वेत क्षेत्र की परिधि पा रहे हैं, फिर इन क्षेत्रों को findContours

आपको क्या करना है यह सुनिश्चित करना है कि छवि पूरी तरह से बंद है मैं आपको findContours कि आप सभी डिस्कनेक्ट किए गए क्षेत्रों को एक साथ बंद करने के लिए आकृति विज्ञान का उपयोग कर रहे हैं, फिर इस नई छवि पर एक findContours कॉल करें। विशेष रूप से, एक द्विआधारी morphological समापन प्रदर्शन। ऐसा क्या होता है कि यह पृथक सफेद क्षेत्रों को ले जाता है जो करीब एक साथ होते हैं और सुनिश्चित करते हैं कि वे कनेक्ट हैं। एक morphological समापन का प्रयोग करें, और शायद जूता बंद करने के लिए एक 7 x 7 वर्ग संरचना तत्व की तरह कुछ का उपयोग करें। यह संरचित तत्व आप सोच सकते हैं कि सफेद क्षेत्रों के बीच न्यूनतम जुदाई के रूप में उन्हें जुड़ाव के रूप में माना जा सकता है।

जैसे, ऐसा कुछ करें:

import numpy as np
import cv2 
image = cv2.imread('...') # Load your image in here
# Your code to threshold
image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)    

# Perform morphology
se = np.ones((7,7), dtype='uint8')
image_close = cv2.morphologyEx(image, cv2.MORPH_CLOSE, se)

# Your code now applied to the closed image
cnt = cv2.findContours(image_close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
mask = np.zeros(image.shape[:2], np.uint8)
cv2.drawContours(mask, cnt, -1, 255, -1)

यह कोड आपके थ्रेसहोल्ड छवि को अनिवार्य रूप से लेता है, और इस छवि पर रूपात्मक समापन पर लागू होता है। उसके बाद, हम इस छवि के बाह्य आकृति को पाते हैं, और उन्हें सफेद रंग में भरते हैं एफडब्ल्यूआईडब्ल्यू, मैंने आपकी थ्रेसहोल्ड इमेज डाउनलोड की है, और इसे अपने दम पर लगाया है। यह आपकी छवि के साथ मिलती है:





opencv-contour