他のしきい値行列による組織的ディザ法
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
|