5

में गहराई रंग के आधार पर जुड़े क्षेत्र को कैसे विभाजित करना है मेरे पास जैसी एक तस्वीर है, जिसे मुझे तस्वीर को 8 ब्लॉक में विभाजित करने की आवश्यकता है।ओपनसीवी

मैं थ्रेशोल्डिंग
enter image description here

के बाद इस सीमा विधि

img_gray = cv2.imread(input_file,cv2.IMREAD_GRAYSCALE) 
ret,thresh = cv2.threshold(img_gray,254,255,cv2.THRESH_BINARY) = 
kernel = np.array(cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3), (-1, -1))) 
img_open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) 
cv2.imshow('abc',img_open) 
ret1,thresh1 = cv2.threshold(img_open,254,255,cv2.THRESH_BINARY_INV) # 
contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_CCOMP ,cv2.CHAIN_APPROX_NONE) 

for i in range(len(contours)): 
    if len(contours[i]) > 20: 
     x, y, w, h = cv2.boundingRect(contours[i]) 
     cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) 
     print (x, y),(x+w, y+h) 

की कोशिश की है अंतिम परिणाम कुछ एक साथ जुड़े ब्लॉकों एक बड़ा हिस्सा है, जो नहीं है कि मैं क्या आशा व्यक्त की में गठित कर रहे हैं। enter image description here enter image description here enter image description here किसी भी अन्य तरीकों से चारों ओर

+0

मैं ओपनसीवी से परिचित नहीं हूं, लेकिन मुझे लगता है कि समस्या इस तथ्य में निहित है कि आप बाइनरी थ्रेसहोल्ड कर रहे हैं, या तो यह है या नहीं। लेकिन आपको आवश्यक परिणाम ट्रिनरी हैं - दोनों पंक्तियां और फिर पृष्ठभूमि। 'Cv2.THRESH_BINARY' का उपयोग करने के बजाय पृष्ठभूमि को छोड़ने के लिए 'cv2.THRESH_TRUNC'' का प्रयास करें, और उसके बाद लाइटर की पिछली पंक्ति को हल्का पिछला पंक्ति से अलग करने के लिए बाइनरी तुलना करें। अंत में दोनों के लिए समोच्चों को पुनः प्राप्त करें, उन्हें गठबंधन करें, और आपको सिद्धांत में 8 क्षेत्रों के साथ समाप्त होना चाहिए। – Enfyve

+1

क्या आपने स्थान + गहराई के आधार पर अर्थोत्तर विभाजन की कोशिश की है? – Shai

+0

@Shai मैं अर्थात् विभाजन से देखता हूं – user824624

उत्तर

4

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

यहाँ मेरी कोड है (Matlab में, लेकिन मैं इसे opencv बराबर कार्यों को खोजने के लिए बहुत जटिल नहीं है काफी कुछ कर रहा हूँ):

img = imread('http://i.stack.imgur.com/8lJw8.png'); % read the image 
depth = double(img(:,:,1)); 
depth(depth==255)=-100; % make the background VERY distinct 
[dy dx] = gradient(depth); % compute depth gradients 
bmsk = sqrt(dx.^2+dy.^2) > 5; % consider only significant gradient 
% using morphological operations to "complete" the contours around the cars 
bmsk = bwmorph(bwmorph(bmsk, 'dilate', ones(7)), 'skel'); 

% once the contours are complete, use connected components 
cars = bwlabel(~bmsk,4); % segmentation mask 
st = regionprops(cars, 'Area', 'BoundingBox'); 
% display the results 
figure; 
imshow(img); 
hold all; 
for ii=2:numel(st), % ignore the first segment - it's the background 
    if st(ii).Area>200, % ignore small regions as "noise" 
     rectangle('Position',st(ii).BoundingBox, 'LineWidth', 3, 'EdgeColor', 'g'); 
    end; 
end; 

उत्पादन

enter image description here

और

है

enter image description here

सही नहीं है, लेकिन आपको पर्याप्त करीब लाता है।

अतिरिक्त पठन:

  • bwmorph: रूपात्मक कार्रवाई करने।
  • bwlabel: कनेक्टेड घटकों के सेगमेंटेशन मास्क (लेबलिंग) को आउटपुट करने के लिए।
  • regionprops: छवि क्षेत्रों के लिए गणना आंकड़े (उदा।, क्षेत्र और बाध्यकारी बॉक्स)।

इसके बारे में सोचने के लिए आ रहा है, गहराई में इस तरह अच्छा ढ़ाल है, तो आपको सीमा गहराई ढाल कर सकते हैं और अच्छा जुड़ा घटकों मिलता है।

+0

गहराई = डबल (img (:,:, 1)) भी कोशिश करूंगा; गहराई (गहराई == 255) = - 100; कार्यक्रम में मैं इन दोनों को समझ नहीं पा रहा हूं, img (:,:, 1) का मतलब आईएमजी का लाल चैनल है, हम यूआईटी 8 से अपने डेटा प्रकार को बदलने के लिए डबल का उपयोग करते हैं। जब हम गहराई लिखते हैं (गहराई == 255) = -100 का मतलब है कि हम सभी 255 मानों को गहराई से -100 में बदल देते हैं। सवाल यह है कि क्या हुआ और हम ऐसा क्यों करते हैं? – user824624

1

अनुभवहीन दृष्टिकोण इसे पाने के लिए (लेकिन यह काम करता है)

चरण 1: ग्रे पैमाने में छवि पढ़ने के बाद, सीमा नीचे कारों पाने के लिए।

ret1, car_thresh1 = cv2.threshold(cars, 191, 254, 0) 

जिसने मुझे यह दिया। carsBottom

चरण 2: मुख्य छवि

car_thresh2 = car_thresh1 - cars 

जो मुझे यह दिया से इस छवि को घटाएं। enter image description here

चरण 3: थ्रेसहोल्ड घटाया छवि

ret3, cars_thresh3 = cv2.threshold(car_thresh2, 58, 255, 0) 

जो मुझे इस carsTop

तो दे दी है मैं बस आप क्या किया था निकालने और carsTop में आकृति की बैठक के लिए और carsBottom और यह परिणाम है। cars

+0

इस तरह फ्रंटल पिक्चर के लिए काम करेगा, लेकिन आखिरी छवि के लिए, यह – user824624

+0

असफल हो जाएगा क्या आप आयत के बिना आखिरी छवि जोड़ सकते हैं? –

+0

एक समान छवि को – user824624