画像処理及び画像計測関数


画面中のピクセルカラーを座標を指定して取得する:getPixelColor
getPixelColor(n,x,y,R,G,B)

メインウィンドウの任意のn個の座標のピクセルカラーを取得し、一次元配列変数R(k),G(k),B(k)に格納します。
座標は一次元配列変数x(k),y(k)で指定します。
各ピクセルカラーは濃度0〜1の値になります。

#-----------------------------サンプルコード
nax=256
dim x(nax),y(nax),r(nax),g(nax),b(nax)
for i=1 to nax
x(i)=i
y(i)=100
next
getPixelColor(nax,x,y,r,g,b)
for i=2 to nax
RGBForeColor(1,0,0)
MoveTo(x(i-1),y(i-1)-r(i-1)*50):LineTo(x(i),y(i)-r(i)*50)
RGBForeColor(0,1,0)
MoveTo(x(i-1),y(i-1)-g(i-1)*50):LineTo(x(i),y(i)-g(i)*50)
RGBForeColor(0,0,1)
MoveTo(x(i-1),y(i-1)-b(i-1)*50):LineTo(x(i),y(i)-b(i)*50)
RGBForeColor(0.5,0.5,0.5)
MoveTo(x(i-1),y(i-1)):LineTo(x(i),y(i))
next


#-----------------------------結果



PICT変数中のピクセルカラーを座標を指定して取得する:getPixelColorFromPictVar
getPixelColorFromPictVar(mypict,n,x,y,R,G,B)

PICT変数mypictから任意のn個の座標のピクセルカラーを取得し、一次元配列変数R(k),G(k),B(k)に格納します。
座標は一次元配列変数x(k),y(k)で指定します。
各ピクセルカラーは濃度0〜1の値になります。


#-----------------------------サンプルコード
# (set2DLatとの併用による鳥瞰図の作成)

#----------pictデータの読み込みとサイズの取得
pict mypict
openPictFile("cloud.pict",mypict)
getPictVarSize(mypict,ix,iy)
#
nx=150
ny=int(nx/ix*iy)
nax=nx*ny
#
dim z(nx,ny)
dim px(nax),py(nax)
dim r(nax),g(nax),b(nax)
#----------px,pyにmypictの色を読みとる座標を設定
k=0
for i=1 to nx
for j=1 to ny
k=k+1
px(k)=i/nx*ix
py(k)=j/ny*iy
next:next
#----------ピクセルカラーr,g,bの取得
getPixelColorFromPictVar(mypict,nax,px,py,r,g,b)
#----------ピクセルカラーr,g,bの平均値をset2DLatのz座標に設定
k=0
for i=1 to nx
for j=1 to ny
k=k+1
z(i,j)=(r(k)+g(k)+b(k))/3*(nx*0.3)
next:next
#----------鳥瞰図の作成
set2DLat(nx,ny,z)



#-----------------------------結果


元画像


鳥瞰図作成結果



PICT変数の反転:mirrorPict
mirrorPict(mypict,imode)

PICT変数mypictを反転し、鏡像を作成します。
反転方法はimodeで指定します。
imode=1:左右反転
imode=2:上下反転
imode=3:上下、左右反転

#-----------------------------サンプルコード
pict mypict
openPictFile("golden.pict",mypict)
mirrorPict(mypict,2)
drawPict(mypict,100,100)
#-----------------------------結果



PICT変数のグレー化:grayFilter
grayFilter(mypict)

PICT変数mypictをグレースケール画像に変換します。

#-----------------------------サンプルコード
pict mypict
openPictFile("golden.pict",mypict)
grayFilter(mypict)
drawPict(mypict,100,100)
#-----------------------------結果



PICT変数の加算、減算、乗算及び除算:calcFilter
calcFilter(mypict1,mypict2,imode,clevel1,clevel2,ix,iy)

2つのPICT変数mypict1とmypict2の四則演算を行い、結果をmypict1に代入します。
演算は、各画素に係数clevel1及びclevel2を乗じた値をimodeで指定した演算方法で計算します。
imodeの定義は以下の通りです。
imode=1:加算
imode=2:減算
imode=3:積算
imode=4:除算
また、mypict1とmypict2の相対位置をix,iyで指定できます。
mypict1及びmypict2の座標(x,y)の赤色濃度をr1(x,y)、r2(x,y)とすると、演算は以下のように行われます。(加算の場合)

r1(x,y)=clevel1*r1(x,y)+clevel2*r2(x+ix,y+iy)

計算後のPICT変数mypict1のサイズはmypict2のサイズ及び相対位置に関わらず変化しません。

#-----------------------------サンプルコード
pict mypict1
pict mypict2
openPictFile("macos.pict",mypict1)
openPictFile("golden.pict",mypict2)
calcFilter(mypict1,mypict2,1,1,0.7,-100,70)
drawPict(mypict1,100,100)
#-----------------------------結果



PICT変数のマスク(クロマキー)指定演算:calcMascFilter
calcMascFilter(mypict1,mypict2,mypict3,imode,ix2,iy2,ix3,iy3)

2つのPICT変数mypict1とmypict2を、マスク画像mypict3を用いて演算します。
演算方法はcalcFilterと同様に、imodeで指定します。演算結果も同様にmypict1に代入されます。

calcFilterでは演算時の濃度に一定値を使用しましたが、calcMaskFilterではmypict3の濃度分布を利用します。
mypict1及びmypict2の座標(x,y)の赤色濃度をr1(x,y)、r2(x,y)、mypict3の画素濃度をc(x,y)とすると、演算は以下のように行われます。(加算の場合)

r1(x,y)=(1-c(x+ix3,y+iy3))*r1(x,y)+c(x+ix3,y+iy3)*r2(x+ix2,y+iy2)

ここで(ix2,iy2)及び(ix3,iy3)はそれぞれmypict2,mypict3のmypict1に対する相対位置です。
すなわち、mypict3の白色部分に対応する位置がmypict2の画像で置き換えられ、黒色部分にmypict1の画像が残ります。
グレーの部分は濃度に応じて合成されます。
計算後のPICT変数mypict1のサイズはmypict2のサイズ及び相対位置に関わらず変化しません。

#-----------------------------サンプルコード
pict mypict1
pict mypict2
pict mypict3

openPictFile("macos.pict",mypict1)
openPictFile("golden.pict",mypict2)
openPictFile("goldenMask.pict",mypict3)
drawPict(mypict1,0,0)
drawPict(mypict2,256,0)
drawPict(mypict3,0,192)

calcFilter(mypict1,mypict3,2,1,0.2,-90,85)
calcMaskFilter(mypict1,mypict2,mypict3,1,-100,70,-100,70)
drawPict(mypict1,256,192)


#-----------------------------結果


右上:背景画像(mypict1)、左上:前景画像(mypict2)
右下:マスク画像(mypict3)、左下:画像合成結果
※花の影はcalcFilterでmypict1からmypict3を減算(ソースコード12行目)



PICT変数の色指定によるクロマキーの生成:makeChromakey
makeChromakey(mypict,r,g,b,s1,s2,h1,h2)

PICT変数mypictから色域を指定してクロマキーを作成します。
色域を指定するには、まずRGBで着目色を決め、次に色相、彩度で範囲を指定します。
色相、彩度とは輝度と共にRGBの代わりに人の感覚に近い光の3属性で色を表現しようとしたもので、RGBとの関係は以下の式で表されます。

y=0.3r+0.59g+0.11b ←輝度(0〜1)
c1=r-y
c2=b-y
s=sqrt(c1^2+c2^2)  ←彩度(0〜1)
h=atan(c1/c2)    ←色相(deg)

この式に基づいて作成したカラーマップが下図左です。この図において、彩度は中心からの半径、色相は角度で表されます。


左:色相及び彩度に基づくカラーマップ  右:色域指定パラメータs1,s2,h1,h2の定義

makeChromakeyでは、色域指定のため彩度s1,s2及び色相範囲h1,h2を指定します。
上図右に示すように、PICT変数mypictはr,g,bで指定した着目色を中心に、色相幅h1以内、彩度s2以上の領域が濃度0に、色相h2を越え、彩度s1以下の領域が濃度1に変換されます。
h1〜h2及びs1〜s2の範囲に含まれる領域は色相、彩度に応じたグレーとなます。

#-----------------------------サンプルコード
#花弁の色:r=0.98,g=0.45,b=0.01
#彩度、色相範囲:s1=0.1,s2=0.3,h1=40°,h2=60°
pict mypict
openPictFile("golden.pict",mypict)
makeChromakey(mypict,0.98,0.45,0.01,0.1,0.3,40,60)
drawPict(mypict,100,100)


#-----------------------------結果



PICT変数の色毎の減色/増色処理:RGBFilter
RGBFilter(mypict,cr,cg,cb)

PICT変数mypictの色毎の減色/増色処理を行います。
引き数cr,cb,cgには各r,g,b濃度へかける倍数を指定します。

#-----------------------------サンプルコード
pict mypict
openPictFile("golden.pict",mypict)
#------赤色以外の濃度を全て0にする
RGBFilter(mypict,1,0,0)
drawPict(mypict,100,100)


#-----------------------------結果



PICT変数の濃度変換曲線による濃度変換処理:toneCurveFilter
toneCurveFilter(mypict,n,x,y)

濃度の入力レベルとと出力レベルの関係を示す濃度変換曲線を用いて、PICT変数mypictの濃度変換処理を行います。
入力レベル及び出力レベルはそれぞれ一次元配列x(k)及びy(k)、(kは1〜n)で指定します。x,yの範囲は0〜1です。データ数nの数に制限はありません。
また、濃度変換曲線はステップ状の値を取ることもできますので、画像の二値化などの諧調化や、ネガポジ反転、特定濃度領域の抽出/消去を行うことも可能です。
その他のサンプルのページを参照

#-----------------------------サンプルコード
pict mypict
openPictFile("golden.pict",mypict)
n=21
dim x(n),y(n)

FrameRect(10,100,111,201)
g=2.2 #γ=2.2
MoveTo(10,200)
for i=1 to n
x(i)=((i-1)/(n-1))^2
y(i)=x(i)^(1/g) #ガンマ曲線の作成
LineTo(x(i)*100+10,200-y(i)*100)
next
toneCurveFilter(mypict,n,x,y)
drawPict(mypict,115,10)


#-----------------------------結果


ガンマ曲線による濃度補正結果(γ=2.2)

#-----------------------------
その他のサンプル



PICT変数の局所フィルタ処理:localFilter
localFilter(mypict,n,filter)

PICT変数mypictにn×nサイズのフィルタ変数filter(k,k)を用いた局所フィルタ処理を実行します。
nは奇数を指定する必要があります。
その他のサンプル

#-----------------------------サンプルコード
pict mypict
openPictFile("golden.pict",mypict)
#------赤色以外の濃度を全て0にする
RGBFilter(mypict,1,0,0)
drawPict(mypict,100,100)


#-----------------------------結果


平滑化(ぼかし)フィルタの実行結果



PICT変数の「明るさの最大値」フィルタ処理:maximumFilter
maximumFilter(mypict,n)

PICT変数mypictを明るさの最大値で平滑化します。
「明るさの最大値」フィルタでは、注目画素の色をn×n近傍で最も明るい色に置き換え、平滑化後は全体的に明るい画像になります。
nは奇数を指定する必要があります。

#-----------------------------サンプルコード
pict mypict
openPictFile("golden.pict",mypict)
maximumFilter(mypict,5)
drawPict(mypict,100,100)


#-----------------------------結果




PICT変数のメディアン(明るさの中央値)フィルタ処理:medianFilter
medianFilter(mypict,n)

PICT変数mypictを明るさの中央値で平滑化します。
メディアンフィルタでは、注目画素の色をn×n近傍の明るさの中央値で置き換えます。
nは奇数を指定する必要があります。

#-----------------------------サンプルコード
pict mypict
openPictFile("golden.pict",mypict)
medianFilter(mypict,5)
drawPict(mypict,100,100)


#-----------------------------結果




PICT変数の「明るさの最小値」フィルタ処理:minimumFilter
minimumFilter(mypict,n)

PICT変数mypictを明るさの最小値で平滑化します。
「明るさの最小値」フィルタでは、注目画素の色をn×n近傍で最も暗い色に置き換え、平滑化後は全体的に暗い画像になります。
nは奇数を指定する必要があります。

#-----------------------------サンプルコード
pict mypict
openPictFile("golden.pict",mypict)
minimumFilter(mypict,5)
drawPict(mypict,100,100)


#-----------------------------結果




PICT変数の孤立点除去:cutIsolation
cutIsolation(mypict,imode1,clevel,imode2)

2値化画像mypictの1ピクセルの孤立点(ノイズ)除去を行います。
濃度のしきい値clevelを超える画素を白、clevelに満たない濃度の画素を黒と定義し、孤立点を隣接点濃度の平均値で埋めます。
孤立点の定義として、4点近傍または8点近傍の選択、白点除去及び黒点除去の選択が可能です。
imode1=1:4点近傍(上下左右)の孤立点除去
imode1=2:8点近傍の孤立点除去
imode2=1:白点除去
imode2=2:黒点除去
imode2=3:白点と黒点の両方を除去



#-----------------------------サンプルコード
pict mypict
openPictFile("golden_bw.pict",mypict)
cutIsolation(mypict,1,0.5,1)
drawPict(mypict,100,100)

#-----------------------------結果


元画像


4点近傍の孤立点除去結果



PICT変数の微小/巨大粒子除去:cutResion
cutResion(mypict,imode1,size,clevel,imode2,imode3)

2値化画像mypictの1ピクセルの微小/巨大粒子除去を行います。
微小粒子除去はノイズ除去に、巨大粒子は背景画像除去などに利用できます。
濃度のしきい値clevelを超える画素を白、clevelに満たない濃度の画素を黒と定義し、sizeで指定したピクセルサイズ以下/以上の微小/巨大粒子を削除します。
粒子の定義として、4点連結または8点連結の選択、白点除去及び黒点除去の選択が可能です。
imode1=1:微小粒子除去
imode1=2:巨大粒子除去
imode2=1:白点除去
imode2=2:黒点除去
imode2=3:白点と黒点の両方を除去
imode3=1:4連結の領域設定
imode3=2:8連結の領域設定



#-----------------------------サンプルコード

#-----------------------------結果



PICT変数の領域膨張/収縮処理:pixelExpansion
pixelExpansion(mypict,imode1,clevel,imode2,n)

2値化画像mypictの領域膨張/収縮処理を行います。
領域を一旦膨張し、収縮することにより微小粒子や細線除去、輪郭のスムージングを行うことが出来ます。
濃度のしきい値clevelを超える画素を白、clevelに満たない濃度の画素を黒と定義し、領域の膨張/収縮処理をnで指定した回数分繰り返します。
粒子の定義として、4点連結または8点連結の選択が可能です。
imode1=1:4連結の領域設定
imode1=2:8連結の領域設定
imode2=1:白点膨張(=黒点収縮)
imode2=2:黒点膨張(=白点収縮)



#-----------------------------サンプルコード

#-----------------------------結果



PICT変数からの領域抽出及び形状測定:getResionSiz
getResionSiz(mypict,clevel,imode1,imode2,n,size)

2値化画像mypictの白色/黒色領域の形状測定を行います。
抽出した全ての白色/黒色領域に対し、領域数n及び形状データsizeが返されます。
sizeは領域数×18(以上)の2次元配列変数として指定します。関数から返される形状データは以下の通りです。
数値はいずれもピクセル単位です。

size(i, 1):中心x座標 cx
size(i, 2):中心y座標 cy
size(i, 3):重心x座標 gx
size(i, 4):重心y座標 gy
size(i, 5):面積
size(i, 6):絶対最大長 l
size(i, 7):水平方向最大長 b
size(i, 8):水平方向最大長起点x座標 bx
size(i, 9):水平方向最大長起点y座標 by
size(i,10):垂直方向最大長 h
size(i,11):垂直方向最大長起点x座標 hx
size(i,12):垂直方向最大長起点y座標 hy
size(i,13):水平フェレ長 bf
size(i,14):垂直フェレ長 hf
size(i,15):パターン方向 thi_l(絶対最大長に基づく、角度[deg])
size(i,16):パターン方向起点x座標 lx
size(i,17):パターン方向起点y座標 ly
size(i,18):主軸方向(角度[deg])thi_g


