我有这个功能半工作,但似乎出来的图像过于模糊。这是因为它处理已经模糊的部分,我想?
我被告知我需要将它写入新图像,但我无法弄清楚如何创建它。当我使用Image tempImage构造函数时,我遇到了分段错误的错误,无法确定原因。在此函数之前,有一个函数scaleUp
可以使图像变大并将其保存到newImage.pixelData
,由构造函数Image newImage(width*numTimes, height*numTimes, colorMode);
void Image::simpleBlur(int numPixels)
{
int middlePixX, middlePixY, redSum, greenSum, blueSum, denominator = 0;
//Image tempImage(width, height, colorMode);
//tempImage.createImage(width, height);
for (int middlePixX = 0; middlePixX < width; middlePixX++)
{
for (int middlePixY = 0; middlePixY < height; middlePixY++)
{
for (int x_subgrid = -1*numPixels; x_subgrid <= numPixels; x_subgrid++) //for (int x_subgrid = 0; x_subgrid < DIM_SQUARE; x_subgrid++)
{
for (int y_subgrid = -1*numPixels; y_subgrid <= numPixels; y_subgrid++) //for (int y_subgrid = 0; y_subgrid < DIM_SQUARE; y_subgrid++)
{
int xPos = x_subgrid + middlePixX;
int yPos = y_subgrid + middlePixY;
if( xPos >= 0 && xPos < width && yPos >= 0 && yPos < height )
{
redSum = redSum + pixelData[xPos][yPos].getRed();
greenSum = greenSum + pixelData[xPos][yPos].getGreen();
blueSum = blueSum + pixelData[xPos][yPos].getBlue();
denominator++;
}
}
}
redSum = redSum / denominator;
greenSum = greenSum / denominator;
blueSum = blueSum / denominator;
pixelData[middlePixX][middlePixY].setRed(redSum);
pixelData[middlePixX][middlePixY].setGreen(greenSum);
pixelData[middlePixX][middlePixY].setBlue(blueSum);
redSum, greenSum, blueSum = 0; denominator = 0;
}
}
}
答案 0 :(得分:2)
您正在尝试就地执行此操作,但由于这是一个邻居操作,您将获得奇怪的结果。理想情况下,您需要单独的输入和输出图像,或者,如果您必须就地执行此操作,那么您将需要一个小的临时缓冲区(以及稍微复杂的代码)来防止在您的内核中使用修改的像素。
答案 1 :(得分:0)
这是您的算法中的一个错误,正如您似乎怀疑的那样 - 当您模糊像素(x,y)时,它会平均上方的像素,并且直接位于已经模糊的左侧,并且您想要计算原始内容的平均值。所以你需要以某种方式将旧图像处理成新图像,或类似的东西。