图像过于模糊?需要避免处理已经模糊的部分

时间:2010-04-20 21:36:59

标签: c++

我有这个功能半工作,但似乎出来的图像过于模糊。这是因为它处理已经模糊的部分,我想?

我被告知我需要将它写入新图像,但我无法弄清楚如何创建它。当我使用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;
              }
           }  
        }

2 个答案:

答案 0 :(得分:2)

您正在尝试就地执行此操作,但由于这是一个邻居操作,您将获得奇怪的结果。理想情况下,您需要单独的输入和输出图像,或者,如果您必须就地执行此操作,那么您将需要一个小的临时缓冲区(以及稍微复杂的代码)来防止在您的内核中使用修改的像素。

答案 1 :(得分:0)

这是您的算法中的一个错误,正如您似乎怀疑的那样 - 当您模糊像素(x,y)时,它会平均上方的像素,并且直接位于已经模糊的左侧,并且您想要计算原始内容的平均值。所以你需要以某种方式将旧图像处理成新图像,或类似的东西。