量子派絵画生成プログラムとその実行結果 | 開成ボーイのmadなdays

開成ボーイのmadなdays

人生は為したいことを為す手段であって、目的ではない。
生きる理由は、それしかその手段がないからである。

GUIなどの整備は全然やっていませんが、少なくとも骨組みはできました。
後はこの骨組みを使ってやれば(気になるのなら分布式をマイナーチェンジしてやるなり、リスト化するなりしてやれば)、一応描けるようになりました。
(大体はこちらを参考にしています…GUIはまた別のところを参考にしつつ取り入れるつもりです)

ソースコードは以下です。言語はjavaです。

package imgtest;

import static imgtest.util.*;

import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.ImageIO;
public class imgtest {
    public static void main(String[] args) throws IOException {
        File f = new File("test.jpg");
        BufferedImage read=ImageIO.read(f);
        int w = read.getWidth(),h=read.getHeight();
        BufferedImage write =
                new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        double sigma=Double.parseDouble(args[0]);//標準偏差
        double n=Double.parseDouble(args[1]);//分割数(片側)
        double m=Double.parseDouble(args[2]);//何シグマ区間まで計算するか(何シグマ区間から外は微小なので無視、としてしまうか)
        for(int y=0;y<h;y++){
            for(int x=0;x<w;x++){
                int c = read.getRGB(x, y);
                double prob=Math.random();
                double prob2=Math.random();
                double prob3=Math.random();
                int r = (r(c)+(int) integral_gauss(sigma,n,prob,m))%256;
                int g = (g(c)+(int) integral_gauss(sigma,n,prob2,m))%256;
                int b = (b(c)+(int) integral_gauss(sigma,n,prob3,m))%256;
                int rgb = rgb(r,g,b);
                write.setRGB(x,y,rgb);
            }
            System.out.println((y+1)+"/"+h+" done");
        }
        File f2 = new File("result.jpg");
        ImageIO.write(write, "jpg", f2);
        System.out.println("completed");
    }
}

utilはこちら。integral_gaussは、ガウス分布を台形近似で積分する方法で計算しています。

package imgtest;

public class util{
    public static int a(int c){
        return c>>>24;
    }
    public static int r(int c){
        return c>>16&0xff;
    }
    public static int g(int c){
        return c>>8&0xff;
    }
    public static int b(int c){
        return c&0xff;
    }
    public static int rgb
    (int r,int g,int b){
        return 0xff000000 | r <<16 | g <<8 | b;
    }
    public static int argb
    (int a,int r,int g,int b){
        return a<<24 | r <<16 | g <<8 | b;
    }
    public static double integral_gauss (double sigma, double n, double prob, double m) {
double whole,total,i,d;
prob=Math.random();
whole=0;
total=0;
d=(m*sigma)/n;
for(i=0;i<2*n;i++){
whole=whole+(d)*((Math.exp(-Math.pow(i*d-m*sigma,2)/(2*sigma*sigma))+Math.exp(-Math.pow((i+1)*d-m*sigma,2)/(2*sigma*sigma)))/(2*Math.sqrt(2*Math.PI)*sigma));
}
i=0;
while(total/whole<prob){
total=total+(d)*((Math.exp(-Math.pow(i*d-m*sigma,2)/(2*sigma*sigma))+Math.exp(-Math.pow((i+1)*d-m*sigma,2)/(2*sigma*sigma)))/(2*Math.sqrt(2*Math.PI)*sigma));
i++;
}
return ((i+0.5)*d)-m*sigma;
        }
}

これにより、型絵の各ピクセルの色データを元からガウス分布に従ってずらすことができます。
さて、まずは次の二つを型絵にして試してみました。…壁紙用に昔ネットから取ってきた適当な画像から二つ、です。

audrey

earth

生成した画像は…一先ず、1シグマ=10、分割数=10000、シグマ区間=5とした場合。
昔にネットからおろしてきた画像をそのまま使っています。

audrey_results_2

audrey_results

earth_results

