Открийте и намерете центрове за малки черни пръстени с помощта на matlab

Опитах се да намеря отговори за търсене как да открия много малки пръстени в изображение с бял фон. Но навсякъде имат решения за откриване на черни точки. Моля, помогнете ми как да продължа. Току-що започнах да използвам matlab и все още изучавам основите на инструмента. Изображението, в което искам да открия пръстените, е както по-долу!


person Amar Banerjee    schedule 01.09.2014    source източник


Отговори (3)


Ако скоростта не е вашата основна цел и имате Computer Vision Toolbox, бих препоръчал използването на алгоритъма MSER по следния начин:

Image=imread('YourRings.bmp'); 
Image=rgb2gray(Image);

 Regions=detectMSERFeatures(Image);
 plot(Regions);

Резултат:въведете описание на изображението тук

Ако изучавате и разбирате методите и характеристиките на класа, можете също да филтрирате нежелани резултати (по-големи или ексцентрични елипси) без морфологични оператори.

person McMa    schedule 01.09.2014
comment
Благодаря на всички, Mr.McMa. Нямам инсталиран Computer Vision Toolkit в моя matlab, тъй като използвам версия R2012a. Има ли някакъв друг процес, при който мога да получа точно нещата, които сте предложили. - person Amar Banerjee; 01.09.2014
comment
Използвам MEX файлове на функции на OpenCV (вижте [1], също някои обвързвания в OpenCV 3.0 Alpha), които работят също толкова добре или дори по-добре. Ако планирате да извършвате допълнителна обработка на изображения и компютърно зрение, горещо бих препоръчал да ги инсталирате, но ако това е единствената ви задача, може би това е някак пресилено. [1]: mathworks.de/matlabcentral/ linkexchange/links/ - person McMa; 01.09.2014

една проста опция е:

  1. направете откриване на ръбове (лапласиан, canny и т.н.), ширината на филтъра трябва да е по-малка от ширината на пръстена, за да разпознаете двата ръба на пръстена.
  2. след това потърсете кръгове.
  3. за всеки кръг потърсете допълнителен (само един) кръг вътре в него.
  4. когато намерите кръг вътре в кръга, маркирайте като пръстен (имате вътрешни и външни граници, маркирани от краищата).
person shoham    schedule 01.09.2014

Ако пръстените са затворени, можете да bwlabel (използвайки 4-connect) цялото изображение. Най-големият регион ще принадлежи към фона и може да бъде игнориран. След това можете да използвате regionprops, за да намерите центроида на останалите пръстени .

 lb = bwlabel( inputBW, 4 );
 st = regionprops( lb, 'Centroid', 'Area' );
 [bgArea toRemove] = max( [st(:).Area] );
 st(toRemove) = []; %// discard background
 cnt = vertcat( st.Centroid ); %// all centers

Показване на резултатите като зелени X в центъра на пръстените.

 figure;   
 imshow( inputBW ); hold on;
 scatter( cnt(:,1), cnt(:,2), 50, 'xg' );

Ако пръстените не са затворени, можете да използвате някои морфологични операции (bwmorph ) като предварителна обработка за затварянето им.

person Shai    schedule 01.09.2014
comment
Благодаря за отговора, но получавам празен масив cnt и следователно изключение в scatter(). Моля, дайте предложения. - person Amar Banerjee; 01.09.2014
comment
@AmarBanerjee трудно е да се отстранят грешки, без да се гледа реално входно изображение. Но изглежда, че вашите пръстени не са близки и по този начин имате един регион, покриващ фона и вътрешността на пръстените. Ако можете да качите примерно входно изображение и резултата от bwlabel върху това изображение - това ще помогне много. - person Shai; 01.09.2014