MATLAB में किसी ऑब्जेक्ट को कैप्चर करने के लिए न्यूनतम बाउंड बॉक्स निर्धारित करें



image-processing (1)

ऐसा लगता है कि आपने जो सुझाया है उसे आपने कोशिश कर लिया है। हालांकि, आप बाउंडिंग बॉक्स चाहते हैं जो संपूर्ण ऑब्जेक्ट को कैप्चर करता है। यह आसानी से BoundingBox संपत्ति का उपयोग करके किया जा सकता है, फिर प्रत्येक आयताकार के प्रत्येक चार कोनों की गणना कर रहा है। फिर आप न्यूनतम फैले हुए बाउंडिंग बॉक्स की गणना कर सकते हैं जो सभी आयतों को समाहित करता है, जो आखिर में पूरे ऑब्जेक्ट का प्रयोग करता है।

मैंने देखा है कि आपकी छवि के तल पर एक पतली सफेद पट्टी है, और यह बाउंडिंग बॉक्स गणनाओं को गड़बड़ कर देगा। इस तरह, मैं छवि के अंतिम 10 पंक्तियों में कटौती करने जा रहा हूं, इससे पहले कि हम न्यूनतम फैले बाउंडिंग बॉक्स की गणना करें। न्यूनतम फैले बाउंडिंग बॉक्स की गणना करने के लिए, आपको बस सभी कोनों को सभी आयतों के लिए लेना होगा, फिर न्यूनतम और अधिकतम x समन्वयन और न्यूनतम और अधिकतम y समन्वय की गणना करें। ये न्यूनतम फैले बाउंडिंग बॉक्स के ऊपर बायीं तरफ और न्यूनतम फैले बाउंडिंग बॉक्स के निचले दाएं से मेल खाते हैं।

जब BoundingBox संपत्ति पर प्रॉपर्टी का इस्तेमाल करते हैं, तो प्रत्येक बाउंडिंग बॉक्स में 4 तत्व वेक्टर होते हैं:

[x y w h]

x,y आपके बाउंडिंग बॉक्स का शीर्ष बायां सह-समन्वय दर्शाता है। x कॉलम होगा और y शीर्ष बाएं कोने की पंक्ति होगी। w,h चौड़ाई और बाउंडिंग बॉक्स की ऊंचाई को दर्शाती है। हम इसका उपयोग करेंगे और पता लगाए गए प्रत्येक आयत के ऊपरी दाएं, ऊपर दाएं, निचले बाएं और नीचे दाईं ओर का गणित करेंगे। एक बार जब आप इसे पूरा कर लें, इन सभी आयत को एक 2 डी मैट्रिक्स में समन्वयित करें, फिर न्यूनतम और अधिकतम x और y के समन्वय की गणना करें। आयत की गणना करने के लिए, बस न्यूनतम बाएं कोने के रूप में न्यूनतम x और y के समन्वय का उपयोग करें, फिर क्रमशः अधिकतम और न्यूनतम x और y के समन्वय को घटाकर चौड़ाई और ऊंचाई की गणना करें।

आगे की हलचल के बिना, यहां कोड है। ध्यान दें कि मैं Nx4 मैट्रिक्स में सभी बाध्यकारी बॉक्स समन्वय को निकालना चाहता हूं जहां N पता चलता है कि बाउंडिंग बॉक्स की संख्या को दर्शाता है। आपको यह सही ढंग से करने के लिए reshape : reshape का उपयोग करना होगा:

% //Read in the image from StackOverflow
x=imread('http://i.stack.imgur.com/mRWId.png');

% //Threshold and remove last 10 rows
y=im2bw(x);
y = y(1:end-10,:);

% //Calculate all bounding boxes
s=regionprops(y, 'BoundingBox');

%// Obtain all of the bounding box co-ordinates
bboxCoords = reshape([s.BoundingBox], 4, []).';

% // Calculate top left corner
topLeftCoords = bboxCoords(:,1:2);

% // Calculate top right corner
topRightCoords = [topLeftCoords(:,1) + bboxCoords(:,3) topLeftCoords(:,2)];

% // Calculate bottom left corner
bottomLeftCoords = [topLeftCoords(:,1) topLeftCoords(:,2) + bboxCoords(:,4)];

% // Calculate bottom right corner
bottomRightCoords = [topLeftCoords(:,1) + bboxCoords(:,3) ...
    topLeftCoords(:,2) + bboxCoords(:,4)];

% // Calculating the minimum and maximum X and Y values
finalCoords = [topLeftCoords; topRightCoords; bottomLeftCoords; bottomRightCoords];
minX = min(finalCoords(:,1));
maxX = max(finalCoords(:,1));
minY = min(finalCoords(:,2));
maxY = max(finalCoords(:,2));

% Draw the rectangle on the screen
width = (maxX - minX + 1);
height = (maxY - minY + 1);
rect = [minX minY width height];

% // Show the image
imshow(y);
hold on;
rectangle('Position', rect, 'EdgeColor', 'yellow');

यह मैं प्राप्त छवि है:

मेरे पास पृष्ठभूमि को छवियों के रूप में घटाया गया है I यह विचार एचओजी एल्गोरिदम के लिए छोटे खोज क्षेत्र का उपयोग करके खोज परिणामों को कम करने के लिए है। अपेक्षित उत्पादन व्यक्ति के चारों ओर एक बाउंडिंग बॉक्स और बॉक्स कोनों की पिक्सेल स्थिति है।

यह इनपुट छवि है:

यह आवश्यक आउटपुट है:

यही मैंने अब तक की कोशिश की है:

x=imread('frame 0080.png');   
y=im2bw(x);
s=regionprops(y);    

imshow(y);    
hold on

for i=1:numel(s)  
   rectangle('Position',s(i).BoundingBox,'edgecolor','y')
end

मुझे ये आउटपुट मिला: