Subsections

画像処理

画像処理の諸機能は,"vision/piximage"ファイルに格納されている。 画像データを表現するために2つのクラス pixel-imagecolor-pixel-imageが定義されている。 ルックアップテーブル(LUT)を用いたピクセル(pixel)毎の変換, エッジ抽出,pbmファイルへの画像データの変換が実現されている。

ルックアップテーブル (LUT)

LUTは,ピクセル(pixel)データを変換するためのベクトルデータである。



make-equilevel-lut levels &optional (size 256) [関数]

1次元の整数ベクトル(integer-vector)を返す。 そのベクトルは,0からsizeまでの値を0からlevelsまでの値に 線形的にマップする。 例えば,(make-equilevel-lut 3 12)は, #i(0 0 0 0 1 1 1 1 2 2 2 2)を返す。


look-up src dest lut [関数]

ルックアップテーブルlutを用いてsrcベクトルをdestベクトルに 値を変換して置き換える。 もしdestベクトルがNILのときは, srcベクトルと同じクラスで同じサイズのベクトルを作る。 例えば, (look-up #i(1 2 3) nil #(10 20 30 40 50))は, #i(20 30 40)を返す。


look-up2 src dest lut1 lut2 [関数]

look-up2は、ルックアップテーブルlut1およびlut2を連続的に使用して srcベクトルをdestベクトルに変換する。 srcとdestは、同じサイズの整数ベクトルあるいはバイトベクトル(文字列)である。


look-up* src dest luts [関数]

lutsは,ルックアップテーブルのリストである。 lutsから与えられるルックアップテーブルを連続的に使用して, srcベクトルをdestベクトルに変換する。


concatenate-lut lut1 lut2 &optional (size 256) [関数]

2つのルックアップテーブルlut1lut2をつないだ 新しいルックアップテーブルを返す。その新しいテーブルを使用することは, lut1lut2を連続的に使用することと同じである。


make-colors default-color-map [関数]

以下に示すデフォルトのカラーマップを作る。


*x-gray32-lut* [変数]

デフォルトカラーマップx:*colormap* に定義されている32階調のグレースケールのLUTである。 (aref *x-gray32-lut* n)は,32階調の内のn番目のグレー階調を返す。


*x-gray16-lut* [変数]

デフォルトカラーマップx:*colormap* に定義されている16階調のグレースケールのLUTである。


*x-color-lut* [変数]

デフォルトカラーマップx:*colormap* に定義されている幾つかの鮮明なカラーのLUTである。 登録されているカラーは, "black", "red", "green", "lightblue", "yellow", "orange", "blue", "magenta", "white"である。


*256to8* [変数]

0..255の範囲の整数を0..7の範囲に変換する256入力のLUTである。 その階調は,線形にマップされている。


*256to16* [変数]

0..255の範囲の整数を0..15の範囲に変換する256入力のLUTである。 その階調は,線形にマップされている。


*256to32* [変数]

0..255の範囲の整数を0..31の範囲に変換する256入力のLUTである。 その階調は,線形にマップされている。


*gray32* [変数]

グレースケールピクセルをXのカラーマップに変換するための256入力のLUTである。 これは、*256to32**x-gray32-lut*を連結して作られる。 グレー32階調のXwindowの表示可能なピクセル画像は*gray32*によって グレー256階調の画像を変換することにより得ることができる。


*rainbow32* [変数]

256階調のhue値をXのレインボーカラーマップに変換する ための256入力のLUTである。 これは、*256to32**x-rainbow32-lut*を連結して作られる。


ピクセル画像

1枚の画像データは、pixel-imageクラスで表現される。pixel-imageは、 バイト型データを要素とする2次元配列である。それぞれのデータの内容は、 アプリケーションに依存している。一般的にピクセルの明るさを表現するために 使われるが、エッジ輝度や微分方向やカラー輝度やbarグラフのようなものにも用いることができる。




pixel-image [クラス]


  :super   array 

:slots xpicture display-lut histogram
brightness-distribution0
brightness-distribution1
brightness-covariance


pixel-imageは、xwindowへの表示機能を持つ2次元の行列である。 pixelの変換は、display-lutによって実現され、 その結果の画像はxpictureに蓄積される。 主な軸は縦方向にとる。(x,y)imgのピクセルは (aref img y x)でアクセスすることができる。


:width [メソッド]

ピクセル画像の横サイズを返す。


:height [メソッド]

ピクセル画像の縦サイズを返す。


:size [メソッド]

配列の大きさを返す。


:transpose &optional (result (instance (class self) :init dim0 dim1)) [メソッド]

x軸とy軸を交換する。


:map-picture lut &optional (result (send self :duplicate)) [メソッド]

この画像をlutで変換し、その画像データをresultに蓄積する。


:map fn &optional (result (send self :duplicate)) [メソッド]

この画像のすべてのピクセルにfnを適用して、 resultのピクセルに置く。


:brightest-pixel [メソッド]

この画像の一番明るいピクセル値を見つける。


:darkest-pixel [メソッド]

この画像の一番暗いピクセル値を見つける。


:average-pixel [メソッド]

この画像のすべてのピクセルの平均輝度を計算する。


:halve &optional simage [メソッド]

半分の大きさの画像に縮小したピクセル画像を返す。


:subimage x y subwidth subheight [メソッド]

この画像に(x,y)を左上角とし、幅がsubwidthで高さがsubheight である四角形を切り出す。 その画像の原点は(x,y)に置かれる。 :subimageは、この四角形で囲まれた画像を表現するピクセル画像を作る。


:xpicture &optional lut [メソッド]

この画像をlutを用いて変換し、xpictureに設定する。


:display-lut &optional newlut [メソッド]

display-lutにルックアップテーブルnewlutを設定する。 その後、このルックアップテーブルを用いて画像を変換し、 xpictureに設定する。


:display (xwin geometry:*viewsurface*) [メソッド]

:putimageを用いてxwinで指定されるXwindowにこの画像を 表示する。 それぞれのピクセル値はXのカラーマップを参照する。 希望する表現を得るためには、このピクセル画像を固有のLUTで 変換すべきである。


:duplicate [メソッド]

この画像オブジェクトと同じ幅と高さを持つ同じクラスの インスタンスを作る。ピクセルデータはコピーされない。


:copy-from src [メソッド]

srcで指定される他の画像からピクセルデータをコピーする。 srcとこの画像は同一の次元でなければならない。


:hex &optional (x 0) (y 0) (w 16) (h 16) (strm t) [メソッド]

四角領域で示されるピクセルデータを16進数フォーマットで表示する。


:hex1 &optional (x 0) (y 0) (w 64) (h 16) (strm t) [メソッド]

四角領域で示されるピクセルデータを16進数フォーマットで表示する。


:prin1 strm &rest msg [メソッド]

このピクセル画像を名前と次元とともに表示する。


:init w h &optional imgvec [メソッド]

w、高さhを持つピクセル画像を初期化する。


:amplify rate &optional (result (send self :duplicate) [メソッド]

rateをそれぞれのピクセル値に掛ける。


:compress-gray-scale levels &optional result &aux pict2 [メソッド]

この画像のピクセル値を0からlevelsまでの範囲に変換をし、 その変換された画像を返す。


:lut lut1 &optional (result (send self :duplicate)) [メソッド]

ルックアップテーブルlut1を用いてこの画像を変換し、 その変換された画像を返す。


:lut2 lut1 lut2 &optional (result (send self :duplicate)) [メソッド]

lut1lut2を連結したルックアップテーブルを用いてこの画像を 変換し、その変換された画像を返す。


:histogram [メソッド]

この画像のそれぞれのピクセル値の発生回数を数え、そのヒストグラム を整数ベクトル表現で返す。


:brightness-distribution [メソッド]

明るさの分散を返す。


:optimum-threshold [メソッド]

この画像の明るさの分散値が最大となっている階調を返す。


:project-x [メソッド]

同じx座標のピクセル値をすべて加算し、これらの値のベクトルを返す。


:project-y [メソッド]

同じy座標のピクセル値をすべて加算し、これらの値のベクトルを返す。


:digitize threshold &optional (val0 0) (val1 255) result [メソッド]

thresholdを用いてこの画像をval0val1の2値画像に 変換する。


:and img2 [メソッド]

この画像とimg2のビット論理積をとり、処理した画像を返す。


:plot min max &optional color viewsurface [メソッド]

minmaxの間の値を持つピクセルをすべてcolor(gc) でviewsurfaceにプロットする。



:edge1   [メソッド] 

&optional (method 1)
(th1 *edge-intensity-threshold*) (th2 *weak-edge-threshold*)
(run *edge-length-threshold*)
(win geometry:*viewsurface*) (edgeimg1)
この画像のエッジを抽出し、Xwindow上にエッジ画像を表示する。


カラーピクセル画像

カラー画像は、color-pixel-imageクラスで表現される。 このクラスは、3つのpixel-imageを持っており、RGB表現の red,green,blueあるいはHLSモデルの色合い,明るさ,濃さをそれぞれ表現する。 RGBとHLS間の変換もサポートしている。


color-pixel-image [クラス]


  :super   propertied-object 

:slots width height component1 component2 component3


3つのpixel-imageオブジェクトでカラー画像を表現する。


:width [メソッド]

この画像の幅を返す。


:height [メソッド]

この画像の高さを返す。


:size [メソッド]

この画像の幅$ \times$高さを返す。


:red [メソッド]

component1を返す。


:green [メソッド]

component2を返す。


:blue [メソッド]

component3を返す。


:hue [メソッド]

component1を返す。 色合い(hue)の値(0〜360)は、0〜255の1バイトで表現される。


:lightness [メソッド]

component2を返す。 正規化された明るさ(brightness)の値(0〜1)は、0〜255の整数で表現される。


:saturation [メソッド]

component3返す。 正規化された濃さ(saturation)の値(0〜1)は、0〜255の整数で表現される。


:pixel x y [メソッド]

(x,y)における component1,component2,component3の値を3つの整数のリストとして返す。 このリストは、RGB値あるいはHLS値のどちらでも解釈できる。


:monochromize &optional (NTSC nil) [メソッド]

RGB構成から明るさを計算し、新しいpixel-imageを返す。 もし、NTSCがNILなら、(R+G+B)/3が計算される。 もし、Tなら、0.299*R+0.587*G+0.114*Bが計算される。


:HLS [メソッド]

この画像をRGB画像と仮定し、HLS表現に画像を変換する。 それぞれのピクセルを変換するためにRGB2HLSを呼び出す。


:RGB [メソッド]

この画像をHLS画像と仮定し、RGB表現に画像を変換する。 それぞれのピクセルを変換するためにHLS2RGBを呼び出す。


:halve [メソッド]

この画像を半分のサイズに縮小したcolor-pixel-imageを返す。


:display &optional (win *color-viewer*) [メソッド]

:putimageを用いてwinで指定されるXwindowに このカラー画像を表示する。 それぞれのピクセル値はXのカラーマップを参照する。 希望する表現を得るためには、この画像を固有のLUTで 変換すべきである。


:display-lut &optional (newlut1) (newlut2 newlut1) (newlut3 newlut2) [メソッド]

ルックアップテーブルnewlut1,newlut2,newlut3display-lutにそれぞれ設定する。それから、このルックアップテーブルを 使ってこの画像を変換し、xpictureに設定する。



:edge1   [メソッド] 

&optional (method 1)
(th1 *edge-intensity-threshold*) (th2 *weak-edge-threshold*)
(run *edge-length-threshold*) (win *color-viewer*)
この画像のエッジを抽出する。Xwindow上にこのエッジ画像を表示する。


:hex &optional (x 0) (y 0) (w 16) (h 16) (strm t) [メソッド]

四角領域で指定されるピクセルデータを16進数フォーマットで表示する。


:hex1 &optional (x 0) (y 0) (w 64) (h 16) (strm t) [メソッド]

四角領域で指定されるピクセルデータを16進数フォーマットで表示する。


:prin1 strm &rest msg [メソッド]

この画像を名前と次元と一緒に表示する。


:init width height &optional r g b [メソッド]

カラー画像のサイズを定義し、pixel-imageにそれぞれカラーの1構成 を割り当てる。


ppmファイルがあったとき、次のプログラムでカラー値を画像に展開し、 Xwindowに表示をすることができる。

(setq ppmimg (read-pnm "xxx.ppm"))
(send ppmimg :hls)   ; RGB to HLS conversion
(make-ximage (send ppmimg :hue) *rainbow32*)

エッジ抽出

エッジ抽出機能は、"vision/edge/edge"に実現されている。




edge1   [関数] 

img &optional (method 1)
(th1 *edge-intensity-threshold*)
(th2 *weak-edge-threshold*)
(run *edge-length-threshold*)
result
&aux (width (send img :width)) (height (send img :height))
imgのエッジピクセルを抽出する。 edge1は、まずすべてのピクセルに微分オペレータを適用する。 次の3つの微分オペレータが用意されている。 grad3は、縦と横の隣接ピクセルの差を用いる。 prewittは、grad3に斜め方向のピクセルを考慮したものである。 sobelは、prewittにおいて横と縦のピクセルに重みを付けて差を計算したものを用いる。 methodが0,1のときgrad3、2のときprewitt、3のとき sobelを選択する。 th1より大きな輝度を持つエッジピクセルが強いエッジピクセルとして 指示される。 薄いエッジはエッジの輝度と微分方向を参照した後、独立したピクセルに付けられる。 これらの強いエッジの端から、強いエッジの方向に含まれる弱いエッジを捜し、 線分を延長する。 th2より大きなエッジ輝度を持つ弱いエッジは、無条件に繋げられる。 また、th2より小さなエッジ輝度を持つかなり弱いエッジは、他のエッジ との距離がrun以内であれば繋げられる。 edge1は、強いエッジピクセルを1、弱いエッジあるいは 延長されたエッジピクセルを2、孤立したピクセルを255と表現する pixel-imageオブジェクトを返す。


overlay-edge ximg edgeimg [関数]

Xwindowに表示可能なpixel-imageであるximgの最上位に edge1で得られたedgeimgを表示する。 強いエッジピクセルは赤、弱いエッジピクセルは緑、孤立したピクセルを青 で表現される。



edge2   [関数] 

img1 edge1result &key (kvalue 8.0)
(curve-threshold 0.8)
(line-error 2.8)
(curve-error 2.8)
(plane-limit 0.3)
edge1の結果から一致する直線あるいは楕円曲線を捜す。 領域(region)、境界(boundary)、線分(line segment)の3つの要素の リストが返される。


edge2で出力される3つの要素は、以下のように定義される。




region [クラス]


  :super   propertied-object 

:slots contour area intensity std-deviation


領域を表現。



boundary [クラス]


  :super   propertied-object 

:slots parent-region hole segments intensity topleft bottomright length


境界を表現。



edge-segment [クラス]


  :super   propertied-object 

:slots prev next wing ; the other half-edge intensity std-deviation start end


エッジ線分を表現。



line-edge-segment [クラス]


  :super   edge-segment 

:slots la lb


直線のエッジ線分を表現。



curved-edge-segment [クラス]


  :super   edge-segment 

:slots rotation total-rot side a b c d e


曲線のエッジ線分を表現。


draw-ellipse-segment elp gc &optional (vs *viewsurface*) (height (send vs :height)) (x 0) (y 0) [関数]

vsで指定されるXwindowにcurved-edge-segmentオブジェクトである elpを描く。


draw-line-segment s &optional gc (vs *viewsurface*) (height (send vs :height)) (x 0) (y 0) [関数]

vsで指定されるXwindowにline-edge-segmentオブジェクトである sを描く。



draw-segments   [関数] 

segs &key (line-gc image::*red-gc*)
(ellipse-gc line-gc)
(vs geometry:*viewsurface*)
(height (send vs :height))
(step nil)
(x 0) (y 0)
vsで指定されるXwindowにedge-segmentのリスト表現である segsを描く。


draw-boundary b &optional gc [関数]

vsで指定されるXwindowにboundaryのオブジェクトb の中の線分を描く。


draw-boundaries bs &optional gc (step nil) [関数]

vsで指定されるXwindowにboundaryのリスト表現であるbs の中の線分を描く。


*red-gc* [変数]

#ff0000(赤色)の色を持つgcontext


*blue-gc* [変数]

#0000ff(青色)の色を持つgcontext


*green-gc* [変数]

#00ff00(緑色)の色を持つgcontext


*yellow-gc* [変数]

#ffff00(黄色)の色を持つgcontext


*cyan-gc* [変数]

#00ffff(水色)の色を持つgcontext


Figure 19: Edge Finder and Overlaied Edges
\includegraphics[height=9cm]{fig/block1.edg.ps}


トラッキング

"vision/correlation"に元画像とトラッキングしたい画像との 相関を求める関数が定義されている。




tracking-window [クラス]


  :super   pixel-image 

:slots x-pos y-pos x-vel y-vel
pattern-size window-size
x-win y-win window window-margin
update threshold half-pattern correlation


このクラスは、トラッキング画像を定義する。


:correlation [メソッド]

この画像と元画像との間の相関を返す。


:grab &optional (x x-pos) (y y-pos) (sampling 2) [メソッド]

画像入力装置から画像を取り込み、その画像のpixel-imageを返す。


:window-rectangle val [メソッド]

Xwindowの上に四角形を描く。


:rectangle val [メソッド]

Xwindowの上に四角形を描く。


:move newpos &aux (newx (aref newpos 0)) (newy (aref newpos 1)) [メソッド]

トラッキングする位置をnewposに移動し、新しい画像を取り込む。


:track display-window &optional th [メソッド]

Xwindowの画像からこの画像をトラッキングする。


:search display-window &optional th [メソッド]

Xwindowの画像からこの画像を捜す。


:track-and-search flag &optional th [メソッド]

この画像をトラッキングする。 もし、トラッキングを失敗したとき、Xwindowからこの画像を捜して 位置を更新する。


:pos [メソッド]

windowの左上位置を返す。


:vel [メソッド]

トラッキング速度を返す。


:insidep pos &aux (x (aref pos 0)) (y (aref pos 1)) [メソッド]

postracking-windowの中に含まれるかどうかをチェックする。


:update &optional (flag :get) [メソッド]

updateflagを設定する。もし、flagがなければ、 updateを返す。


:prin1 strm &rest mesg [メソッド]

このtracking-windowを名前と次元と一緒に表示する。


:init x y size win-size [メソッド]

tracking-windowを作成する



画像ファイル入出力

"vision/pbmfile"は、Euslispとディスクファイルとの間の 画像データを変換する関数を定義している。 EusLispは、pgm(portable gray-scale map)とppm(portable pixmap)フォーマット のファイルの読み書きができる。



read-pnm f &optional buf0 buf1 buf2 [関数]

file-streamfで指定されるpgmあるいはppmファイル を読み込み、pixel-imageあるいはcolor-pixel-imageを返す。 画像ファイルは、asciiでもバイナリーでも可能である。 言い換えれば、P2,P3,P5,P6フォーマットは認識できる。


read-pnm-file file &optional buf0 buf1 buf2 [関数]

ファイル名fileで指定されるpgmあるいはppmファイルを読み込む。


write-pgm f image &optional (depth 255) [関数]

imageで指定されるpixel-imagefile-streamであるf にバイナリーppmフォーマットで書き込む。


write-ppm f image &optional (depth 255) [関数]

imageで指定されるpixel-imagefile-streamであるf にバイナリーpgmフォーマットで書き込む。


write-pnm f img [関数]

imgで指定されるピクセル画像をfile-streamであるfに書き込む。 もし、imgpixel-imageであるなら、バイナリーpgmフォーマットで 書き込み、color-pixel-imageならバイナリーppmフォーマットで書き込む。


write-pnm-file file img [関数]

ファイル名fileimgで指定されるピクセル画像を書き込む。 この関数は、write-pnmを呼び出す。


image::read-raw-image file &optional (x 256) (y x) [関数]

raw-imageファイルを読み込み、1次元の文字列ベクトルを返す。 raw-imageの次元は、与えられたxyに一致しなければならない。


image::write-raw-image file imgvec [関数]

ピクセル値を1バイトのベクトル(文字列)に蓄積したimgvecfile に書き込む。


This document was generated using the LaTeX2HTML translator on Sat Feb 5 14:36:44 JST 2022 from EusLisp version 138fb6ee Merge pull request #482 from k-okada/apply_dfsg_patch