領域は濃度のしきい値clevelを超える画素を白、clevelに満たない濃度の画素を黒と定義し、imode1で白点測定/黒点測定の選択を、imode2で4点連結/8点連結の選択を行います。
imode1=1:白点測定
imode1=2:黒点測定
imode2=1:4連結の領域設定
imode2=2:8連結の領域設定


#-----------------------------サンプルコード

#-----------------------------結果



PICT変数からの領域抽出及び形状測定、形状データの取得:getResionPat
getResionPat(mypict,clevel,imode1,imode2,n,size,n_run,xy_run,n_line,xy_line)

getResionPatのと同様の形状測定結果に加えて各領域の形状(ランデータ)及び輪郭座標を返します。
第一引数mypict〜第六引数sizeまでの内容はgetResionSizと同じです。
n_run及びxy_runに形状データ(ラン)を、n_line及びxy_lineに輪郭を返します。

・ラン
二値化画像の記憶容量を縮小するために領域を水平線の集合体と見なし、各水平線の始点(左側)と終点(右側)座標のみを記憶するとき、この水平線をランと呼びます。


getResionPatでは、抽出した領域の全てのランを二次元配列変数n_run及びxy_runに返します。
ここで、領域数をn、画像全体のランの総数をkとすると、n_run及びxy_runは

dim n_run(n,2),xy_run(k,3)

で宣言します。(第二引数はそれぞれ2及び3を超えていても構いません。)
このとき、getResionPatから返されるデータの内訳は以下のようになります。

n_run(i,1) :領域iのランの開始番号
n_run(i,2) :領域iのランの終了番号
xy_run(j,1):ランjの起点x座標
xy_run(j,2):ランjの起点y座標
xy_run(j,3):ランjの終点x座標

領域iのランを全て表示するアルゴリズムは以下のようになります。

for j=n_run(i,1) to n_run(i,2)
MoveTo(xy_run(j,1),xy_run(j,2))
LineTo(xy_run(j,3),xy_run(j,2))
next

配列のサイズが抽出された領域数よりも小さかった場合、配列の最大値を超えるランは無視されます。

・輪郭線
抽出された領域の外側輪郭線及び内側輪郭線を二次元配列変数n_line及びxy_lineに返します。
getResionPatでは、輪郭線を領域の輪郭を形成するピクセル群で表現し、初めに外側輪郭線を反時計回りに、次に内側輪郭線を時計回りに整列した点列の集合として返します。

ここで、領域数をn、画像全体で輪郭を形成する全てのピクセルの総数をkとすると、n_line及びxy_lineは

dim n_line(n,2),xy_line(k,2)

で宣言します。(第二引数はそれぞれ2を超えていても構いません。)
このとき、getResionPatから返されるデータの内訳は以下のようになります。

n_line(i,1) :領域iの輪郭線の開始番号
n_line(i,2) :領域iの輪郭線の終了番号
xy_line(j,1):輪郭線を構成するピクセルjのx座標
xy_line(j,2):輪郭線を構成するピクセルjのy座標

ここで、輪郭線の終点の次の座標には必ず(-1,-1)が与えられます。すなわち、n_lineは最低でも輪郭を構成するピクセル数+1が与えられます。
xy_lineには初めに外側輪郭線が入り、j 領域iの輪郭を全て表示するアルゴリズムは以下のようになります。

for j=n_line(i,1) to n_line(i,2)
if xy_line(j,1)=-1 then goto *label01 MoveTo(xy_line(j,1),xy_line(j,2))
LineTo(xy_line(j,1),xy_line(j,2))
*label01
next

配列のサイズが抽出された領域数よりも小さかった場合、配列の最大値を超える輪郭は無視されます。



#-----------------------------サンプルコード

#-----------------------------結果



PICT変数から等高線を生成:makePictConter
makePictConter(mypict,n,level,r,g,b)

pict変数mypictの濃度に基づく等高線を作成します。
等高線の本数、濃度及び描画色はユーザーによる指定が可能で、それぞれn及び一次元配列変数level(n),r(n),g(n),b(n)で指定します。
濃度値levelは0.0〜1.0の範囲で指定します。
等高線の描画結果はmypictに、setPictTransparentColorで定義した背景色の上に描かれた「等高線のみ」が返され、元画像は消去されます。後で元画像と併せて表示したい場合は元画像を保存しておく必要があります。

