2 Stimmen

cvDilate/cvErode: Wie kann man Verbindungen zwischen getrennten Objekten vermeiden?

Ich möchte Objekte in OpenCv trennen, wie es das folgende Bild zeigt: alt text Aber wenn ich cvDilate oder cvErode verwende, wachsen die Objekte zusammen... wie macht man das mit OpenCv?

1voto

bbrame Punkte 16434

Es sieht so aus, als müssten Sie Ihre eigene Dilate-Funktion schreiben und dann selbst eine xor-Funktion hinzufügen.

In der opencv-Dokumentation finden Sie die folgende Regel, die cvdilate verwendet:

dst=dilate(src,element): dst(x,y)=max((x',y') in element))src(x+x',y+y')

Als Ausgangspunkt dient der folgende Pseudocode (er enthält keinen xor-Code):

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 Stimmen

Könnten Sie mir bitte die Verwendung dieser Funktion "out_of_bounds(img, cur_col, cur_row)" erklären. Es wäre gut, wenn Sie den Pseudocode schreiben würden.

0voto

Adi Shavit Punkte 15890

Soweit ich weiß, gibt es in OpenCV keine "Dilatation mit XOR" (obwohl das sehr schön wäre).
Um ähnliche Ergebnisse zu erzielen, könnten Sie versuchen, zu erodieren (wie in "d") und die erodierten Zentren als Keimzellen für eine Voronoi-Segmentierung zu verwenden, die Sie dann mit dem Originalbild UND verknüpfen können.

0voto

dnul Punkte 707

Nach Erosion und Dilatation versuchen Sie, das Bild zu schwellen, um schwache Elemente zu eliminieren. Nur starke Regionen sollten übrig bleiben und so die Objekttrennung verbessern. Übrigens, könnten Sie Ihr Problem mit cvDilate oder cvErode etwas genauer beschreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X