Здравствуйте. Занимаюсь задачей нахождения центральной жилки на листе растения.
Есть например, следующие фотографии, где красным цветом обвёл то, что мне надо выделить:
![1686e1387cb0493aa4baf527529b2e35.png](https://habrastorage.org/files/168/6e1/387/1686e1387cb0493aa4baf527529b2e35.png)
![cbc8c4f6bbe248e1babb3c2f5b8416b2.png](https://habrastorage.org/files/cbc/8c4/f6b/cbc8c4f6bbe248e1babb3c2f5b8416b2.png)
![ce81c4a1e14e414c9264a57966d7fa70.png](https://habrastorage.org/files/ce8/1c4/a1e/ce81c4a1e14e414c9264a57966d7fa70.png)
а с помощью поиска контуров и игр с цветом и каналами выделяются в том числе и боковые жилки:
![563081f70da54e1a952c967f2c36153b.png](https://habrastorage.org/files/563/081/f70/563081f70da54e1a952c967f2c36153b.png)
![f55998ae6d8f449f8f9e1a17d0e8e40d.png](https://habrastorage.org/files/f55/998/ae6/f55998ae6d8f449f8f9e1a17d0e8e40d.png)
Применял поиск линий, но там получается каша
![28c0bded7d7b4704984c8da568fe07c3.jpg](https://habrastorage.org/files/28c/0bd/ed7/28c0bded7d7b4704984c8da568fe07c3.jpg)
из которой я большей частью смог очистить боковые контуры откидывая их по определённому условию
но всё равно остаются мусорные линии, выделенные красными квадратами....
![32a5ba2ce0be46538b9a3d4b6ad8f3bf.jpg](https://habrastorage.org/files/32a/5ba/2ce/32a5ba2ce0be46538b9a3d4b6ad8f3bf.jpg)
а попытка преобразования линий обратно в контур приводит к следующему результату:
![52271865d3ba447e9f68c8de6c512cce.jpg](https://habrastorage.org/files/522/718/65d/52271865d3ba447e9f68c8de6c512cce.jpg)
У кого какие есть идеи как решить эту задачу?
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);
}
}
}
}