algorithm रंग पृष्ठभूमि से काले बिंदुओं का पता लगाएं



matlab opencv (3)

मेरा छोटा प्रश्न

निम्नलिखित चित्रों में काले डॉट्स का पता लगाने के लिए कैसे? (मैं सवाल को कॉम्पैक्ट बनाने के लिए केवल एक टेस्ट इमेज पेस्ट करता हूं। अधिक छवियां मिल सकती हैं → यहां ← )।

मेरा लंबा सवाल

जैसा ऊपर दिखाया गया है, पृष्ठभूमि का रंग लगभग नीला है, और डॉट्स का रंग "ब्लैक" है। यदि एक ब्लैक पिक्सेल चुनें और आरजीबी में उसका रंग मापें, मान हो सकता है (0, 44, 65) या (14, 69, 89) .... इसलिए, हम पिक्सल को बताने के लिए एक सीमा निर्धारित नहीं कर सकते, जो काले डॉट या पृष्ठभूमि का हिस्सा है।

मैं विभिन्न रंगों की 10 छवियों का परीक्षण करता हूं, परन्तु मुझे उम्मीद है कि मैं काले रंग के डॉट्स को अधिक जटिल पृष्ठभूमि से ढूंढने का एक तरीका खोज सकता हूं जो तीन या अधिक रंगों से बना हो सकता है, जब तक कि मानवीय आंखें काले डॉट्स को आसानी से पहचान सकती हैं कुछ अत्यंत छोटा या धुंधला बिंदुएं छोड़ी जा सकती हैं।

पिछला कार्य

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

यहां मैंने जो तरीकों की कोशिश की है:

  1. ग्रेस्केल या छवि की चमक में परिवर्तित करना कठिनाई यह है कि मुझे binarization करने के लिए एक अनुकूली दहलीज नहीं मिल सकता है। जाहिर है, एक रंग छवि को ग्रेस्केल या चमक (एचएसवी) का उपयोग करने से बहुत उपयोगी जानकारी खो जाएगी। Otsu एल्गोरिथ्म जो अनुकूली दहलीज की गणना या तो काम नहीं कर सकता।

  2. आरजीबी हिस्टोग्राम की गणना मेरे आखिरी प्रश्न में, नटान की विधि हिस्टोग्राम द्वारा काली रंग का अनुमान लगाने के लिए है यह समय की बचत है, लेकिन अनुकूली दहलीज भी एक समस्या है।

  3. क्लस्टरिंग मैंने कश्मीर का मतलब क्लस्टरिंग करने की कोशिश की है और पृष्ठभूमि के लिए यह काफी प्रभावी है कि केवल एक रंग है कमी (अपना खुद का जवाब देखें) मुझे अग्रिम में क्लस्टरिंग सेंटर की संख्या निर्धारित करने की आवश्यकता है लेकिन मुझे नहीं पता कि पृष्ठभूमि कैसे होगी क्या अधिक है, यह बहुत धीमी है ! मेरा आवेदन आईफोन पर वास्तविक समय पर कब्जा करने के लिए है और अब यह K-means (20 FPS अच्छा लगता है) का उपयोग करके 7 ~ 8 फ्रेम प्रति सेकेंड पर काम कर सकता है।

सारांश

मुझे लगता है कि न केवल इसी तरह के रंग हैं, बल्कि काले बिंदुओं को निकालने के लिए आसन्न पिक्सेल "क्लस्टर" या "मर्ज किए गए" होने चाहिए। कृपया मेरी समस्या को हल करने के लिए मुझे उचित तरीके से मार्गदर्शन करें कोई सलाह या एल्गोरिथ्म की सराहना की जाएगी। कोई मुफ्त भोजन नहीं है लेकिन मुझे उम्मीद है कि लागत और सटीकता के बीच एक बेहतर व्यापार बंद होगा।


मैं rgb2hsv एचएसवी के साथ एचएसवी रंग अंतरिक्ष में परिवर्तित करके कुछ बहुत अच्छा पहले पास के परिणाम प्राप्त करने में सक्षम था, फिर छवि प्रोसेसिंग टूलबॉक्स का उपयोग करते हुए मूल्य चैनल पर imopen और imregionalmin :

rgb = imread('6abIc.jpg');
hsv = rgb2hsv(rgb);
openimg = imopen(hsv(:, :, 3), strel('disk', 11));
mask = imregionalmin(openimg);
imshow(rgb);
hold on;
[r, c] = find(mask);
plot(c, r, 'r.');

और परिणामी छवियां (प्रश्न में छवि के लिए और आपके लिंक से चुना गया एक):

आप कुछ गलत सकारात्मक और मिस्ड डॉट्स देख सकते हैं, साथ ही कुछ बिंदुओं को कई बिंदुओं के साथ लेबल किया जाता है, लेकिन कुछ शोधन (जैसे कि प्रारंभिक चरण में उपयोग किए गए संरचना तत्व को संशोधित करना) इन्हें कुछ को साफ कर सकता है


मैं अपने पुराने 2 डी चोटी खोजक कोड के बिना चित्रों के किसी थ्रेशोल्ड या किसी भी रंग के विचारों के साथ परीक्षण करने के लिए क्यूरीओज़ था, वास्तव में कच्चे आप नहीं सोचते हैं?

im0=imread('Snap10.jpg');
im=(abs(255-im0));
d=rgb2gray(im);
filter=fspecial('gaussian',16,3.5);
p=FastPeakFind(d,0,filter);
imagesc(im0); hold on
plot(p(1:2:end),p(2:2:end),'r.')

मैं जिस कोड का उपयोग कर रहा हूं वह एक सरल 2 डी स्थानीय अधिकतममा खोजक है, कुछ झूठी सकारात्मक हैं, लेकिन ये सभी इस बात पर कब्जा कर लेते हैं कि कोई दोहराव नहीं है। मैं जिस फ़िल्टर का उपयोग कर रहा था वह 2d गाऊसी चौड़ाई और एक विशिष्ट ब्लॉब के समान था (आपकी समस्या के लिए सबसे अच्छा मिलान वाला फ़िल्टर प्राप्त करना होता)। एक और अधिक परिष्कृत संस्करण जो रंगों का इलाज करता है (आरजीबी 2 एचएसवी?) इससे आगे बढ़ सकता है ...


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

%creating a dummy image with a bunch of small white crosses
im = zeros(100,100);
numPoints = 10;

% randomly chose the location to put those crosses
points = randperm(numel(im));
% keep only certain number of points
points = points(1:numPoints);
% get the row and columns (x,y)
[xVals,yVals] = ind2sub(size(im),points);

for ii = 1:numel(points)
   x = xVals(ii);
   y = yVals(ii);
   try
       % create the crosses, try statement is here to prevent index out of bounds
       % not necessarily the best practice but whatever, it is only for demonstration
       im(x,y) = 1;
       im(x+1,y) = 1;
       im(x-1,y) = 1;
       im(x,y+1) = 1;
       im(x,y-1) = 1;
   catch err
   end
end
% display the randomly generated image
imshow(im)

% create a simple cross filter
filter = [0,1,0;1,1,1;0,1,0];
figure; imshow(filter)

% perform convolution of the random image with the cross template
result = conv2(im,filter,'same');

% get the number of white pixels in filter
filSum = sum(filter(:));

% look for all points in the convolution results that matched identically to the filter
matches = find(result == filSum);

%validate all points found
sort(matches(:)) == sort(points(:))
% get x and y coordinate matches
[xMatch,yMatch] = ind2sub(size(im),matches);

मै MATLAB की वेबसाइट पर conv2 प्रलेखन को देखने का सुझाव देगा।





computer-vision