前エントリの続き。よりよく量子化を理解する為に、4階調に量子化する時のしきい値をちょっとずつズラせる with processing
前エントリでは、カメラでキャプチャして量子化して輪郭抽出をした。量子化はビット演算で4段階にしたけど、もうちょっと細かい調整をしてみたくなったので。
(量子化の調整を上手くやれば、輪郭抽出の精度も上がるし)
■技術的なこと
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;icolorpix=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();
}
この調子で、動的に輪郭抽出できるのも作る予定。