@krox
аспирант, программист, исследователь

Как обрезать лишние фрагменты контура в OpenCV?

Здравствуйте. Занимаюсь задачей нахождения центральной жилки на листе растения.
Есть например, следующие фотографии, где красным цветом обвёл то, что мне надо выделить:
1686e1387cb0493aa4baf527529b2e35.pngcbc8c4f6bbe248e1babb3c2f5b8416b2.pngce81c4a1e14e414c9264a57966d7fa70.png
а с помощью поиска контуров и игр с цветом и каналами выделяются в том числе и боковые жилки:
563081f70da54e1a952c967f2c36153b.pngf55998ae6d8f449f8f9e1a17d0e8e40d.png
Применял поиск линий, но там получается каша
28c0bded7d7b4704984c8da568fe07c3.jpg
из которой я большей частью смог очистить боковые контуры откидывая их по определённому условию
но всё равно остаются мусорные линии, выделенные красными квадратами....
32a5ba2ce0be46538b9a3d4b6ad8f3bf.jpg
а попытка преобразования линий обратно в контур приводит к следующему результату:
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);
                      }
                  }
              }
          }
  • Вопрос задан
  • 884 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы