2016-10-18 2 views
1

Я пытаюсь создать альфа-фильтр в библиотеке openCV. Мой код работает некорректно, и результирующее изображение не выглядит как изображение после фильтрации. Фильтр должен работать следующим образом.Проблемы с фильтром Alpha-trimmed

  1. Chossing some (array) пикселей в моем примере это 9 пикселей '3x3' окно.
  2. Порядок их в увеличении.
  3. Режущий «массив» с обеих сторон для альфа-2.
  4. вычисляет среднее арифметическое оставшихся пикселей и вставляет их в надлежащее место.

int alphatrimmed(Mat img, int alpha) 
{ 
Mat img9 = img.clone(); 
const int start = alpha/2 ; 
const int end = 9 - (alpha/2); 

//going through whole image 
for (int i = 1; i < img.rows - 1; i++) 
{ 
for (int j = 1; j < img.cols - 1; j++) 
{ 
    uchar element[9]; 
    Vec3b element3[9]; 
    int k = 0; 
    int a = 0; 
    //selecting elements for window 3x3 
     for (int m = i -1; m < i + 2; m++) 
     { 
      for (int n = j - 1; n < j + 2; n++) 
      { 
       element3[a] = img.at<Vec3b>(m*img.cols + n); 
       a++; 
        for (int c = 0; c < img.channels(); c++) 
        { 
         element[k] += img.at<Vec3b>(m*img.cols + n)[c]; 
       } 
        k++; 
      } 
     } 
    //comparing and sorting elements in window (uchar element [9]) 
    for (int b = 0; b < end; b++) 
    { 
     int min = b; 
     for (int d = b + 1; d < 9; d++) 
     { 
      if (element[d] < element[min]) 
      { 
       min = d; 
       const uchar temp = element[b]; 
       element[b] = element[min]; 
       element[min] = temp; 
       const Vec3b temporary = element3[b]; 
       element3[b] = element3[min]; 
       element3[min] = temporary; 
      } 
     } 

    } 

// index in resultant image(after alpha-trimmed filter) 
int result = (i - 1) * (img.cols - 2) + j - 1; 
    for (int l = start ; l < end; l++) 
     img9.at<Vec3b>(result) += element3[l]; 
    img9.at<Vec3b>(result) /= (9 - alpha); 
} 
} 
namedWindow("AlphaTrimmed Filter", WINDOW_AUTOSIZE); 
imshow("AlphaTrimmed Filter", img9); 
return 0; 
} 
+0

Оставляя что в [тег: OpenCV] грифы. –

+0

Итак, у вас есть как 'element [9]', так и 'element3', причем последние жестко закодированы как' Vec3b', а затем используют 'c MSalters

ответ

0

Без фактических данных, это несколько из предположения, но uchar не может удержать сумму 3 каналов. Он работает по модулю 256 (по крайней мере, на любой платформе поддерживает OpenCV).

Правильное решение std::sort с надлежащим компаратором для вашего Vec3b:

void L1(Vec3b a, Vec3b b) { return a[0]+a[1]+a[2] < b[0]+b[1]+b[2]; }

Смежные вопросы