新しく発言する EXIT インデックスへ
画像処理(色調変換)サンプル

  画像処理(色調変換)サンプル 山中和義 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


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。