前エントリの続き。よりよく量子化を理解する為に、4階調に量子化する時のしきい値をちょっとずつズラせる with processing

前エントリでは、カメラでキャプチャして量子化して輪郭抽出をした。量子化はビット演算で4段階にしたけど、もうちょっと細かい調整をしてみたくなったので。

(量子化の調整を上手くやれば、輪郭抽出の精度も上がるし)

■実行結果

『量子化 217,64,55』

量子化 217,64,55

『量子化 192,128,64』

量子化 192,128,64

『量子化 255,212,75』

量子化 255,212,75

■技術的なこと

3つの閾値(4段階に分けるので)はキーボードのa, s, dで減少、q, w, eで増加する。

普通にimgを1ピクセル毎に比較して、img_resultを1ピクセルずつ作成して描画する。

Source Code (Processing 0124 Beta) and Image Files

PImageimg,img_result;

floatr_ratio=0.299;//RGB比合計して1

floatg_ratio=0.587;

floatb_ratio=0.114;

intlevel0=192;//量子化の閾値

intlevel1=128;

intlevel2=64;

voidsetup(){

img=loadImage(“pileus-s.jpg”);

size(img.width*2,img.height);

image(img,0,0);

quant();

}

voiddraw(){

}

voidquant(){

img_result=newPImage(img.width,img.height);

//4段階に量子化

floatlevel;

for(inti=0;i colorpix=img.pixels[i];

floatmed=(int)(r_ratio*red(pix)+g_ratio*green(pix)+b_ratio*blue(pix));

if(med>level0)level=256;

elseif(med>level1)level=192;

elseif(med>level2)level=128;

elselevel=64;

img_result.pixels[i]=color(level);

}

image(img_result,img.width,0);//表示

}

voidkeyPressed(){

//量子化閾値の調整

if(‘A’<=key&&key<='z'){

switch(key){

case’a’:

if(level0>level1)level0–;

break;

case’q’:

if(level0<255)level0++;

break;

case’s’:

if(level1>level2)level1–;

break;

case’w’:

if(level1
break;

case’d’:

if(level2>0)level2–;

break;

case’e’:

if(level2
break;

}

}

println(“量子化閾値:”+level0+”,”+level1+”,”+level2);

quant();

}

この調子で、動的に輪郭抽出できるのも作る予定。