Определить пересечение контура без рисования - PullRequest
0 голосов
/ 07 ноября 2019

Я работаю над обнаружением клеток на микроскопических изображениях, как показано ниже. Часто появляются ложные контуры, которые рисуются из-за дефектов на предметных стеклах микроскопа, например, под легендой на рисунке ниже.

В настоящее время я использую это решение , чтобы очистить их,Вот основная идея.

# Create image of background
blank = np.zeros(image.shape[0:2])
background_image = cv2.drawContours(blank.copy(), background_contour, 0, 1, -1)

for i, c in enumerate(contours):
    # Create image of contour
    contour_image = cv2.drawContours(blank.copy(), contours, i, 1, -1)
    # Create image of focal contour + background
    total_image = np.where(background_image+contour_image>0, 1, 0)
        # Check if contour is outside postive space
        if total_image.sum() > background_image.sum():
            continue

enter image description here

Это работает, как и ожидалось;если область total_image больше, чем область background_image, тогда c должен находиться за пределами области интереса. Но рисовать все эти контуры невероятно медленно, а проверка тысяч контуров занимает часы. Есть ли более эффективный способ проверить, перекрываются ли контуры и не требует ли рисования контуров?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Полагаю, цель состоит в том, чтобы исключить внешний контур из дальнейшего анализа? Если это так, проще всего использовать красный фоновый контур в качестве маски. Затем используйте маскированное изображение, чтобы обнаружить синие клетки.

# Create image of background
blank = np.zeros(image.shape[0:2], dtype=np.uint8)
background_image = cv2.drawContours(blank.copy(), background_contour, 0, (255), -1)

# mask input image (leaves only the area inside the red background contour)
res = cv2.bitwise_and(image,image,mask=background_image )

#[detect blue cells]

enter image description here

0 голосов
/ 08 ноября 2019

при условии, что вы пытаетесь найти точки на разных перекрывающихся контурах

рассматриваете контур как

vector<vector<Point> > contours;
..... //obtain you contrours.

vector<Point> non_repeating_points;
for(int i=0;i<contours.size();i++)
{
    for(int j=0;j<contours[i].size();j++)
    {
        Point this_point= countour[i][j];
        for(int k=0;k<non_repeating_points.size();k++)
        {//check this list for previous record
            if(non_repeating_points[k] == this_point)
            {
               std::cout<< "found repeat points at "<< std::endl;
               std::cout<< this_point << std::endl;
               break;
            }
        }
        //if not seen before just add it in the list
        non_repeating_points.push_back(this_point);
    }
}

Я просто написал его без компиляции. но я думаю, что вы можете понять идею.

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

Вы можете объявить локальный кластер вблизи точки non_repeating_points [k]. Назовите егоround_non_repeating_points [k];Вы можете контролировать расстояние, которое можно рассматривать как перехват, и протолкнуть их все в этомround_non_repeating_points [k];

Затем просто проверить в цикле для if (round_non_repeating_points [k] == this_point)

...