Gallery 2

Gallery 2では「小領域法」で描いた画像を紹介しています。

「塗り絵」・「貼り絵」をしたい

矩形とL字のコンポジションA

ここで紹介するのは,キャンバスを多数の領域に分け,各領域に好きな色を塗っていくか,各領域に別の画像を貼り付けていく方法です。当工房の目標の一つに,日用品にプリントできるような画像を作ることがあります。そのために,具体的な何物かを描いた絵というよりは,「パターン」「柄」とでも言うべきものを描く方法として,この方法を考えました。これは,一言で言うと,「塗り絵」「貼り絵」をコンピュータで行うということです。

「Home」で挙げた作者の好きなアーティストのうち,グンタ・シュテルツルはそもそも織物師であることから,全体を小さい領域に分割し,各領域に色・模様を設定していくという制作方法をとっています。画家であるパウル・クレー,ニール藤田の作品もこの要素が強く,一部のアボリジニアートにもこの傾向がみられます。
日本の伝統的な染色技術である友禅染では,枠となる線を糊で作り,染色剤をその枠の内側に留めるという技術が用いられています。
西洋のステンドグラスは,まずガラスに着色し,それを貼り合わせて作りますが,絵を構成する考え方として近いものがあります。
「塗り絵」は子供がやるものと考えれがちですが,このように,高い芸術性を持つ作品を作る際に用いられており,またコンピュータ・プログラミングとの相性もよさそうなことから,この方法で画像を作ることを試みました。

領域分割のしかた

まずはキャンバス(ある2次元領域)を小領域に分割する必要があります。「小領域に分割する」とは,「領域を分ける境界線を決める」ということです。
当工房では,次の方法を用いています。

(1)手で描く
思いついたパターンを手で描く方法です。手描きの味(線のぶれなど)を出したいときはフリーハンドで,幾何学的にきっちりしたものを描きたいときには作図ソフトで描きますが,いずれにしても線を1本ずつ描いていく方法です。どのような画像ソフトを使っても可能な方法だと思います。

(2)画像処理により作る
普通の画像や写真の輪郭を抽出し,それを領域の境界とする方法です。これも輪郭抽出機能を持つ画像ソフトで簡単にできます。

(3)計算により作り出す
何もない2次元または3次元空間を小領域に分割すること,あるいはすでに分割されている構造の性質を研究することは,数学や理工学において大変に注目されている課題です。数学における4色問題やボロノイ図は古くから有名ですが,理工学においてもセル構造体(多孔質体や泡など)の性質の研究や人工材料の設計製作などが近年活発に行われています。
当工房では,これらの分野にならって「たくさんの小領域を計算によって作り出す」ことを試み,それをもとに2次元画像を作ってみました。
この方法を説明するにはかなり長い説明文と数学が必要なので,それはメニュー「Methods」で述べました(準備中)。興味のある方はご覧ください。

「塗り絵」の方法

次に,境界線を描いてから塗り絵をする具体的な方法を説明します。

  1. まず,何らかの方法で境界線(枠)を黒で描きます。
  2. 次に,各領域中のどこかに,塗り始める「起点」を,黒以外の色で描きます。図では,赤,緑,青で描いています。これはそれぞれの色に割り当てる「塗る色」を分けるためです(しかし,後で述べるように,起点の色は1色でもかまいません)。
  3. ある「起点」(図では赤点)から,上下左右最大何ピクセルまで塗っていくかを指定します。図ではその領域を水色枠で示しています。これは,「他に指示がなければ」この領域全部を塗りつぶす予定,という意味です。
  4. プログラムの中に,次の条件を記述します。
    (A)ある起点から上下左右に水色の枠に達するまで塗っていけ。
    (B)ただし,その途中で黒いピクセルがあったらそこでストップせよ。

