新しく発言する  EXIT  インデックスへ

画像8色化


  画像8色化 しばっち 2008/03/08 10:43:22 
  続き しばっち 2008/03/08 10:45:30 
   └続き しばっち 2008/03/08 10:46:13 
    └他のしきい値行列による組織的ディザ法 山中和義 2008/03/11 19:52:36  (修正1回)
Re: 続き  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/03/11 19:52:36 ** この記事は1回修正されてます
他のしきい値行列による組織的ディザ法



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 !ウィンドウの大きさを画像に合わせる


!16階調のしきい値行列

LET N=4 !行列の大きさ
LET lv=16 !階調

DATA 0,8,2,10 !Bayer
DATA 12,4,14,6
DATA 3,11,1,9
DATA 15,7,13,5

!DATA 13,7,6,12 !Screw(渦巻き型)
!DATA 8,1,0,5
!DATA 9,2,3,4
!DATA 14,10,11,15

!DATA 6,7,8,9
!DATA 5,0,1,10
!DATA 4,3,2,11
!DATA 15,14,13,12

!DATA 12,4,8,14 !中間調強調型
!DATA 11,0,2,6
!DATA 7,3,1,10
!DATA 15,9,5,13

!DATA 11,4,6,9 !網点型
!DATA 12,0,2,14
!DATA 7,8,10,5
!DATA 3,15,13,1


DIM pattern(N*N)
MAT READ pattern


LET d=256/lv !元の画像は256階調

FOR y=1 TO h
FOR x=1 TO w
LET c=p(x,y) !指定位置の画素を読み込む
CALL GetRGB(c, rr,gg,bb) !RGBに変換する

!---------------↓↓↓↓↓---------------
LET Threshold=(pattern(MOD(x,N)+MOD(y,N)*N+1) + 0.5) * d !画像全体にタイル貼り
IF rr>Threshold THEN LET vr=255 ELSE LET vr=0 !2値化 ※RGBそれぞれ1Bitの3Bit
IF gg>Threshold THEN LET vg=255 ELSE LET vg=0
IF bb>Threshold THEN LET vb=255 ELSE LET vb=0
!---------------↑↑↑↑↑---------------

CALL SetRGB(q,x,y, vr,vg,vb) !指定位置の画素に書き込む
NEXT x
NEXT y

MAT PLOT CELLS, IN 0,1; 1,0: q !画像を表示する

END


EXTERNAL SUB GetRGB(c, rr,gg,bb) !指定位置の画素を読み込む
LET rr=MOD(c,256) !RGBを取得する
LET cc=INT(c/256)
LET gg=MOD(cc,256)
LET bb=INT(cc/256)
END SUB

EXTERNAL SUB SetRGB(p(,),x,y, vr,vg,vb) !指定位置の画素に書き込む
LET vr=MIN(MAX(vr,0),255) !0〜255に補正する
LET vg=MIN(MAX(vg,0),255)
LET vb=MIN(MAX(vb,0),255)
LET p(x,y)=(vb*256+vg)*256+vr
END SUB



!LET N=2 !行列の大きさ
!LET lv=4 !階調

!DATA 0,2 !4階調
!DATA 3,1



!LET N=4 !行列の大きさ
!LET lv=8 !階調

!DATA 0,4,1,5 !8階調
!DATA 6,2,7,3
!DATA 1,5,0,4
!DATA 7,3,6,2

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