Здравствуйте. Занимаюсь задачей нахождения центральной жилки на листе растения.
Есть например, следующие фотографии, где красным цветом обвёл то, что мне надо выделить:
а с помощью поиска контуров и игр с цветом и каналами выделяются в том числе и боковые жилки:
Применял поиск линий, но там получается каша
из которой я большей частью смог очистить боковые контуры откидывая их по определённому условию
но всё равно остаются мусорные линии, выделенные красными квадратами....
а попытка преобразования линий обратно в контур приводит к следующему результату:
У кого какие есть идеи как решить эту задачу?
P.S> советы вроде порога бинаризации использовал на самом первом этапе, а для выделения контура жилок использую следующий код:
src = qimage2mat(img);
cvtColor(src,src, CV_RGB2HSV_FULL);
// Create a structuring element (SE)
int morph_size = 2;
Mat element = getStructuringElement( MORPH_RECT, Size(morph_size+1, morph_size+1), Point( morph_size, morph_size) );
morphologyEx( src, dst, MORPH_TOPHAT, element, Point(-1,-1),15 );
// Apply the specified morphology operation
vector<Mat> rgbChannels(3);
split(dst, rgbChannels);
bitwise_not(rgbChannels[1],tst);
short int thVmin = 190;
threshold(tst,dst, thVmin, 255, THRESH_BINARY);
vector<vector<Point> > contours;
vector<Point> leafContour;
vector<Vec4i> hierarchy;
findContours(dst, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
P.S.S> Может кто знает более продвинутый алгоритм поиска линий?
P.S.S.S> код, который использовал для поиска линий и очистки от лишнего мусора, но так и не дочистил...
//ищем линии
Mat cdst;
Canny(drawing, dst, 50, 200,5);
cvtColor(dst, cdst, COLOR_GRAY2BGR);
vector<Vec4i> lines, lines1;
//параметры 20,5,30 определены эксперементально
HoughLinesP(dst, lines, 1, CV_PI/360, 20, 5, 30 );
int mmY1 = mmY-80;
int mmY2 = mmY+80;
//делаем первую операцию по очистке
for (unsigned int i = 0; i < lines.size(); i++ ) {
Vec4i l = lines[i];
if( (l[1] > mmY1 && l[1]<mmY2) &&
(l[3] > mmY1 && l[3]<mmY2)) {
lines1.push_back(l);
}
}
lines.clear();
int dmX = round(mmX/7);
for(size_t i=0; i < lines1.size(); i++) {
Vec4i l = lines1[i];
if(l[2] < dmX) { //хвостик листа
if (abs(l[0]-l[2])>abs(l[1]-l[3])/2) {
lines.push_back(l);
}
} else { //остальная часть листа
if (abs(l[1]-l[3]) < 20 && abs(l[0]-l[2]) > 20) { //откидываем острый угол
if (abs(l[0]-l[2])/2>abs(l[1]-l[3])) {
lines.push_back(l);
}
}
}
}