(A)に従えば,本当はオレンジの点線のように塗っていきたいのですが,
(B)の条件があるため,実際にはオレンジの実線のところまで塗ることになります。
以上の過程を,「黒色の枠内にある,起点を含む垂直線の上」にあるすべての点から始めれば,「起点を含む黒枠内」を横に塗りつぶすことができます(i方向に塗っていくこと)。
「黒色の枠内にある,起点を含む水平線の上」にあるすべての点から縦に塗ることを同様の条件で行えば,「起点を含む黒枠内」を縦に塗りつぶすことができます(j方向に塗っていくこと)。
以上で,黒枠内を塗りつぶすことができます。

1. 境界線(枠)を黒で描く
2. 枠内に塗りの起点を描く
3. 塗る最大領域を決める
4. 条件(A),(B)に従って塗る

追記
・Pythonでは与えられた画像(png形式)の各ピクセルのRGB値を調べることができるので,黒枠に行き当たったかどうか,起点の色が何色か,などはRGBの数値で決めることができます。
・起点の色を1色にし,別の規則を決めておいて,同一色の起点から複数の塗りつぶし色を選択するようにすることもできます。
・実は上記のアルゴリズムにはかなり重大な欠点があり,塗り残し領域が発生することがあります。これについては「Methods」で述べたいと思います(準備中)。

「塗り絵」で作った画像

ユニテダビタシオンA(1)
ユニテダビタシオンA(2)
古代ギリシャ風A
プレモダンA

先に示した枠にいろいろな色を塗ってみたのがこれらの画像です。
「ユニテダビタシオンA(1),(2)」は1940年代~60年代に建築家ル・コルブジェが設計した集合住宅に使われている色からいくつかを選択して塗ったものです。(1),(2)は枠内に塗る色を変えたものです。枠内にどの色を割り当てるかは,厳密に決めるやり方,乱数を用いて何度も試作して組合せのよいものを選ぶやり方がありますが,個人的には後者のほうが面白いものができると思っています。
「古代ギリシャ風A」は紀元前ギリシャで作られた彩色された壺によく使われていた色,「プレモダンA」は1900年代初頭に流行した,白を基調としたシンプルな色構成を参考にしたものです。

ユニテダビタシオンB
古代ギリシャ風B
プレモダンB(1)
プレモダンB(2)

上は同様の配色で枠の形を変えたものです。
「枠」は白黒画像(pngファイル)で作っておき名前をつけておきます。
「色」はRGB値で指定するか,Pythonで通用する「色名」(テキスト)で指定します。
一度プログラムを作ってしまえば,これら引用するテキストや数値を変えるだけで様々な画像を作成できます。実際のところ,ある色をある枠内に塗ることは「ペイント」などの画像ソフトで簡単にできるのですが,手作業をほとんどせずにプログラム中のテキスト操作だけでたくさんの画像を作成できるのがコーディング作画の便利なところです。
なお,上の画像の中の「プレモダンB(2)」では,細かい点を含んだ黄色で塗られている部分があります(「金色」を表現したつもりです)。この部分だけは単色で塗るルーチンでは作ることができません。これは,この後述べる「貼り絵」の方法で作成しています。

「貼り絵」の方法

当工房で行っている「貼り絵」は,「塗り絵」と同じようにまず枠を描きますが,その枠の中には,別途描いておいた絵を貼り付けていくという方法です。枠の中に柄・模様のある絵をはめ込んでいくという点が塗り絵と異なります。
描く順番は「塗り絵」の方法で示した1~4と同じですが,4(A)だけが異なり,次のような手続きとなります。

まず,枠を描いた絵(「枠絵」と呼びます)の他に,中にはめ込みたい絵を描いた絵を数枚用意します。これは,画面全体に,柄・模様のみを描いていきます(「元絵」と呼びます)。描いた数枚の元絵には名前をつけておき,png形式で保存します。

次に,プログラムの中に,これら元絵のすべてのピクセルのRGB値を格納するための配列を用意します。これは,たとえば次のような形が便利です。

R[w][i][j] ピクセル(i, j)のRGBの赤(R)の数値を格納する配列
G[w][i][j] ピクセル(i, j)のRGBの緑(G)の数値を格納する配列
B[w][i][j] ピクセル(i, j)のRGBの青(B)の数値を格納する配列
元絵は数枚あるので,その何枚目かをwで表します。

