新しく発言する  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回)

  画像8色化 しばっち 2008/03/08 10:43:22   ツリーへ
画像8色化  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/08 10:43:22
画像を8色にします。


RANDOMIZE
OPTION BASE 0
PUBLIC NUMERIC BIWIDTH, M2(-1 TO 1,1),M(-2 TO 2,2), LEVEL
DIM R(7), G(7), B(7)
FOR I=0 TO 7
READ G(I),R(I),B(I)
NEXT I
DATA 0,0,0
DATA 0,0,255
DATA 0,255,0
DATA 0,255,255
DATA 255,0,0
DATA 255,0,255
DATA 255,255,0
DATA 255,255,255

FILE GETNAME N$, "BMP,JPG,GIFファイル|*.BMP;*.JPG;*.GIF"
IF N$="" THEN STOP
CALL PICTURELOAD(N$,BIWIDTH,BIHEIGHT)
DIM VM(BIWIDTH,BIHEIGHT)
ASK PIXEL ARRAY(0,0) VM
INPUT PROMPT "MODE ディザ (1) ランダムディザ (2) 誤差拡散法 (3) 固定閾値法 (4) ": MODE
LET LEVEL = 128
SELECT CASE MODE
CASE 1
DIM MAT(15, 15)
RESTORE 100
FOR I = 0 TO 3
FOR J = 0 TO 3
READ MAT(I, J)
NEXT J
NEXT I
CALL MAKEMAT(MAT, 4)
CASE 2
INPUT PROMPT "度合い (1 - 255)=": HL
!'INPUT PROMPT "LEVEL (0 - 255) =": LEVEL
CASE 3
DIM BUFR(BIWIDTH - 1, 2), BUFG(BIWIDTH - 1, 2), BUFB(BIWIDTH - 1, 2)
!'INPUT PROMPT "LEVEL (0 - 255) =": LEVEL
INPUT PROMPT "MODE JARVIS(1) OR FLOYD(2) ": MD
SELECT CASE MD
CASE 1
RESTORE 10
FOR J = 0 TO 2
FOR I = -2 TO 2
READ M(I, J)
NEXT I
NEXT J
CASE 2
RESTORE 20
FOR J = 0 TO 1
FOR I = -1 TO 1
READ M2(I, J)
NEXT I
NEXT J
END SELECT
10 DATA 5,7,0,0,0
DATA 3,5,7,5,3
DATA 1,3,5,3,1

20 DATA 7,0,0
DATA 1,5,3
CASE 4
INPUT PROMPT "LEVEL (0 - 255) =": LEVEL
END SELECT
FOR Y = 0 TO BIHEIGHT - 1
FOR X = 0 TO BIWIDTH - 1
LET CC=VM(X,Y)
CALL RGB(CC,R1,G1,B1)
LET C = 0
SELECT CASE MODE
CASE 1
IF MAT(MOD(X , 16) , MOD(Y , 16))<B1 OR B1=255 THEN LET C = C + 1
IF MAT(MOD(X , 16) , MOD(Y , 16))<R1 OR R1=255 THEN LET C = C + 2
IF MAT(MOD(X , 16) , MOD(Y , 16))<G1 OR G1=255 THEN LET C = C + 4
CASE 2
LET BB = B1 + (RND - .5) * 128 + HL * (B1 / 255) ^ 4
IF BB > LEVEL THEN LET C = C + 1
LET RR = R1 + (RND - .5) * 128 + HL * (R1 / 255) ^ 4
IF RR > LEVEL THEN LET C = C + 2
LET GG = G1 + (RND - .5) * 128 + HL * (G1 / 255) ^ 4
IF GG > LEVEL THEN LET C = C + 4
  続き しばっち 2008/03/08 10:45:30   ツリーへ
Re: 画像8色化  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/08 10:45:30
続き

CASE 3
SELECT CASE MD
CASE 1
CALL ERRORDIFF(BUFB, B1, X,RV)
IF RV<>0 THEN LET C = C + 1
CALL ERRORDIFF(BUFR, R1, X,RV)
IF RV<>0 THEN LET C = C + 2
CALL ERRORDIFF(BUFG, G1, X,RV)
IF RV<>0 THEN LET C = C + 4
CASE 2
CALL ERRORDIFF2(BUFB, B1, X,RV)
IF RV<>0 THEN LET C = C + 1
CALL ERRORDIFF2(BUFR, R1, X,RV)
IF RV<>0 THEN LET C = C + 2
CALL ERRORDIFF2(BUFG, G1, X,RV)
IF RV<>0 THEN LET C = C + 4
END SELECT
CASE 4
IF B1 > LEVEL THEN LET C = C + 1
IF R1 > LEVEL THEN LET C = C + 2
IF G1 > LEVEL THEN LET C = C + 4
END SELECT
CALL PSET(X,Y,R(C),G(C),B(C))
NEXT X
NEXT Y
100 DATA 0, 8, 2, 10
DATA 12, 4, 14, 6
DATA 3, 11, 1, 9
DATA 15, 7, 13, 5

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

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

EXTERNAL SUB ERRORDIFF (ERRBUF(,), LV, X,RV)
LET S = 0
FOR J = 0 TO 2
FOR I = -2 TO 2
IF X + I >= 0 AND X + I <= BIWIDTH - 1 THEN LET S = S + ERRBUF(X + I, J) * M(I, J)
NEXT I
NEXT J
LET S = (S + 24) / 48
IF S + LV > LEVEL THEN LET RV = 255 ELSE LET RV = 0
LET ERRBUF(X, 0) = S + LV - RV
IF X = BIWIDTH - 1 THEN
FOR XX = 0 TO BIWIDTH - 1
LET ERRBUF(XX, 2) = ERRBUF(XX, 1)
LET ERRBUF(XX, 1) = ERRBUF(XX, 0)
NEXT XX
END IF
END SUB

EXTERNAL SUB ERRORDIFF2 (ERRBUF(,), LV, X,RV)
LET S = 0
FOR J = 0 TO 1
FOR I = -1 TO 1
IF X + I >= 0 AND X + I <= BIWIDTH - 1 THEN LET S = S + ERRBUF(X + I, J) * M2(I, J)
NEXT I
NEXT J
LET S = (S + 8) / 16
IF S + LV > LEVEL THEN LET RV = 255 ELSE LET RV = 0
LET ERRBUF(X, 0) = S + LV - RV
IF X = BIWIDTH - 1 THEN
FOR XX = 0 TO BIWIDTH - 1
SWAP ERRBUF(XX, 1), ERRBUF(XX, 0)
NEXT XX
END IF
END SUB

EXTERNAL SUB MAKEMAT (MAT(,), N)
OPTION BASE 0
DIM DX(N * N), DY(N * N)
FOR J = 0 TO N - 1
FOR I = 0 TO N - 1
LET C = MAT(I, J)
LET DX(C) = I
LET DY(C) = J
NEXT I
NEXT J
LET COUNT = 0
FOR J = 0 TO N * N - 1
FOR I = 0 TO N * N - 1
LET X = N * DX(I) + DX(J)
LET Y = N * DY(I) + DY(J)
LET MAT(X, Y) = COUNT
LET COUNT = COUNT + 1
NEXT I
NEXT J
END SUB
   └続き しばっち 2008/03/08 10:46:13   ツリーへ
Re: 続き  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/08 10:46:13
続き


EXTERNAL SUB RGB(X,R,G,B)
LET B=MOD(INT(X/65536),256)
LET G=MOD(INT(X/256),256)
LET R=MOD(X,256)
END SUB

EXTERNAL SUB GETPOINT(X,Y,R,G,B)
ASK PIXEL VALUE (X,Y) C
CALL RGB(C,R,G,B)
END SUB

EXTERNAL SUB PSET(X,Y,R,G,B)
SET COLOR COLORINDEX(R/255,G/255,B/255)
PLOT POINTS: X , Y
END SUB

EXTERNAL SUB PICTURELOAD(N$,XSIZE,YSIZE)
CLEAR
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
GLOAD N$
LET XSIZE=PIXELX(1)
LET YSIZE=PIXELY(1)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
END SUB
    └他のしきい値行列による組織的ディザ法 山中和義 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
新規発言を反映させるにはブラウザの更新ボタンを押してください。