#-----------------------------サンプルコード

setPictTransparentFlug(1)
setPictTransparentColor(1,1,1)
cls

pict mypict1
pict mypict2
print "start program..."
openPictFile("conter.pict",mypict1)

n=20
dim level(n),r(n),g(n),b(n)

for i=1 to n
level(i)=i/n
#---------------------等高線の色を黒に設定
r(i)=0:g(i)=0:b(i)=0
next i
#---------------------濃度0.5の等高線を赤に設定
r(n/2)=1.0
#---------------------
copyPict(mypict1,mypict2)
makePictConter(mypict2,n,level,r,g,b)
#---------------------元画像を表示
drawPict(mypict1,0,0)
#---------------------元画像の上に等高線を表示
drawPict(mypict2,0,0)


#-----------------------------結果


元画像


元画像+等高線作成結果



PICT変数からカラーコントアを生成:makePictColorConter
makePictColorConter(mypict,levelMin,levelMax)

pict変数mypictから濃度の下限値levelMin及び上限値levelMaxを指定してカラーコントアを作成します。

#-----------------------------サンプルコード
pict mypict
openPictFile("contour.pict",mypict)

makePictColorConter(mypict,0.2,0.8)
drawPict(mypict,0,0)


#-----------------------------結果(元画像はmakePictConterで使用したもの)




PICT変数から鳥瞰図を生成:birdsView
birdsView(shadepict,viewpict,outpict,ix,iy,cLow,cHigh,iHigh,zoom,xOfs,yOfs,ig,shadow,r,g,b,steep)

濃淡定義画像shedepict及び描画用画像viewpictからRotateBoxの角度を使用して鳥瞰図outpictを作成します。
birdsViewの各引数の定義は以下の通りです。

shadepict:濃淡定義PICT
viewpict :描画用PICT
outpict :出力用PICT
ix :出力用PICTサイズ X
iy :出力用PICTサイズ Y
cLow :濃度下限
cHigh :濃度上限
iHigh :鳥瞰図高さ(倍率1の時の高さをピクセルサイズで指定)
zoom :鳥瞰図倍率
xOfs :Xオフセット
yOfs :Yオフセット
ig :ワイヤーフレーム描画間隔
shadow :陰影レベル
r,g,b :背景色
steep :急勾配の非表示パラメータ

各変数の定義は以下の通りです。

・濃淡定義PICT、描画用PICT
birdsViewは濃淡定義PICT変数shadepictの各画素の濃度情報を高さ情報に置き換え、ビットマップデータを三次元表示します。
このときの高さへの変換方法は、着目画素の濃度をcとすると、倍率が1のとき

高さ(ピクセル単位)=(c-clow)/(cHigh-cLow)*iHigh

で表現されます。
濃淡定義PICTは高さ情報を定義し、実際の描画には描画用PICTの内容を使用します。
濃淡定義PICTと描画用PICTのサイズが異なる場合、描画サイズには濃淡定義用PICTのものを使用し、描画用PICTは拡大/縮小されて描画されます。
鳥瞰図の表示角度はメインウィンドウのrotateBoxの角度に従います。
PP Basicの実行前にrotateBoxで角度を調整しておくか、BASICプログラム内でrot_xdef(thi)、rot_ydef(thi)などのコマンドでrotateBoxを必要な角度に回転させてからbirdsViewを呼び出してください。

・出力用PICT
出力用PICTには必ず空のPICTファイルを指定します。
一度PICTデータを納めたPICT変数の場合、必ずkillPictで画像を破棄してから使用してください。
出力用PICTファイルの画像サイズはix,iyで指定します。
描画された鳥瞰図は、基本的に鳥瞰図の中心位置と出力用PICTファイルの中心位置が一致するように位置調整されます。
画像の中心点を変更するには(xOfs,yOfs)でオフセット量を指定し、さらにzoomで倍率を変更することが出来ます。
鳥瞰図の背景色は(r,g,b)で指定できます。