これで元絵の情報はすべて記録されます。
図の枠絵の中の水色枠で囲った領域の中のL字型の部分に絵を貼り付けたいときには,
・貼り付けたい絵は元絵の何番か(wの値)
・元絵のどこを中心として,どのくらいの拡大・縮小率で貼り付けたいか
を指定します。これにより,枠絵の中のピクセルと元絵の中のピクセルの対応関係が決まります。
その対応関係によって特定された元絵のピクセル(i, j)のRGB値が格納されている配列R[w][i][j],G[w][i][j],B[w][i][j]から値を取り出し,その値で枠絵の色を塗ります。
「塗り絵」と同様,実際に塗られるのは水色枠の中の起点を囲む黒枠内だけですから,指定した元絵の中の一部分(この場合はL字型の部分)が枠絵に貼り付けられます。
元絵のどこを中心にとるか,拡大縮小をどうするかは任意であり,たとえば元絵の右上のあたりを縮小して貼り付けたければAのように,元絵の左下のあたりをあまり縮小せずに貼り付けたければBのようになるようにパラメータを指定します。

  枠絵               元絵
  他の元絵も描いておく

「貼り絵」で作った画像

この方法で作った画像を以下に示します。いずれも同じ元絵をもとにして,各領域にどれを貼り付けるかだけを変えたものです。このように,枠絵と元絵さえ準備しておけば,プログラム中のパラメータを変えるだけでたくさんの画像を作ることができます。多くの場合,乱数によってパラメータを変えています。

以下の画像は別の元絵をもとに作ったものです。同じ元絵を用いても貼り付けるときの倍率を変えると異なった感じの仕上がりとなります(1番目と2番目,3番目と4番目)。また,これらの画像では,枠に色を付けたり,枠の付近で「かすれ・にじみ」があるような表現を用いています。この方法については後で説明したいと思います。

別の枠絵で作った画像を以下に示します。

計算により枠を作り出す(フィールド法)

境界線を作る方法の3番目として,「計算により作り出す」方法があると先に述べました。ここではその概要を説明します。詳しい説明は「Methods」に書きます(準備中)。
この方法は,次の二段階よりなります。

(1)いきなり境界の線を描くことを考えず,まず,2次元平面内のすべての点で値を持ち,その値が連続性を保ちながら場所によって変化していく関数を作ることを行います。そしてその関数の値が複雑なパターンを持つようにします。
複雑なパターンというのは,「もしそれを濃淡画像で見たらまだらに見える」,あるいは,「3次元表示したら凸凹の面に見える」,そのようなパターンと考えてください。

このような凹凸分布を作る方法はいろいろあると思いますが,当工房では小さな凸部=「山」をたくさん配置していく方法を用いています。
「山」の関数としては,たとえばMethodsに示すようなガウス関数を用いることができます。問題となるのは,それを「どの位置に置いていくか」ということです。
一つの方法は,乱数を使って2次元平面内のランダムな位置に配置することです。しかしこの方法ですと,山が密になりすぎる箇所,疎になりすぎる箇所が出てきます。これはこれで面白いパターンを作るのですが,当工房では,「ある程度均等に山を分布させる方法」として,次の方法を用いています。

①まず,2次元平面内に何個か,初期点となる山を配置します(図では4個)。
②その段階で凹凸面の高さが一番低い点を求めます。
③その点に次の山を配置します。
この①~③を,好きな回数だけ繰り返します。

図の一番右は,20個の山を追加し,計24個の山を配置した段階の凹凸面です。
これを,作成した「フィールド」と呼ぶことにします。

(2)このフィールドに対して「何らかの数学的処理」を施し,「境界線」を定義します。この「数学的処理」にはいろいろなものが考えられますが,当工房では,「どこかの方向に沿って窪みになっている場所を求める」ことを行っています。
これはいわば,山がたくさんある地形の中の「谷」または「沢」の部分を求め,それをつないで境界線とするということです。
これは言葉で言うと簡単そうですが,結構難しい問題です。
どの方向から行っても必ず穴に落ち込むような窪みであれば,それは2変数関数の極小点なので,直交する2方向の断面をとり,そのどちらでも中央が窪んでいる場所を求めれば存在がわかります。
しかし「沢」の場合は,ある方向の断面では極小点がありますが,別の方向の断面では極小点はありません(沢を水が流れる方向には極小点はないので)。どの断面を見ればよいのかは,最初からは判りません。非常に多くの方向に対して調べれば判りますが,それは大変に計算時間を必要とします。
そこで当工房では,次の簡単な条件を設定して計算しています。