これはこれできれいだと思います(特に地球の絵の方)が…色相が事実上反転している点がノイズになっている印象が否めなかったので、反転防止(反転回数が奇数回ならば再反転させる)ようにちょっとだけ書き変えました。
                int r1 = r(c)+(int) integral_gauss(sigma,n,prob,m);
                int g1 = g(c)+(int) integral_gauss(sigma,n,prob2,m);
                int b1 = b(c)+(int) integral_gauss(sigma,n,prob3,m);
                int r=r1%256;
                int g=g1%256;
                int b=b1%256;
                if((r1>0&&((int)(r1/256))%2==1)||(r1<0&&((int)(r1/256))%2==0)){
                 r=255-r;
                }
                if((g1>0&&((int)(g1/256))%2==1)||(g1<0&&((int)(g1/256))%2==0)){
                 g=255-g;
                }
                if((b1>0&&((int)(b1/256))%2==1)||(b1<0&&((int)(b1/256))%2==0)){
                 b=255-b;
                }
変化をある程度大きめにしたかったのでシグマ=40、時間短縮のため(分割数10000だと地球画の方は実行時間が6時間半になってしまった…その反省です。この実行時間の問題は、アート用スパコンというまた別の可能性をも私に見せてはくれたのですが…とりあえず今はまず身近で使えるコンピューターでもう少し速く動かしたかったので)
分割数は1000に減らして、オードリーの画像を型絵にして実行したところ、以下のようになりました。

audrey_new

audrey_new_2

確かに反転は収まったようです…ただ、これだけだとノイズ発生とあまり変わらない気もします(ノイズらしい良さはある…そして多少絵画っぽくなったのですが)。
そこで、シグマ区間を100にして見ると…次のようになりました。

audrey_100

audrey_100_2

やっぱりノイズですね…でも、妙に現代絵画っぽくなった気がします。
(そして明らかに不協和音を連想させるこの奇妙な混乱の中に残る秩序の感覚…慣れてくると最初の拒絶感が収まり、これはこれでいいと思えるようになってくる)

これらから学んだことはいくつかあります。
一つは、量子論が微小スケールにおける不確定性を与えたところで、大局的には古典力学や量子論を含まない相対論が成立するのと同様、
量子派絵画においても、よく比較すると違いはあっても、大局的には似たような絵が生み出される、ということ、です。…不思議ではありますね。
(もちろん、型絵を使うから、かも知れません。型絵なしの白紙に対してこれを実行すると、また、シグマ区間を大きくし、反転防止も一切なくして実行すると、結果はどんどん変わってくるかと思います)

前の実験段階で思いついたように、マルチエージェントのような相互作用を取り入れたり、できることはまだまだありますが…ここでソースコードをシェアしたことで、ある程度誰でも実験できるようになったと思うので、どんどん色々試してみてください。
今回のソースは、一つの型としてコピペフリーです…argsをいじったり、GUIをつけてやったり、別の分布オプションをどんどん加えてやったり…型があるので、初歩的なプログラミングの知識があれば色々いじれると思います。

(ただ、まだこれでは完全な大衆化とは行かない…それには時間がかかるのは世の常だと言う…私はそのことが完全に抜け落ちており、最初から一気に大衆化可能な段階を目指す意識ばかりがありました。これは反省点です)

最後に。

量子派は学芸融合の一つのスタート点になると信じているので、もっと色々な学術知識(ミーム理論、マルチエージェント、人工知能・機械学習、フラクタル、本格的な量子論(更にはひも理論も?)etc.)をつぎ込んでいく余地もあるし、発展の余地はまだまだあります…が、一先ず、私が想像する地平の一端を現実のものにしてみせることで共有することを最優先にしています。
(そしてそれを通じて私自身も見え切れてはいないことを痛感する…可能性は、その入り口を見つけた私自身の想像すら及ばない)
そこで、ぜひとも皆さんの感想をお聞きしたいし、参加してくださる人がいればぜひとも参入して欲しいと思っています。

私が意識している、量子派が引き起こしうるパラダイムシフトは、
・学術と芸術の融合…学術的知識を多分に吸収した芸術世界
・制作者ですら分からない不確定性…鑑賞者と制作者とのボーダレス性の暴露
の少なくとも二つの大きな柱を持っています。

が、おそらくそれ以上のいくつもの可能性を秘めている…それをまとめ、全体像を俯瞰するのは、様々な要素の混合と統合の中でアイデンティティーを成立させてきた私自身ですら困難かもしれないと感じているので、協力者・理解者はぜひとも必要なのです。

どうか今後も応援よろしくお願いします。

では、また、
see u! ;)