hirax.net::Keywords::「mathematica」のブログ

2008-07-11[n年前へ]

「スペクトル操作Mathematicaライブラリ」で動画を作る

 光スペクトル操作用のMathematicaライブラリで、スペクトル変化の動画を作ると、こんな感じになります。Map も spectorPlot も Table も addtiveMixtureSpector も whiteLight も cyanFilter も・・・どれも「関数」です。addtiveMixtureSpector や whiteLight や cyanFilter は「関数を返す関数」で、Map などは関数を引数にとる関数です。Mathematica でコードを書いていると、なぜか自然に関数を重ね合わせていくような書き方が気持良くなってきます。

Map[spectorPlot,
 Table[
  addtiveMixtureSpector[
   {whiteLight,
   transmissionSpector[whiteLight,
   cyanFilter, 1.0]}, {1-r,r}]
 ,{r,0,3,0.05}]]

 それで、今この瞬間の悩みはMathematicaで"spectorFitting[targetSpector_,usingSpectrum]"というような関数をどうやって書くか、ということです。targetSpector は、任意のスペクトルを表現する関数で、usingSpectrum は「スペクトルを表す関数群」で要素数は任意のリストです。usingSpectrumを使いtargetSpectorをどのように表現するかを、最小二乗近似で最適解をNMinimize で解くというのが、そんな関数を作るときの定番の手順なのだろうと思います。つまり、方程式と制約条件を動的に作成し、それをNMinimize で解いた結果を返す、という具合です。

 さて、この spectorFitting という関数はどう簡単に書くことができるものでしょうか。Mathematicaは変数名と文字列を明確に区別する割に、見た目ではまったくその違いがわからないのが面白いところ(同時に苦労するところ)かも、と思ったりしたのです。

2008-07-12[n年前へ]

Mathematica で作った壁紙やスクリーンセーバ

 Mathematica で作った壁紙やスクリーンセーバ

2008-07-23[n年前へ]

「肌」と「昼の日差し」のスペクトル

 夏の日差しを実感するようになりました。肌は日焼けして赤黒くなり、そんな肌はピリピリと痛く、熱っぽさすら感じます。そんな、夏の明るい景色を眺めていると、なぜか楽しくなります。

 痛いけれど日焼けする夏の日差しが気持良く感じる人もいる一方で、日焼けする夏を嫌う人も多いと思います。特に日焼けしたくない女性にとっては、夏は面倒でとても嫌な季節だったりするのかもしれません。

…と考えているうちに、ふと、夏の日差しを浴びる「肌の色」を眺めてみたくなったのです。そこで、2週間ほど前に作った「光スペクトル操作用のMathematicaライブラリ」にいくつかの色関数(スペクトル吸収関数)を追加してみました(サーバからダウンロードできるライブラリ更新は数日後になります)。追加したスペクトル吸収関数は、「血液」「カロチン」「メラニン」…といったもので、皮膚内部にある物質の吸収スペクトルを表現するための(単純化した)スペクトル関数を実装してみました。

 そういった色関数を組み合わせると、いろいろな「肌色」を眺めることができるます。たとえば、右上の図は、(どの波長も均等に含んでいるような)白色光源で照らした時に血液の反射スペクトルがどう見えるかを試しに計算してみたものです。

spectorPlot[transmissionSpector[
whiteLight, bloodColorFilter, 0.5]
]];

 ところで、こんな「色関数」を作り、適当で大雑把な「肌」を作って眺めてみました。すると、色温度6500ケルビンの標準光源、すなわち自然な昼光光源であるD65で、肌色を形作るメラニンや血液を照らしてみると、意外なほど「反射スペクトル」が平らになるものだ、と気づかされました。

 つまり、昼の日差しのスペクトルのうち、スペクトル強度が強い短波長領域では、メラニンや血液などの色吸収率が高く、その一方、「昼光」のスペクトル強度が低下する長波長域では、メラニンや血液などの色吸収率が低く、それらの結果として反射スペクトルが”結構”均等になるのだなぁ、と感じたのです。たとえば、右のスペクトルグラフが、昼光=D65光源で皮膚を照らした時の反射スペクトルの例になります(ちなみに、右下のグラフがD65光源のスペクトルです)。

 それは、単に長波長領域の光は皮膚中で吸収されることが少なく、短波長の光が吸収される、というだけのことでしょうし、さらには、人によってメラニンの分布量・形状が異なり、反射スペクトルは全然違うわけで、こんな結果も一般的なものでは全くありません。

 けれど、「昼光の逆関数のような、まるで、強い日差しから身を守るかのように最適化されたような皮膚の吸収スペクトル」を適当に作ったライブラリ関数が生成したのを眺めたとき、とても不思議なくらい新鮮さ・意外な面白さを感じたのです。