条件:上から下,左から右,左上から右下,右上から左下,のいずれかの方向に切ったときに中央が窪んでいればそこを沢とする

具体的には,ピクセル(i, j)に対する
  (i-1, j) (i, j) (i+1, j)
  (i, j-1) (i, j) (i, j+1)
  (i-1, j-1) (i, j) (i+1, j+1)
  (i-1, j+1) (i, j) (i+1, j-1)
の4種の組み合わせにおいて(i, j)の値が最小となる組合せが一つ以上あれば,(i, j) を境界線を作る点として採用します。
平面内のすべてのピクセルに対してこれを調べ,該当する点を集めたものを境界線とします(最外周は隣がないので例外処理をします)。

この方法で作ったフィールドと境界線(=枠)を以下に示します。一番左の図は先に示した20個追加(計24個)のフィールドを真上から見たものです。これから求めた境界線がその右の図です。黒が境界で,赤い点は山を置いた点を表します。これと同じ山の配置で山の裾野を狭くした場合の結果も併せて示します。

山を24個配置したフィールド
左のフィールドから作った枠
24個で山の裾野が狭い場合
左のフィールドから作った枠

この方法で作った境界線は,曲線になることも直線になることもあります。たとえば最初に示したフィールドから作った境界線は曲線に,同じ山の配置でも山の裾野を狭くしたフィールドから作った境界線は直線になります。
一般に,山の裾野が狭いと境界線は直線となります。
また,きれいな一筋の線ではなく枝分かれする部分ができる場合もあります。
また,線が閉じずに単なるひもの集合のようになる場合もあります。
これらはどのような凹凸面を作ったかによるのですが,このあたりの諸々の事情についてはMethodsで述べます。

フィールド法で枠を描く方法は,「どこそこに線を引く」というような描き手の意志が直接反映される方法ではなく,関数や計算が介在します。そのため,ちょっとまどろっこしい部分もありますが,どういうものができるか判らない分,実験的な面白さがあります。

これは,完全に規則的でも完全にランダムでもなく,形状はいろいろだが平均的には大体同程度の面積を持っている2次元的な「セル」の集合を作り出す方法であるともいえます。

なお,この方法は当工房で考え出したものではなく,人工的なセル構造を計算によって作り出す際に行われている方法です。当方の知る範囲では,医工学において,生体組織(たとえば肝臓や海綿骨のセル構造)を模した3次元構造を作って計算機実験をしたり3Dモデルを作製する場合などに用いられています。

いろいろな枠構造

ここでは,計算によって作り出したいろいろな枠(セル)の構造を紹介します。

下の図A~Dは上述した方法を素直に適用した場合のセル構造です。一つ一つの形は違うものの,一つの画面内ではほぼ同じ大きさのセルが生成されています。一度プログラムを作ってしまえば,どのくらい細かく領域分割するかは苦労なく設定できます。

A 通常配置24個
B 通常配置64個
C 通常配置154個
D 通常配置304個

下図Eは「異方性」を持たせた場合です。これは,ある方向に細長く伸びているようなセルの集合を作るということです。山の関数であるガウス関数の裾野の広がりを,x方向に広く,y方向に狭く設定すればこのようになります。
セルの「並び方」を工夫することもできます。たとえば,下図F~Hのように,円周状に並んでいる形,波打っている形などを数学的操作により作り出すことができます。詳しくはMethodsで述べますが,上述した細長い形のガウス関数の向きを操作することにより作ります。

E 横に長いセル
F 円周状に並んだセル
G 波打っているセル
H 円と波の両方の構造を持つセル

下図Iは,セルの形を支配するガウス関数の裾野の広がり具合を乱数によって変えて配置した場合です。セルの形や大きさに多少の乱れを出すことができます。

