// 画像処理12:メディアンフィルタ void median( Image image) { int x, y, k, m,n; int buf; Image bufimage; int val[9]; //重複して処理しないようオリジナル画像のコピーを用意する bufimage = createImage(image->height, image->width); //画像のメモリ確保・初期化 for(y = 0; y < image->height; y++){ for(x = 0; x < image->width; x++){ for(k = 0; k < 3; k++) { bufimage->pdata[y][x][k] = image->pdata[y][x][k]; //入力画像をコピーする } } } //フィルタ処理 for(y = 1; y < image->height-1; y++){ for(x = 1; x < image->width-1; x++){ for(k = 0; k < 3; k++){ //値をソート用バッファにコピー val[0] = bufimage->pdata[y-1][x-1][k]; val[1] = bufimage->pdata[y-1][x ][k]; val[2] = bufimage->pdata[y-1][x+1][k]; val[3] = bufimage->pdata[y ][x-1][k]; val[4] = bufimage->pdata[y ][x ][k]; val[5] = bufimage->pdata[y ][x+1][k]; val[6] = bufimage->pdata[y+1][x-1][k]; val[7] = bufimage->pdata[y+1][x ][k]; val[8] = bufimage->pdata[y+1][x+1][k]; //ソート for(m=0; m<8; m++) for(n=m+1; n<9; n++) if(val[m] < val[n]) { buf = val[m]; val[m] = val[n]; val[n] = (byte)buf; } //中間値(ここでは降順で並び替えた値のうち、最も中間の強度値)を代入 image->pdata[y][x][k] = (byte)(val[4]); } } } }