2016-10-18 47 views
1

我正在嘗試在openCV庫中製作一個alphatrimmed過濾器。我的代碼無法正常工作,並且所得圖像在過濾後看起來不像圖像。 過濾器應該按照以下方式工作。Alpha修剪過濾器故障

  1. 在我的例子中使用一些(陣列)像素時,它是9像素的'3x3'窗口。
  2. 以增加的方式排列它們。
  3. 切割我們的'陣列'雙方爲alpha-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',然後當你知道它必須是3時使用'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]; }