画像処理入門 > 拡大縮小 > ニアレストネイバー

ニアレストネイバー


ニアレストネイバー
ニアレストネイバーのプログラムです。

サンプルプログラム
プログラムはこちら void NearestNeighbor(unsigned char *out, unsigned char *in, int inHeight, int inWidth, int inChannel, double mag){ int height; int width; int outStep; int inStep; int i, j; height = (int)((double)inHeight * mag); width = (int)((double)inWidth * mag); // OpenCVで使用する画像データの横幅は4バイト区切りのため調整 inStep = inWidth * inChannel; if( (inStep % 4) != 0){ inStep = inStep + (4 - inStep %4); } outStep = width * inChannel; if( (outStep % 4) != 0){ outStep = outStep + (4 - outStep %4); } // ループ中にif文を書くと遅いためループ前にビット数の条件分岐 switch(inChannel){ case 1: // 8bit画像 for(i = 0; i < height; ++i){ for(j = 0; j < width; ++j){ out[i * outStep + j] = in[(int)((double)i/mag) * inStep + (int)((double)j/mag)]; } } break; case 3: // 24bit画像 for(i = 0; i < height; ++i){ for(j = 0; j < width; ++j){ out[i * outStep + j * 3] = in[(int)((double)i/mag) * inStep + (int)((double)j/mag) * 3]; out[i * outStep + j * 3 + 1] = in[(int)((double)i/mag) * inStep + (int)((double)j/mag) * 3 + 1]; out[i * outStep + j * 3 + 2] = in[(int)((double)i/mag) * inStep + (int)((double)j/mag) * 3 + 2]; } } break; case 4: // 32bit画像 for(i = 0; i < height; ++i){ for(j = 0; j < width; ++j){ out[i * outStep + j * 4] = in[(int)((double)i/mag) * inStep + (int)((double)j/mag) * 4]; out[i * outStep + j * 4 + 1] = in[(int)((double)i/mag) * inStep + (int)((double)j/mag) * 4 + 1]; out[i * outStep + j * 4 + 2] = in[(int)((double)i/mag) * inStep + (int)((double)j/mag) * 4 + 2]; out[i * outStep + j * 4 + 3] = in[(int)((double)i/mag) * inStep + (int)((double)j/mag) * 4 + 3]; } } break; default: break; } }