以上はすべて,先述した,ある段階での曲面の高さが一番低い場所に次の山を置くというアルゴリズムで作ったものですが,これを行わず,キャンバス内の完全にランダムな位置に山を配置して作ることももちろん可能です。完全にランダムということは隣の山までの距離もランダムということですので,近すぎる場合,遠すぎる場合が出てきます。結果として下図Jのようになり,セルが密に集まるところや疎になるところが発生します。セルが密なところでは境界線を決められない場合も出てきます。

山の形はガウス関数のように円または楕円である必要はないので,あえて四角い山を配置して作ることもできます。図Kは,縦横比をランダムに変えた四角い山を配置して作った枠です。ただし,この場合は,曲面の「沢」の部分ではなく,傾斜が大きい地点(「崖」のようなところ)を境界にするようにプログラムを組んでいます。

I セルの大きさにランダム性を入れた場合
J 完全にランダムな位置に山を置いた場合
K 四角い山で作った枠

これらいろいろなパターンの枠(セル)を作る具体的な方法については,Methodsで説明します(準備中)。

フィールド法で作った画像

フィールド法で枠絵を描き,それが「どの小領域もすべて閉じている」構造をしていれば,それをもとに,先に説明した方法と全く同じ方法で「塗り絵」や「貼り絵」をすることができます。
一つ異なる点は,手描きで枠絵を作った場合には,黒で描いた枠の内部に,色を塗っていく起点(最初の点)を描き加える必要がありました。フィールド法を用いた場合はその必要はありません。なぜなら,各領域の内部にはフィールドの山を作るための関数を置いていった中心点があるからです。その座標を配列に入れて記録しておけば,枠の完成後に色を塗る起点として使うことができます。

以下に,「どの小領域もすべて閉じている」「ほぼ閉じている」枠絵を用いた画像を示します。

次の画像は,枠の内部を塗りつぶすのではなく,フィールドを作った際の山の頂点の周りの領域を塗ったり,頂点に別の図形(同心円,円)を置いたりして作った画像です。フィールド法を用いているため,頂点位置は,ある程度のランダム性はあるものの完全にランダムではない分布を示しています。

以上をみてもわかるように,この方法で作った画像は何か特定の対象物を表現したというより,ある程度のランダム性を持った「パターン」を作り出しているという感じです。そのため,単体で使うよりも,別の画像の素材として使うことが多いです。

フィールド法で作った画像(イレギュラーな使用法)

下図は,フィールド法において「山」の裾の広がりをだんだんと大きくしていった場合の枠(セル構造)の変化を示します。
裾が狭い場合は枠は直線となりきれいに閉じています。
裾が広くなるにしたがい,枠は曲線となり,本数が増えていきます。
この枠構造で作った画像は境界付近に「ずれ」や「きしみ」ができています。
さらに裾を広くすると,ある段階からは枠が閉じなくなります。
このような「閉じていない枠」では本来の「塗り絵」「貼り絵」はできないのですが,それに構わず無理やりプログラムを動作させると,次のような構造を持つ画像が出来てきます。
・枠で止められた曲線の輪郭の部分
・枠のない部分で指定限度まで塗りが入った,矩形輪郭を持つ部分
・枠の一部から漏れて外側にはみでた部分

裾の広さ小
左の枠で塗った場合
裾の広さ中
左の枠で塗った場合
裾の広さ大
左の枠で塗った場合

これらのことが起きている画像は,フィールド法本来の目論見からは「失敗」なのですが,実際にはかえって面白い画像が出来上がります。
このような「イレギュラーな条件でフィールド法を動作させた」画像を以下に示します。

フィールド法がきれいに動く条件で作った画像は単なるパターン(模様)であり,それ単体では作品とは言えないものが多いですが,このようにイレギュラーに動作させ「失敗部分」が含まれているような画像に,かえって「目を引く」ものが多いのは不思議なことです。
出来上がりが非常に予想しにくいのも事実ですが,当工房ではこの方法をよく使っています。

タイトルとURLをコピーしました