C++ C++;计算二维数组中可变宽度数字的平均值
我知道allready也有类似的问题,但没有一个答案能真正帮助我。 这就是我的问题:C++ C++;计算二维数组中可变宽度数字的平均值,c++,arrays,average,C++,Arrays,Average,我知道allready也有类似的问题,但没有一个答案能真正帮助我。 这就是我的问题: 我已经给出了一个512x512像素的数组。每个像素都有一个类似165.88009的值。(稍后我必须在GnuPlot中创建一个热图) 现在我想通过创建一个可变像素块(如4-16)的平均值来“平滑”它,并将其写入一个新的2D数组,然后跳转到下一个块,直到完成为止。 数组的大小应保持不变。因此,如果我平均4个像素,这4个像素将得到新值。 我为此创建了一个函数,但它不能正常工作。 计算平均数不是我的问题。问题是我希望像
我已经给出了一个512x512像素的数组。每个像素都有一个类似165.88009的值。
(稍后我必须在GnuPlot中创建一个热图)
现在我想通过创建一个可变像素块(如4-16)的平均值来“平滑”它,并将其写入一个新的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();
}
#包括
#包括
#包括
#包括
使用名称空间std;
int i,j,m,n,k;
void Average(double**Data,int-width)//在main中定义并初始化宽度
{
双和;
双平均值;
流输出;
Output.open(“gemitteltwerte.dat”,ios::out);
双**IV_矩阵=新双*[m];
对于(int i=0;i//di表示对角线索引
对于(int di=0;di
这个块是2D块吗(4=2x2,16=4x4)?你只想做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;
}
}
//int x,y是图像的尺寸
double get(double**img,int i,int j)//图像外部区域的零填充
{
如果(i=x | | j=y)
返回0;
其他的
返回img[i][j];
}
void conv(double**img,double**result,int width2)//内核是(2*width2+1)^2
{
双和;
对于(int i=0;iNo)它不是2D块。我只需要一行中4-16个像素的平均值。因此,我得到平均值,比方说4个像素,将其写入新矩阵或覆盖旧的4个像素,然后转到下一个4个像素。现在可以了。谢谢!
// 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;
}
}
// 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;
}
}
}