【问题标题】:(c++)(visual studio) Applying Gaussian Blur Filter to Grayscale Image From RGB(c++)(visual studio) 将高斯模糊滤镜应用于 RGB 的灰度图像
【发布时间】:2018-01-19 00:18:44
【问题描述】:

我将 RGB 图片转换为灰度。现在我正在尝试将高斯模糊滤镜应用于此灰度图像。这就是我最初访问图像的方式:

pDoc = GetDocument();

int iBitPerPixel = pDoc->_bmp->bitsperpixel;    // used to see if grayscale(8 bits) or RGB (24 bits)
int iWidth = pDoc->_bmp->width;
int iHeight = pDoc->_bmp->height;
BYTE *pImg = pDoc->_bmp->point;     // pointer used to point at pixels in the image
int Wp = iWidth;
const int area = iWidth * iHeight;

这是我用来将我的 RGB 图像转换为灰度的代码:

double r;           // red pixel value
double g;           // green pixel value
double b;           // blue pixel value
int gray;           // gray pixel value

// convert RGB values to grayscale at each pixel, then put in grayscale array
    for (int i = 0; i < iHeight; i++)
        for (int j = 0; j < iWidth; j++)
        {
            r = pImg[i*iWidth * 3 + j * 3 + 2];
            g = pImg[i*iWidth * 3 + j * 3 + 1];
            b = pImg[i*Wp + j * 3];

            r = static_cast<double>(r) * 0.299;
            g = static_cast<double>(g) * 0.587;
            b = static_cast<double>(b) * 0.114;

            gray = std::round(r + g + b);

            pImg[i*iWidth * 3 + j * 3 + 2] = gray;
            pImg[i*iWidth * 3 + j * 3 + 1] = gray;
            pImg[i*Wp + j * 3] = gray;

        }
}

然后这里是我尝试应用高斯模糊滤镜的地方:

// gaussian filter kernel
float gauss[3][3] = { {1, 2, 1},
{2, 4, 2},
{1, 2, 1} };

int convHeight;     // height value of convolution filter, gaussian in this case
int convWidth;      // width value of convolution filter, gaussian in this case


//////gaussian blur/////////
for (int i = 0; i < iHeight; i++) {
    for (int j = 0; j < iWidth; j++) {
        gaussPixel = 0;
        for (int x = 0; x < convHeight; x++) {
            for (int y = 0; y < convWidth; y++) {
                //gaussPixel += OldImage[x - convWidth / 2 + i, y - convHeight / 2 + j] * gauss[i, j];
            }
        }
        //NewImage[x, y] = gaussPixel;
    }
}

我的一些问题如下:1)我不确定如何为其中一个高斯模糊内核正在查看图像之外的点并因此未查看像素和 2)创建条件我从 Visual Studio 收到一条错误消息,说“访问冲突读取位置 0x....”,我认为这与问题 1 有关。另外我不知道我将图像从 RGB 更改为灰度这一事实是否有任何区别以我在灰度图像上读取和写入像素值的方式。

非常感谢任何和所有帮助。

【问题讨论】:

    标签: c++ visual-studio image-processing


    【解决方案1】:

    您不必检查是否违反了图像/数组边界。

    您知道您的映像和内核有多大,因此您所要做的就是选择有效的索引。如果您的图像宽度为 200 像素,则不应尝试索引 x 坐标 199。

    这是图像处理中的常见问题。通常你有两个选择。 假设我们有一个 5x5 内核:

    1. 您从操作中排除了输入图像的 2 像素宽边距。那么你的内核将 始终与有效像素重叠。
    2. 您将输入图像扩展了 2 像素宽边

    根据过滤器的类型和您的应用程序,您可以选择不同的方法来创建该边距。常数值、镜像值、各种推断,...

    我没有过多研究你的计算,但你总是可以在网上找到高斯实现的例子,你可以参考。

    我还鼓励您不要只编写高斯滤波器。实现一个卷积,然后您可以将其与任何高斯内核或其他内核一起使用。

    还要记住,高斯滤波器是可分离的!

    【讨论】:

    • 我编辑了我的代码,以便有一个嵌套的 for 循环用于我的高斯滤波器的卷积。但是,我从一个类似的问题中获取了注释行,我不确定如何更改他们使用具有[x,y] 坐标的图像来读取和写入像素值的方法,以改用[i*Wp + j]。你知道我将如何更改那些注释行吗?
    • 此外,这张图片是彩色的,但已更改为灰度,因此我必须更改 pImg 在[i*iWidth * 3 + j * 3 + 2][i*iWidth * 3 + j * 3 + 1] 的位置
    • 或者有没有办法将我的像素读/写方法转换为[x,y] 表单?
    • @evanhaus 您必须将 1d 图像数组复制到 2d 图像数组或编写将 x,y 坐标转换为 1d 索引的函数。
    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多