画像処理入門 >
拡大縮小 >
ニアレストネイバー
ニアレストネイバー
ニアレストネイバー
サンプルプログラム
プログラムはこちら
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;
}
}