【问题标题】:Gaussian Blur image processing c++高斯模糊图像处理 c++
【发布时间】:2017-06-30 09:39:08
【问题描述】:

在尝试对图像实施高斯模糊后,我遇到了一个问题,即输出图像看起来像原始图像(输入图像)的多个模糊版本

我的声誉太低,无法发布图片,所以不知道如何完全向您展示正在发生的事情,但是,我可以发布图片的 gyazo 链接:

https://gyazo.com/38fbe1abd442a3167747760866584655 - 原创, https://gyazo.com/471693c49917d3d3e243ee4156f4fe12 - 输出

这是一些代码:

int kernel[3][3] = { 1, 2, 1,
                   2, 4, 2,
                   1, 2, 1 };

void guassian_blur2D(unsigned char * arr, unsigned char * result, int width, int height)
{
    for (int row = 0; row < height; row++) 
    {
        for (int col = 0; col < width; col++) 
        {
            for (int k = 0; k < 3; k++) 
            {
                result[3 * row * width + 3 * col + k] = accessPixel(arr, col, row, k, width, height);
            }
        }
    }
}

int accessPixel(unsigned char * arr, int col, int row, int k, int width, int height) 
{
    int sum = 0;
    int sumKernel = 0;

    for (int j = -1; j <= 1; j++) 
    {
        for (int i = -1; i <= 1; i++) 
        {
            if ((row + j) >= 0 && (row + j) < height && (col + i) >= 0 && (col + i) < width) 
            {
                int color = arr[(row + j) * 3 * width + (col + i) * 3 + k];
                sum += color * kernel[i + 1][j + 1];
                sumKernel += kernel[i + 1][j + 1];
            }
        }
    }

    return sum / sumKernel;
}

图像已保存:

guassian_blur2D(inputBuffer, outputBuffer, width, height);

//Save the processed image
outputImage.convertToType(FREE_IMAGE_TYPE::FIT_BITMAP);
outputImage.convertTo24Bits();
outputImage.save("appleBlur.png");
cout << "Blur Complete" << endl;

任何帮助都会很棒,如果这也有助于我尝试将图像存储为灰度以便不保存颜色。

【问题讨论】:

  • 看图很难回答。如果您尝试将图像从更高的色彩空间减少到 24 位,即使不使用高斯模糊滤镜,它也会看起来很模糊。所以我要检查的一件事是确保原始图像是 24 位的(至少要验证这不是问题)
  • 之后,您应该尝试通过查看从 k
  • 24 位转换很好,是的,很难举例,如果我被允许在这里发布一个 gyazo(现在将尝试)希望你能看到。
  • 哈。哦。完全不是我想象的那样。

标签: c++ image blur gaussian


【解决方案1】:

看起来问题不在您的模糊代码中,而与保存或访问图像数据有关。

我已经使用 OpenCV 读取/保存图像,并得到了预期的结果。这是一个sn-p:

cv::Mat3b img = cv::imread("path_to_img.png");
cv::Mat3b out = img.clone();

guassian_blur2D(img.data, out.data, img.cols, img.rows);

cv::imshow("img", img);
cv::imshow("out", out);
cv::waitKey(0);

这里是输入和输出图像:

模糊不是很明显(由于高图像分辨率和小内核),但如果你仔细观察 - 它看起来是正确的。

【讨论】:

  • 哇,好吧,我将使用 OpenCV 并看看我的表现如何,感谢您自己尝试并显示结果!真的很有帮助
猜你喜欢
  • 2013-12-16
  • 2015-11-05
  • 1970-01-01
  • 2014-02-27
  • 2012-05-02
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多