我将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更改为灰度的事实是否有任何区别在我读取和写入灰度图像上的像素值的方式。
非常感谢任何和所有帮助。
答案 0 :(得分:0)
您不必检查是否违反了图像/阵列边界。
你知道你的图像和内核有多大,所以你要做的就是选择有效的索引。如果您的图像宽度为200像素,则不应尝试索引x坐标&lt; 0或&gt; 199。
这是图像处理中的常见问题。通常你有两个选择。 假设我们有一个5x5内核:
根据过滤器的类型和您的应用程序,您可以选择不同的方式来创建该边距。常数值,镜像值,各种推断,......
我没有太多地研究你的计算,但是你总能找到在线高斯实现的例子,你可以参考。
我还鼓励你不要只写一个高斯滤波器。实现一个卷积,然后你可以使用任何高斯内核或其他。
另请注意,高斯滤波器是可分离的!