cvDlate / cvErode: как избежать соединения между отдельными объектами? - PullRequest
2 голосов
/ 11 декабря 2010

Я бы хотел разделить объекты в OpenCv, как показано на следующем рисунке: alt text Но если я использую cvDlate или cvErode, объекты растут вместе ... как это сделать с OpenCv?

Ответы [ 3 ]

1 голос
/ 13 декабря 2010

Похоже, вам нужно написать свою собственную функцию расширения, а затем добавить функцию xor самостоятельно.

Согласно документации opencv, вот правило, которое использует cvdlate:

dst = расширен (src, элемент): dst (x, y) = max ((x ', y') в элементе)) src (x + x ', y + y')

Вот псевдокод для начальной точки (не включает код xor):

void my_dilate(img) {

  for(i = 0; i < img.height; i++) {
    for(j = 0; j < img.width; j++) {
       max_pixel = get_max_pixel_in_window(img, i, j);
       img.pixel(i,j) = max_pixel;
    }
  }  

}

int get_max_pixel_in_window(img, center_row, center_col) {
   int window_size = 3;
   int cur_max = 0;
   for(i = -window_size; i <= window_size; i++) {
     for(j = -window_size; j <= window_size; j++) {
        int cur_col = center_col + i; 
        int cur_row = center_row + j;
        if(out_of_bounds(img, cur_col, cur_row)) {
            continue;
        }
        int cur_pix = img.pixel(center_row + i, center_col + j);
        if(cur_pix > cur_max) {
           cur_max = cur_pix;
        }
     }
   }
   return cur_max;
}

// returns true if the x, y coordinate is outside of the image
int out_of_bounds(img, x, y) {
  if(x >= img.width || x < 0 || y >= img.height || y <= 0) {
    return 1;
  }
  return 0;
}
0 голосов
/ 12 декабря 2010

после эрозии и расширения попробуйте пороговое изображение, чтобы устранить слабые элементы. Должны оставаться только сильные области и, таким образом, улучшается разделение объектов. Кстати, вы могли бы быть немного более ясным о вашей проблеме с cvDlate или cvErode.

0 голосов
/ 12 декабря 2010

Насколько я знаю, OpenCV не имеет "расширения с XOR" (хотя это было бы очень приятно иметь).
Чтобы получить аналогичные результаты, вы можете попробовать размыть (как в 'd') и использовать размытые центры в качестве семян для сегментации Вороного, которую вы могли бы затем И с исходным изображением.

...