7

Ich möchte ein Diskettenstrukturierungselement auf OpenCv erstellen. Ich brauche meine SE mitDiskstrukturierungselement opencv vs Matlab

sel = strel('disk',5); 

ähnlich zu sein, ich dies mit

cvstructuringElementEx(cols,rows,anchor_x,anchor_y,shape,*values); 

tun wollen Was muss ich tun, um dies zu erreichen, und die Werte von anchor_x und anchor_y geben den gleichen Mittelpunkt der SE mit MATLAB?

Antwort

5

Nach the docs, könnten Sie versuchen:

cv::Mat sel = cv::getStructuringElement(MORPH_ELLIPSE, cv::Size(9,9)); 

Dies gab mir die folgende Strukturelement:

0 0 0 0 1 0 0 0 0 
0 1 1 1 1 1 1 1 0 
0 1 1 1 1 1 1 1 0 
1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 
0 1 1 1 1 1 1 1 0 
0 1 1 1 1 1 1 1 0 
0 0 0 0 1 0 0 0 0 

Während in MATLAB Ich habe:

>> getnhood(strel('disk',5)) 
ans = 
    0  0  1  1  1  1  1  0  0 
    0  1  1  1  1  1  1  1  0 
    1  1  1  1  1  1  1  1  1 
    1  1  1  1  1  1  1  1  1 
    1  1  1  1  1  1  1  1  1 
    1  1  1  1  1  1  1  1  1 
    1  1  1  1  1  1  1  1  1 
    0  1  1  1  1  1  1  1  0 
    0  0  1  1  1  1  1  0  0 

Also nicht genau das gleiche aber nah genug :)

1

Ich brauchte das genaue strukturierende Element wie in Matlab, also schrieb ich diese (nicht sehr elegante) Funktion für meine Bedürfnisse. Es ist für Formen mit einer ungeraden Anzahl von Zeilen/Spalten zwischen 3 und 21 arbeitet (Sie manuell andere Werte hinzufügen können (überprüfen # Nullen in Matlab)

Die Funktion wie folgt aufgerufen wird:.

int Radius = 1; 
// following call equivalent to Matlab's sel = getnhood(strel('disk',Radius)) 
cv::Mat sel = strelDisk(Radius); 

Und die tatsächliche Funktion ist

cv::Mat strelDisk(int Radius){ 
// THIS RETURNS STREL('DISK',RADIUS) LIKE IN MATLAB FOR RADIUS = ODD NUMBER BETWEEN 3-->21 
cv::Mat sel((2*Radius-1),(2*Radius-1),CV_8U,cv::Scalar(255)); 
int borderWidth; 
switch (Radius){ 
case 1: borderWidth = 0; break; 
case 3: borderWidth = 0; break; 
case 5: borderWidth = 2; break; 
case 7: borderWidth = 2; break; 
case 9: borderWidth = 4; break; 
case 11: borderWidth = 6; break; 
case 13: borderWidth = 6; break; 
case 15: borderWidth = 8; break; 
case 17: borderWidth = 8; break; 
case 19: borderWidth = 10; break; 
case 21: borderWidth = 10; break; 
} 
for (int i=0; i<borderWidth; i++){ 
    for (int j=0; j<borderWidth; j++){ 
     if (i+j<8){ 
      sel.at<uchar>(i,j)=0; 
      sel.at<uchar>(i,sel.cols-1-j)=0; 
      sel.at<uchar>(sel.rows-1-i,j)=0; 
      sel.at<uchar>(sel.rows-1-i,sel.cols-1-j)=0; 
     } 
    } 
} 
return sel;