画像処理(色調変換)サンプル 山中和義 2006/02/21 17:57:31 ├画像処理(空間フィルタ)サンプル 山中和義 2006/02/21 18:13:14 └画像処理(ヒストグラム)サンプル 山中和義 2006/02/22 20:11:46
画像処理(色調変換)サンプル 山中和義 2006/02/21 17:57:31 ツリーへ
画像処理(色調変換)サンプル |
返事を書く |
山中和義 2006/02/21 17:57:31 | |
SET COLOR MODE "NATIVE" GLOAD "c:\BASICw32\SAMPLE\ZENKOUJI.JPG" !画像を読み込む ASK PIXEL SIZE (0,0; 1,1) w,h !画像の縦横の大きさ(ピクセル単位)を調べる DIM p(w,h),q(w,h) !画像の大きさに対応する配列要素を用意する ASK PIXEL ARRAY (0,1) p !画像の各点の色情報を配列に格納する PRINT "画像の大きさ 縦:";h;" 横:";w SET BITMAP SIZE w,h !ウィンドウの大きさを画像に合わせる FOR y=1 TO h FOR x=1 TO w !---------------↓↓↓↓↓--------------- LET c=p(x,y) !指定位置の画素を読み込む LET rr=MOD(c,256) !RGBを取得する LET c=INT(c/256) LET gg=MOD(c,256) LET bb=INT(c/256) CALL effect(rr,gg,bb, vr,vg,vb) !変換する !CALL effect3(rr,gg, vr,vg,vb,bb, 64,192) !CALL effect5(rr,gg,bb, vr,vg,vb, 128) !---------------↑↑↑↑↑--------------- LET vr=MIN(MAX(vr,0),255) !0〜255に補正する LET vg=MIN(MAX(vg,0),255) LET vb=MIN(MAX(vb,0),255) !PRINT vr;vg;vb LET q(x,y)=vr+(vg+vb*256)*256 NEXT x NEXT y MAT PLOT CELLS, IN 0,1; 1,0 :q !画像を表示する SUB effect(rr,gg,bb, vr,vg,vb) !ポスタリゼーション 4階調 LET vr=eff_sub(rr) LET vg=eff_sub(gg) LET vb=eff_sub(bb) END SUB FUNCTION eff_sub(rr) IF rr<64 THEN LET v=0 ELSE IF rr<128 THEN LET v=85 ELSE IF rr<192 THEN LET v=170 ELSE LET v=255 END IF END IF END IF LET eff_sub=v END FUNCTION SUB effect2(rr,gg,bb, vr,vg,vb) !ネガティブ LET vr=255-rr LET vg=255-gg LET vb=255-bb END SUB SUB effect3(rr,gg,bb, vr,vg,vb, p1,p2) !線形補間 LET vr=INT((p2-p1)*rr/255)+p1 LET vg=INT((p2-p1)*gg/255)+p1 LET vb=INT((p2-p1)*bb/255)+p1 END SUB SUB effect4(rr,gg,bb, vr,vg,vb) !グレイスケール(NTSC係数による加重平均法) LET vr=INT(0.298912*rr + 0.586611*gg + 0.114478*bb) LET vg=vr LET vb=vr END SUB SUB effect5(rr,gg,bb, vr,vg,vb, s) !ソラリゼーション LET vr=rr LET vg=gg LET vb=bb IF rr>s THEN LET vr=255-rr IF gg>s THEN LET vg=255-gg IF bb>s THEN LET vb=255-bb END SUB END |
├画像処理(空間フィルタ)サンプル 山中和義 2006/02/21 18:13:14 ツリーへ
Re: 画像処理(色調変換)サンプル |
返事を書く |
山中和義 2006/02/21 18:13:14 | |
画像処理(空間フィルタ)サンプル SET COLOR MODE "NATIVE" GLOAD "c:\BASICw32\SAMPLE\ZENKOUJI.JPG" !画像を読み込む ASK PIXEL SIZE (0,0; 1,1) w,h !画像の縦横の大きさ(ピクセル単位)を調べる DIM p(w,h),q(w,h) !画像の大きさに対応する配列要素を用意する ASK PIXEL ARRAY (0,1) p !画像の各点の色情報を配列に格納する PRINT "画像の大きさ 縦:";h;" 横:";w SET BITMAP SIZE w,h !ウィンドウの大きさを画像に合わせる DIM rr(9),gg(9),bb(9) DIM m(9) !マスクパターン DATA 0,0,0 !エンボス DATA -1,0,1 DATA 0,0,0 MAT READ m FOR y=1 TO h FOR x=1 TO w !---------------↓↓↓↓↓--------------- FOR dy=-1 TO 1 !近傍画素の色情報を取得する FOR dx=-1 TO 1 LET xx=MIN(MAX(x+dx,1),w) !1〜wに補正する LET yy=MIN(MAX(y+dy,1),h) !1〜h LET c=p(xx,yy) !指定位置の画素を読み込む LET ff=(dy+1)*3+(dx+1)+1 LET rr(ff)=MOD(c,256) !RGBを取得する LET c=INT(c/256) LET gg(ff)=MOD(c,256) LET bb(ff)=INT(c/256) !PRINT dy;dx;ff,rr(ff);gg(ff);bb(ff) NEXT dx NEXT dy LET vr=DOT(m,rr) !マスクをかける Xo=ΣMiXi LET vg=DOT(m,gg) LET vb=DOT(m,bb) LET vr=INT(vr/4)+128 !@の部分 LET vg=INT(vg/4)+128 LET vb=INT(vb/4)+128 !---------------↑↑↑↑↑--------------- LET vr=MIN(MAX(vr,0),255) !0〜255に補正する LET vg=MIN(MAX(vg,0),255) LET vb=MIN(MAX(vb,0),255) !PRINT vr;vg;vb LET q(x,y)=vr+(vg+vb*256)*256 NEXT x NEXT y MAT PLOT CELLS, IN 0,1; 1,0 :q !画像を表示する END !●単純平滑化 ! マスクパターン ! 1,1,1 ! 1,1,1 ! 1,1,1 ! @の部分 ! LET vr=INT(vr/9) ! LET vg=INT(vg/9) ! LET vb=INT(vb/9) ! !●加重平均平滑化 ! マスクパターン ! 1,1,1 ! 1,4,1 ! 1,1,1 ! @の部分 ! LET vr=INT(vr/12) ! LET vg=INT(vg/12) ! LET vb=INT(vb/12) ! !●エッジ抽出 ! マスクパターン ! 0,-1,0 ! -1,1,1 ! 0,1,0 ! @の部分 ! なし ! !●先鋭化 ! マスクパターン ! 0,-1,0 ! -1,5,-1 ! 0,-1,0 ! @の部分 ! なし ! |
└画像処理(ヒストグラム)サンプル 山中和義 2006/02/22 20:11:46 ツリーへ
Re: 画像処理(色調変換)サンプル |
返事を書く |
山中和義 2006/02/22 20:11:46 | |
画像処理(ヒストグラム)サンプル SET COLOR MODE "NATIVE" GLOAD "c:\BASICw32\SAMPLE\ZENKOUJI.JPG" !画像を読み込む ASK PIXEL SIZE (0,0; 1,1) w,h !画像の縦横の大きさ(ピクセル単位)を調べる DIM p(w,h),q(w,h) !画像の大きさに対応する配列要素を用意する ASK PIXEL ARRAY (0,1) p !画像の各点の色情報を配列に格納する PRINT "画像の大きさ 縦:";h;" 横:";w SET BITMAP SIZE w,h !ウィンドウの大きさを画像に合わせる FOR y=1 TO h FOR x=1 TO w LET c=p(x,y) !指定位置の画素を読み込む LET vr=MOD(c,256) !RGBを取得する LET c=INT(c/256) LET vg=MOD(c,256) LET vb=INT(c/256) !---------------↓↓↓↓↓--------------- DIM Hr(0 TO 255),Hg(0 TO 255),Hb(0 TO 255) LET Hr(vr)=Hr(vr)+1 !頻度を記録する IF Rmax<Hr(vr) THEN LET Rmax=Hr(vr) !最大値を記憶する LET Hg(vg)=Hg(vg)+1 IF Gmax<Hg(vg) THEN LET Gmax=Hg(vg) LET Hb(vb)=Hb(vb)+1 IF Bmax<Hb(vb) THEN LET Bmax=Hb(vb) !---------------↑↑↑↑↑--------------- NEXT x NEXT y SET BITMAP SIZE w,h+150 !表示領域を加味する SET WINDOW 0,w,0,h+150 !ドット換算に切り替える DRAW plot_hist WITH SHIFT(10,20) !ヒストグラムを描く PICTURE plot_hist !ヒストグラムを描く ※座標値はドット単位 LET ph=0.9*(150-20) !目盛りを除いた部分の高さ SET LINE COLOR COLORINDEX(0,0,0) PLOT LINES: 255,0; 0,0; 0,ph !軸を描く PLOT LINES: 0,0; 0,-5 !原点を描く PLOT TEXT ,AT 0,-20: STR$(0) FOR i=1 TO 4 PLOT LINES: 64*i,0; 64*i,-5 !目盛りを描く PLOT TEXT ,AT 64*i,-20: STR$(64*i-1) !値を描く NEXT i CALL plot_sub(COLORINDEX(1,0,0),Hr,ph/Rmax) !赤成分 CALL plot_sub(COLORINDEX(0,1,0),Hg,ph/Gmax) !緑成分 CALL plot_sub(COLORINDEX(0,0,1),Hb,ph/Bmax) !青成分 END PICTURE SUB plot_sub(c,h(),a) SET LINE COLOR c PLOT LINES: 0,h(0)*a; FOR i=1 TO 254 PLOT LINES: i,h(i)*a; NEXT i PLOT LINES: 255,h(255)*a END SUB END |