2013-12-08 60 views
0

我知道這裏已經有類似的問題,但沒有答案真的幫助我。 這是我的問題:
我給它一個512x512像素的數組。每個像素的值都是165.88009。
(I不得不以後創建在GNUPLOT熱圖)通過創建像素的可變塊的平均(如4-16)
C++計算二維數組中可變寬度數的平均值

現在我想「平滑」,並將其寫入到一個新的2D陣列和跳到下一個塊直到完成。
數組的大小應該保持不變。所以如果我平均4個像素這4個像素獲得新的價值。
我做了這個功能,但它不能正常工作。

計算平均值不是我的問題。問題是我想有一個變量像素寬度,但我不知道如何讓我的算法跳轉到下一個塊。我沒有經歷過C++,也許我必須完全不同。
因此,任何幫助或啓發是極大的讚賞:)

這裏是我的代碼:

#include <iostream>  
#include <fstream>   
#include <string>   
#include <iomanip>   
using namespace std; 

int i, j, m, n, k;  

void Average(double **Data, int width) // width gets defined and initiated in main  
{ 
    double sum;  
    double avg; 
    fstream Output; 

    Output.open("GemittelteWerte.dat", ios::out); 


    double** IV_Matrix = new double* [m]; 
    for (int i=0; i<m; i++) 
    { 
     IV_Matrix[i] = new double [n]; 
    } 

    for (int i=0; i<m; i++) 
    { 
     for (int j=0; j<n; j++) 
     { 
      IV_Matrix[i][j] = 1.0;  
     } 
    } 

    // Here start all my troubles: 
    for(int i=0; i<n; i++)     
    { 
     for(int j=0; j<n; j+=width) 
     { 
      sum = 0.0; 
      k=j; 

      for(k; k<(j+width); k++) 
      { 
       sum+=Data[i][k];  
      } 
      avg=(sum/width);    

      for (int k; k<(j+width); k++) 
      { 
       IV_Matrix[i][k] = avg;    
      } 
     } 
    } 

    for(int i=0; i<n; i++) 
    { 
     for(int j=0; j<n; j++) 
     { 
      Output<<setprecision(10)<<IV_Matrix[i][j]<<"\t"; 
     } 
     Output<<"\n"; 
    } 

    Output.close(); 
} 

回答

0

這是塊2D塊(4 = 2×2,16 = 4×4)?你只是想做一個2D卷積?然後更好地使用3x3,5x5,...內核的奇數寬度。

// int x, y are the dimensions of your image 

double get (double **img, int i, int j) // zero padding for areas outside image 
{ 
    if (i<0 || i>=x || j<0 || j>=y) 
     return 0; 
    else 
     return img[i][j]; 
} 

void conv (double **img, double **result, int width2) // kernel is (2*width2+1)^2 
{ 
    double sum; 

    for (int i=0; i<x; i++) 
     for (int j=0; j<y; j++) 
     { 
      sum = 0; 
      for (int ii=-width2; ii<=width2; ii++) 
       for (int jj=-width2; jj<=width2; jj++) 
        sum += get(img,i+ii,j+jj)/((2*width2+1)*(2*width2+1)); 
      result[i][j] = sum; 
     } 
} 

這使平滑img結果。但是,它的緩慢而沒有分離的解決方案。對於小圖像和內核沒有問題。

編輯:那麼容易:

// x, y are the dimensions of your image (x rows, y colums) 

void avg (double **img, double **result, int width) // width must be >= 1 and 
{             // should be a divider of y 
    double sum; 

    for (int i=0; i<x; i++) // process all rows 
     { 
      for (int j=0; j<y; j+=width) // jump in block width through a row 
       { 
       sum = 0.0; 

       for (int w=0; w<width; w++) // calculate average of a block 
       { 
       sum += img[i][j+w]/width; 
       } 

      for (int b=0; b<width; b++) // write average in each pixel inside block 
       { 
       result[i][j+b]= sum; 
       } 
     } 
} 
+0

沒有它不是一個2D塊。我只想要連續4-16個像素的平均值。所以,我得到的平均值,可以說4個像素,寫入一個新的矩陣或覆蓋舊的4個像素,並轉到下一個4個像素。 – user3080351

+0

@ user3080351:看我的編輯 – mb84

+0

現在工作正常。謝謝! – user3080351

0
//di means diagonal index 
for(int di = 0; di < n/width; ++di) { 

    int sum = 0.0; 

    //we sum the values 
    for(int i = di*width; i < (di+1)*width; ++i)     
    {  
     for(int j = di*width; j < (di+1)*width; ++j) 
     { 
      sum += Data[i][j]; 
     } 
    } 

    //Divide by the number of values 
    sum /= width*width; 

    //Spread the results 
    for(int i = di*width; i < (di+1)*width; ++i)     
    {  
     for(int j = di*width; j < (di+1)*width; ++j) 
     { 
      IV_Matrix[i][j]; 
     } 
    } 
} 

//n might not be a multiple of width 

if(n % width != 0) { 
    //we sum the values 
    for(int i = (n/width)*width; i < n; ++i)     
    {  
     for(int j = di*width; j < (di+1)*width; ++j) 
     { 
      sum += Data[i][j]; 
     } 
    } 

    //Divide by the number of values 
    sum /= width*width; 

    //Spread the results 
    for(int i = (n/width)*width; i < n; ++i)     
    {  
     for(int j = (n/width)*width; j < n; ++j) 
      IV_Matrix[i][j]; 
     } 
    } 
}