BloodColorCalotenColorMelanineColorfleshColorD65_fleshColor






2008-11-12[n年前へ]

「色が変わるガーネット」と"Spectrum Color Conversion"

 深紅のルビーや青や緑のサファイヤ、つまりは宝石「コランダム」を眺めていると、宝石「ガーネット」に目を惹かれました。コランダムにも色々な色のものがあるのと同じように、ガーネットにもさまざまな色を呈するものがあります。そんな中で、目を惹かれたのは”色が変わる”カラーチェンジガーネットです。

 陽の光の下や白熱灯の下で、あるいは、蛍光灯の下で・・・つまり、その時々の照明光・環境光に応じて違う色姿を見せる「カラーチェンジガーネット」は実に魅力的に見えます。

 ガーネットを照らす光の波長強度分布の関係と、ガーネットの光吸収率分布と、さらにそのガーネットを見る人の色覚・色認識の機構が掛け合わされることで、カラーチェンジガーネットはその色を状況に応じて変えるのでしょうか。そして、その色の変わり具合が激しいのがカラーチェンジガーネットなのでしょうか。

 そういえば、以前光スペクトルデータ操作用のMathematicaライブラリを作ってみたり、そのWEBアプリケーション版のSpectrum Color Conversionを動かしてみました。こんなカラーチェンジガーネットを見ると、その色がどのようなもので・どのように感じているのかを、自分の指でMathematicaのコードで書き下ろしてみたくなります。そして、その「色」の仕組みを頭の中でも納得してみたくなります。

 ・・・と思いを巡らせているうちに、ふとそんな色を楽器でコードで奏でたら、指で弦をつまびいてみたら、それは一体どんな音になるのだろうか・・・とふと思ったりもしました。

2008-11-14[n年前へ]

「色を変える"宝石"ガーネット」と「"変化"するMathematica」

 「色を変える"宝石"ガーネット」の光吸収スペクトルを探すうちに、こんなページこういったページに出会いました。こういうページを眺めていると、単純な色名では表現できない宝石の光吸収スペクトルを(数式処理プログラムの)Mathematicaで関数にして、さまざまな照明の中で、宝石が外に見せる色を計算するライブラリを作りたい、と思ったりします。

 光吸収スペクトルは変わらなくても、照明光スペクトルや視覚スペクトルに依存して「見た感じ」が変わるようすをMathematicaで描いてみたいと思ったわけです。

 そんなことを思いながら、もうすぐ公開される Mathematica の新バージョン、バージョン7を見ました。そのMathematicaが"変化"し続けるさまは、なぜか「色を変える"宝石"ガーネット」を連想させました。さまざまな機能が追加され、姿・見た目が大きく変わっているように見えても、少しその新たな装いを脱がしてみると、その下にはこれまで同じ「HEADで表現される構造が組み合わさったオブジェクト」が見えてきて、そこに色を変える宝石と同じさまを感じたのです。

 色鮮やかに映える機能をとても魅力的に感じる人は、多いことでしょう。その一方で、特に変化するわけでもない内部の光吸収スペクトルや基本オブジェクト構造に不思議に心惹かれる人もいるように思います。「さまざまな機能を使って何かをしたい」と思う人もいれば、「基本構造を組み合わせて何かを作ってみたい」と思う人もいそうな気がします。

 もちろん、その時の気分で「どっちが好き」かは変わることも多いかもしれません。このページを読む人は技術系の人が多いと思いますが、(この瞬間の)あなたなら「どちら」を好むのでしょう。どちらを選ぶのでしょうか?

spector