我有一个成功读取ppm的rgb值的函数和一个成功写入ppm的函数。我正在尝试的是一个名为denoiseImage的函数,它使用平均滤波来改变rgb值,其中框架窗口大小为n乘n,其中n为奇数。我的目的是遍历每个像素,将其用作围绕它的窗口n和n的中心点。然后我取每种颜色的平均值(r,g,b)并除以窗口中的像素数,并将这些新值分配给窗口中每个像素的rgb。但是,我无法对帧不完全适合像素的情况进行检查(例如,帧中心点是右上角像素,3x3的窗口将进入不存在的点。)当它出现时不完全适合,我打算使用适合的可用像素,取而代之的是这些数字的平均值。到目前为止,我的代码仅适用于框架完全适合的情况。我的功能:
RGB *denoiseImage(int width, int height, const RGB *image, int n)
{
int firstPos, lastPos, i = 0, j = 0, k, numofPix;
int sumR=0,sumG=0,sumB=0;
numofPix = (width * height);
RGB *pixels = malloc(numofPix * sizeof(RGB));
if (n == 1) //Case where the window size is 1 and therefore the image does not get changed.
{
return pixels;
}
for (j=0;j < numofPix;j++)
{
firstPos = (j - width) - ((n - 1)/2);
lastPos = (j + width) + ((n - 1)/2);
//Need to check boundary cases to prevent segmentation fault
for (k=firstPos;k<=lastPos;k++) //Seg fault. Unable to shrink frame to compensate for cases where the frame does not fit.
{
sumR+=image[k].r;
sumG+=image[k].g;
sumB+=image[k].b;
i++;
if (i = n) //Used to skip elements not in frame
{
j += (width-n);
i = 0;
}
}
sumR = sumR/(n*n); //Calculating mean values
sumG = sumG/(n*n);
sumB = sumB/(n*n);
for (k=firstPos;k<=lastPos;k++) //Assigning the RGB values with the new mean values.
{
pixels[k].r=sumR;
pixels[k].g=sumG;
pixels[k].b=sumB;
printf("%d %d %d ",pixels[k].r, pixels[k].g, pixels[k].b);
}
}
return pixels;
}
int main()
{
RGB *RGBValues;
int width, height, max;
int j = 0,testemp=3; //test temp is a sample frame size
char *testfile = "test.ppm";
char *testfile2 = "makeme.ppm";
RGBValues = readPPM(testfile, &width, &height, &max); //Function reads values from a ppm file correctly
RGBValues = denoiseImage(width,height, RGBValues, testemp,testing);
writePPM(testfile2,width,height,max,RGBValues); //Function writes values to a ppm file correctly
}
我如何实现检查框架是否适合的方法?
答案 0 :(得分:1)
这是一个很好的问题,幸运的是在图像处理社区中。 在2D过滤时,边缘的处理方式总是不同。
查看它的一种方法是在2D中扩展空间并使用中间的外推值填充边缘。
例如,您可以查看http://www.librow.com/articles/article-1并搜索媒体过滤器。
我相信你很快就会找到解决方案,因为你正朝着正确的方向前进。