如何使高斯模糊正常工作?

时间:2015-07-01 14:07:04

标签: c++ image-processing gaussian

我正在编写一个带有3x3矩阵(内核)的高斯模糊滤镜,并使用QImage作为外部库。内核按原样计算。在初始化和计算内核之后,我将unsigned int Matrix带入程序:

typedef std::vector<std::vector<unsigned int> > uintMatrix; // For copying pixels value

在main.cpp中,它初始化为:

uintMatrix tmpPxMat(image.width(); std::vector<unsigned int> (image.height(), 0));

我将它用作模糊像素值的临时存储空间。

然后,我使用我的算法来模糊图像:

// Blur Pixels
for(int x = 0; x < image.width(); x++)
    for(int y = 0; y < image.height(); y++) {
        // To avoid edge cases don't process them, I'll fix it soon
        if(x == 0 || x == image.height()-1 || y == 0 || y == image.width()-1)
            continue;
        // 3x3 Matrix
        tmpPxMat[x][y] += kernel[0][0] * image.pixel(x-1, y-1) +
                          kernel[0][1] * image.pixel(x, y-1) +
                          kernel[0][2] * image.pixel(x+1, y-1);

        tmpPxMat[x][y] += kernel[1][0] * image.pixel(x-1, y) +
                          kernel[1][1] * image.pixel(x, y) +
                          kernel[1][2] * image.pixel(x+1, y);

        tmpPxMat[x][y] += kernel[2][0] * image.pixel(x-1, y+1) +
                          kernel[2][1] * image.pixel(x, y+1) +
                          kernel[2][2] * image.pixel(x+1, y+1);
    }

然后,我将tmpPxMat[][]的结果复制到原始图像:

// Copy blurred values to the image
for(int x = 0; x < image.width(); x++)
        for(int y = 0; y < image.height(); y++)
            image.setPixel(x, y, tmpPxMat[x][y]);

并保存:

image.save("/home/john/Pictures/blurred", "PNG", 100);

但最后我得不到我等待的结果。这就是我得到的:

之前/之后:

Origin/Blurred

很抱歉这个问题很长,但我尽可能地压缩它。

1 个答案:

答案 0 :(得分:3)

我假设uintMatrix是一个32位整数的二维数组,并且你已经将红色,绿色和蓝色通道打包到其中。

如果是这样,那就是你的问题。您需要独立模糊每个频道。