暗い(正確には)エンボスフィルタを実装しようとしていますが、私の問題は正方形のLena画像で使用するときです。512x512の結果が良好です。 しかし、私はそれを長方形の形をした画像に使用します。 1280x720結果がすべて乱れていますが、なぜそうですか?画像のフォーマットはRGBです。正方形以外の画像に間違った結果があります
レナ512×512(original)との良好な結果:
1280×720の画像(単に比較のためoriginalない同じサイズ)と誤った結果:24ビット画像について
暗い(正確には)エンボスフィルタを実装しようとしていますが、私の問題は正方形のLena画像で使用するときです。512x512の結果が良好です。 しかし、私はそれを長方形の形をした画像に使用します。 1280x720結果がすべて乱れていますが、なぜそうですか?画像のフォーマットはRGBです。正方形以外の画像に間違った結果があります
レナ512×512(original)との良好な結果:
1280×720の画像(単に比較のためoriginalない同じサイズ)と誤った結果:24ビット画像について
の幅であればイメージは682で、パディングが必要です。 682 * 3は4の倍数ではないからです。画像の幅を680に変更して再試行してください。バッファのオーバーフローを回避するために、fb_j < HEIGHT - 1 - FILTER_HEIGHT
とfb_i < WIDTH - 1 - FILTER_WIDTH
に
int pad = WIDTH % 4;
if(pad == 4) pad = 0;
WIDTH += pad;
変更条件:パッドに
画像行、次の式を使用。
ビットマップは上から下にスキャンされます。次のように私は次元を切り替えたときにそれが正常に動作します(しかし、私は違ったビットマップをロード)
//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;