Элемент структурирования диска opencv vs Matlab

Я хочу создать структурированный элемент в форме диска в OpenCv. Мне нужно, чтобы мой SE был похож на

sel = strel('disk',5);

Я хочу сделать это с помощью

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

Что мне нужно сделать, чтобы достичь этого и какие ценности anchor_x а также anchor_y дать ту же центральную точку SE с MATLAB?

7

Решение

В соответствии с документы, Вы можете попробовать:

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

Это дало мне следующий структурирующий элемент:

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

В то время как в MATLAB я получил:

>> 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

Так что не совсем то же самое, но достаточно близко 🙂

6

Другие решения

Мне нужен был точный структурирующий элемент, как в matlab, поэтому я написал эту (не очень элегантную) функцию для своих нужд.
Он работает для фигур с нечетным числом строк / столбцов от 3 до 21 (вы можете вручную добавить другие значения (проверьте # нули в Matlab).

Функция вызывается так:

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

И фактическая функция

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;
1

По вопросам рекламы [email protected]