非方形图像的错误结果
Wrong result for non square image
我正在尝试实现暗(不完全)浮雕过滤器,我的问题是当我在 SQUARED Lena 图像 512x512 上使用它时结果很好。
但是当我在具有矩形形状的图像上使用它时,例如1280x720 结果全乱了,为什么会这样?图片格式为RGB。
Lena 512x512 (original) 的良好结果:
1280x720 图像的错误结果(original 大小不同只是为了比较):
对于24bit的图片,如果图片的宽度是682那么需要padding。因为682*3不是4的倍数,把图片宽度改成680再试试
要填充图像行,请使用以下公式:
int pad = WIDTH % 4;
if(pad == 4) pad = 0;
WIDTH += pad;
将条件更改为fb_j < HEIGHT - 1 - FILTER_HEIGHT
和fb_i < WIDTH - 1 - FILTER_WIDTH
以避免缓冲区溢出。
位图从上到下扫描。当我如下切换尺寸时它工作正常(但我以不同方式加载位图)
//Pixel frame_buffer[WIDTH][HEIGHT];
//Pixel temp_buffer[WIDTH][HEIGHT];
Pixel frame_buffer[HEIGHT][WIDTH];
Pixel temp_buffer[HEIGHT][WIDTH];
...
for(int fb_j = 1; fb_j < HEIGHT - 1 - FILTER_HEIGHT; fb_j++) {
for(int fb_i = 1; fb_i < WIDTH - 1 - FILTER_WIDTH; fb_i++) {
float r = 0, g = 0, b = 0;
for(int ker_i = 0; ker_i < FILTER_WIDTH; ker_i++) {
for(int ker_j = 0; ker_j < FILTER_HEIGHT; ker_j++) {
r += ((float)(frame_buffer[fb_j + ker_j][fb_i + ker_i].r / 255.0) * emboss_kernel[ker_j][ker_i]);
g += ((float)(frame_buffer[fb_j + ker_j][fb_i + ker_i].g / 255.0) * emboss_kernel[ker_j][ker_i]);
b += ((float)(frame_buffer[fb_j + ker_j][fb_i + ker_i].b / 255.0) * emboss_kernel[ker_j][ker_i]);
}
}
if(r > 1.0) r = 1.0;
else if(r < 0) r = 0;
if(g > 1.0) g = 1.0;
else if(g < 0) g = 0;
if(b > 1.0) b = 1.0;
else if(b < 0) b = 0;
// Output buffer which will be rendered after convolution
temp_buffer[fb_j][fb_i].r = (GLubyte)(r*255.0);
temp_buffer[fb_j][fb_i].g = (GLubyte)(g*255.0);
temp_buffer[fb_j][fb_i].b = (GLubyte)(b*255.0);
}
}
也可以尝试 运行 直接复制进行测试。示例:
temp_buffer[fb_j][fb_i].r = frame_buffer[fb_j][fb_i].r;
temp_buffer[fb_j][fb_i].g = frame_buffer[fb_j][fb_i].g;
temp_buffer[fb_j][fb_i].b = frame_buffer[fb_j][fb_i].b;
我正在尝试实现暗(不完全)浮雕过滤器,我的问题是当我在 SQUARED Lena 图像 512x512 上使用它时结果很好。 但是当我在具有矩形形状的图像上使用它时,例如1280x720 结果全乱了,为什么会这样?图片格式为RGB。
Lena 512x512 (original) 的良好结果:
1280x720 图像的错误结果(original 大小不同只是为了比较):
对于24bit的图片,如果图片的宽度是682那么需要padding。因为682*3不是4的倍数,把图片宽度改成680再试试
要填充图像行,请使用以下公式:
int pad = WIDTH % 4;
if(pad == 4) pad = 0;
WIDTH += pad;
将条件更改为fb_j < HEIGHT - 1 - FILTER_HEIGHT
和fb_i < WIDTH - 1 - FILTER_WIDTH
以避免缓冲区溢出。
位图从上到下扫描。当我如下切换尺寸时它工作正常(但我以不同方式加载位图)
//Pixel frame_buffer[WIDTH][HEIGHT];
//Pixel temp_buffer[WIDTH][HEIGHT];
Pixel frame_buffer[HEIGHT][WIDTH];
Pixel temp_buffer[HEIGHT][WIDTH];
...
for(int fb_j = 1; fb_j < HEIGHT - 1 - FILTER_HEIGHT; fb_j++) {
for(int fb_i = 1; fb_i < WIDTH - 1 - FILTER_WIDTH; fb_i++) {
float r = 0, g = 0, b = 0;
for(int ker_i = 0; ker_i < FILTER_WIDTH; ker_i++) {
for(int ker_j = 0; ker_j < FILTER_HEIGHT; ker_j++) {
r += ((float)(frame_buffer[fb_j + ker_j][fb_i + ker_i].r / 255.0) * emboss_kernel[ker_j][ker_i]);
g += ((float)(frame_buffer[fb_j + ker_j][fb_i + ker_i].g / 255.0) * emboss_kernel[ker_j][ker_i]);
b += ((float)(frame_buffer[fb_j + ker_j][fb_i + ker_i].b / 255.0) * emboss_kernel[ker_j][ker_i]);
}
}
if(r > 1.0) r = 1.0;
else if(r < 0) r = 0;
if(g > 1.0) g = 1.0;
else if(g < 0) g = 0;
if(b > 1.0) b = 1.0;
else if(b < 0) b = 0;
// Output buffer which will be rendered after convolution
temp_buffer[fb_j][fb_i].r = (GLubyte)(r*255.0);
temp_buffer[fb_j][fb_i].g = (GLubyte)(g*255.0);
temp_buffer[fb_j][fb_i].b = (GLubyte)(b*255.0);
}
}
也可以尝试 运行 直接复制进行测试。示例:
temp_buffer[fb_j][fb_i].r = frame_buffer[fb_j][fb_i].r;
temp_buffer[fb_j][fb_i].g = frame_buffer[fb_j][fb_i].g;
temp_buffer[fb_j][fb_i].b = frame_buffer[fb_j][fb_i].b;