・ワイヤーフレーム表示
鳥瞰図に一定間隔のワイヤーフレームを追加します。
ワイヤーフレーム間隔は濃淡画像のピクセル間隔igで指定します。
ig>0のときは、濃淡画像の元座標系におけるx方向へワイヤーフレームを描画します。 ig<0のときは、同じくy方向へワイヤーフレームを描画します。
ig=0のときは、ワイヤーフレームを描画しません。


・簡易シェーディング
鳥瞰図のx方向にシェーディング処理を施します。
シェーディングレベルshadowを大きくすると影が濃くなり、0にするとシェーディング無しになります。


・透過色を非表示にする
birdsViewではsetPictTransparentColor文及びsetPictTransparentFlug文の設定に従って濃淡画像の透過色部分を非表示にすることが出来ます。
透過色は、指定した濃度の±5%以内の範囲とします。


・濃度変化が大きいピクセルを非表示にする
濃度がステップ状に変化する場合など、勾配が大きい斜面を非表示にします。
steepは濃淡画像中の隣り合う濃度の最大値を指定します。
steep=0の場合、全ての斜面を表示します。


3次元グラフィックのPICTファイルの三次元表示の項も御参照ください。

#-----------------------------サンプルコード
pict shadepict
pict viewpict
pict outpict

openPictFile("cloud2.pict",shadepict)
copyPict(shadepict,viewpict)

#--------------------rotateBoxの回転
rot_set_default
rot_xdef(30)
rot_zdef(30)

zoom=0.8
setPictTransparentFlug(1)
birdsView(shadepict,viewpict,outpict,500,400,0,1,200,zoom,0,30,0,10,0,0,0,0)
drawPict(outpict,0,0)



#-----------------------------結果


濃淡画像


鳥瞰図作成結果



PICT変数及び粒子座標からパーティクル画像を生成:particlePicture
particlePicture(particlePict,outPict,ix,iy,n,vx,vy,vc1,vc2)

n個の座標(vx,vy)にPICT変数particlePictを書き込み、結果をPICT変数outpictへ格納します。

particlePictは元の画像濃度をvc1倍した値を、背景画像をvc2倍した領域に重ね書きします。 重ね書きは実数で演算されますので、大量の粒子の重ね書きを行う場合に精度良い結果を得ることが出来ます。
粒子座標vx,vy、粒子濃度vc1及び背景濃度vc2は各粒子に対して一次元配列で宣言します。
粒子描画用PICTの描画位置は粒子座標vx,vyがPICTの左上隅になるよう配置されます。また、setPictTransparentColor及びsetPictTransparentFlugの設定に従って透過色を非表示にすることができます。

#-----------------------------サンプルコード1
pict particlePict
pict outpict
openPictFile("cloud_s.pict",particlePict)

#----------------------画像サイズ設定
ix=250:iy=150
disposeGworld
createGworld(ix,iy)
setGworld

#----------------------粒子数設定及び配列宣言
n=11
dim vx(n),vy(n),vc1(n),vc2(n)


#----------------------粒子座標及び濃度設定
for i=1 to n
vx(i)=(i-1)/n*(ix-20)
vy(i)=(i-1-(n-1)/2)^2/(n/2)^2*(iy-30)
vc1(i)=.1*i
vc2(i)=1
next

#----------------------出力画像作成
particlePicture(particlePict,outpict,ix,iy,n,vx,vy,vc1,vc2)
drawPict(outpict,0,0)
flushMainWin



#-----------------------------結果



粒子画像


パーティクル画像作成結果


#-----------------------------サンプルコード2

#-----------------------------結果



particlePictureの高機能版:particlePicture2
particlePicture2(pict01,pict02,pict03,pict04,pict05,pict06,pict07,pict08,pict09,pict10,outpict,ix,iy,n,vx,vy,pid,vr,vg,vb,vc2)

particlePicture2はparticlePictureの機能に以下の機能を追加したものです。
・粒子描画用PICT変数を10種類指定可能
・各粒子毎に濃度倍率をRGB毎に指定可能
粒子描画用PICTファイルは粒子毎に配列変数pidで1〜10の番号で指定します。


#-----------------------------サンプルコード1

#-----------------------------結果


#-----------------------------サンプルコード2

#-----------------------------結果