Откриване на пълни, пълни кръгове с OpenCV

Имам изображение, което показва два кръга с един и същи център, но с различен радиус - вътрешен и външен кръг. Трябва да проверя дали тези два кръга са "счупени", това означава, че формата на кръговете е по някакъв начин протрита или разкъсана.

Кръговете винаги имат един и същ радиус, така че използвам HoughCircles на OpenCV с даден радиус за всеки от двата кръга, за да определя дали изображението съдържа двата кръга. Кръговете се намират без проблем. Нямам доста опит в обработката на изображения, така че си помислих, че използването на HoughCircles ще намери кръговете само ако формата им е безупречна, но HoughCircles също намира кръговете, ако те са някакви ръбове или извивки върху линията на кръга.

Има ли по-добър начин да проверите дали двата кръга са непокътнати или HoughCircles е напълно грешен начин? Играх си малко с параметрите на прага на HoughCircles, но когато прагът е зададен твърде нисък, алгоритъмът изобщо не намира кръг, независимо дали е непокътнат или счупен.

Редактиране: Ето абстрактни изображения, които може да го направят по-ясно. http://1drv.ms/1toMHay Вътрешният кръг е прекъснат, външният е ок. HoughCircles може да открие и двата кръга, въпреки че вътрешният не трябва да бъде открит.

Идеята е, че имам референтно изображение с двата кръга непокътнати, за да определя правилния радиус, праг и други параметри за функцията на окръжностите, за да се уверя, че те се намират с окръжностите. С тези параметри трябва да се анализират други изображения, за да се види дали те също съдържат два непокътнати кръга или поне един кръг изглежда като вътрешния кръг от изображението, което предоставих.

Качени изображения Качих няколко реални изображения, за да стане по-ясно какво се опитвам да постигна. http://1drv.ms/1nhJJQ9 Тези изображения са заснети в две различни светлинни ситуации, с пряка и непряка светлина. Всеки комплект има "непокътнато" изображение и няколко счупени. Сега трябва да открия дали изображението е непокътнато или счупено и първият ми подход е да погледна дали двата кръга са непокътнати или протрити по някакъв начин. Това дори възможно ли е с тези изображения или има по-добър начин?


person CactusJack    schedule 21.08.2014    source източник
comment
Трябва да дадете връзка към няколко изображения. Това ще ни помогне да ви помогнем :)   -  person biquette    schedule 21.08.2014
comment
може би можете да опитате моя отговор от stackoverflow. com/questions/20698613/ и приемайте само близо до 100% кръгове. но отговорът на diip_thomas с помощта на контури може да е по-лесен;)   -  person Micka    schedule 21.08.2014


Отговори (2)


Вариант 1

За откриване дали има кръгове, бих се придържал към функцията houghCircles в OpenCV. За да установите дали са разкъсани/протрити, бих предложил да използвате контури.

Ако използвате функцията OpenCV findContours(), ще получите списък на всички "форми" във вашето изображение. След това можете да проверите дали някой от тези контури отговаря на вашите очаквани критерии. Един кръг трябва да има последователно съотношение между contourArea() и < a href="http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#arclength" rel="nofollow">arcLength().

Пример за използване на findContours() и проверка на площта на всеки контур:

//Find and draw contours
vector <vector<Point> > contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(binaryImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

for (int i = 0; i < contours.size(); i++) {
 float area = contourArea(contours[i], false);
 if (area > 300) {
  drawContours(inputImage, contours, i, Scalar(0, 0, 255), 2, 8, hierarchy);
 }
}

Уверете се, че използвате двоично изображение като вход. Този пример чертае всички контури на изображение в червено, които са по-големи от 300 в contourArea.

Вариант 2

Другата ви възможност е да се придържате към houghCircles(), но след това да проверите за пикселите около кръга, който сте намерили. Ако плъзнете пикселите в радиус от централната точка и преброите колко пиксела са бели във вашето двоично изображение, можете да създадете процент, който може да опише колко добре вашият houghCircle пасва на изображението.

Можете да проверите стойностите на пикселите на двоично изображение по следния начин, просто трябва да направите изявление, за да проверявате само пикселите във вашия кръг.

for(int i=0;i<binaryImage.rows;i++) {
    for(int j=0;j<binaryImage.cols;j++) {
       std::cout << (int)binaryImage.at<uchar>(i,j)<< ",";
    }
    std::cout << "\n";
}
person diip_thomas    schedule 21.08.2014
comment
Танкове за информацията. Опитах го, но проблемът е, че кръговете не са толкова ясни, колкото изглеждат според моето примерно изображение. Това води до много повече форми, отколкото може да се очаква. Направих и качих няколко реални изображения, за да стане по-ясно какво се опитвам да постигна и как изглеждат изходните изображения. - person CactusJack; 22.08.2014
comment
Добри примерни изображения, изясняват малко проблема. Можете да работите към отговора, който предложих, но тогава вашият проблем е да можете да получите двоично изображение, което изглежда като първото изображение, което сте качили. Това би било почти нов въпрос само по себе си. Ще напиша друга опция в друг отговор - person diip_thomas; 22.08.2014
comment
Благодаря ти много. Това е добра идея, но сте прав, основният проблем тогава е да се създаде приемливо двоично изображение. Опитах се да го направя, но има много шум в двоичното изображение и не можете да различите кое принадлежи към кръговата линия и кое не. Ще продължа да опитвам. :) - person CactusJack; 22.08.2014

както каза biqutte, с някои изображения ще получите по-добра помощ, но идеята ми е, че ако знаете радиуса и централната позиция, можете да напишете малка функция, която оценява цвета на пиксела по протежение на кръга, можете да зададете свой собствен марж . и можете да използвате функцията OpenCV cv::Termcriteria, за да подобрите прецизността на вашия алгоритъм.

person Engine    schedule 21.08.2014