2014年11月30日日曜日

もう11月最後か

今月はあっという間でした。
例の件を何もすすめれていないことが心残りです。反省しています。

さて。
さて。
どうしたものか。

2014年11月29日土曜日

口を動かす練習

早起きしてもコーヒー飲んで走ってyoutube見て論文読んで、では何も向上する気がしないので、会話の勉強をしようと思います。
来週は中国ですが、中国でも練習しようと思います。
なるべく話す。口を動かす。
よし、まずは、、、何をしよう。そんなことは知らん。
簡単なことからやろう。
youtubeで適当なおしゃべりを見つけて、それをシャドーイングしよう。

2014年11月28日金曜日

ランニング後のシャワー

今日は風邪が治った第一歩目として走ってきました。
6時起きです。4時半に起きたけれど寒すぎて布団から出れませんでした。
嫌なこともさっとやってしまう人はスーパーマンです。私には遠い。

だらだら走ってきましたが、10分も走れば燃えます。
なので、帰宅直後は熱いまま。
そのまま、さっとシャワーを浴びると言い知れぬ達成感があります。

普段なら風呂入らずにシャワーだけした後は部屋が寒く感じますが、ランニング後であれば、全く寒くない。活発なままです。
快活な生活には運動は欠かせないものだと再確認しました。

2014年11月27日木曜日

そろそろ

出張準備しなければ。
ケバヤシ法で過ごすか。

2014年11月26日水曜日

帰宅

出かけていたのですが、いったん帰宅。
今のタイミングで知れたのでよかった。

2014年11月24日月曜日

病の効果

ようやく風邪が治った感じがします。
長引かずに済んで良かったです。

今回風邪引いて思ったのは、風邪引くと、パフォーマンスがめちゃくちゃ下がるということ。

病気してたらいい仕事できません。心の病気もしかり。
ただ病気は予防しきれないということもわかりました。
今回はマスクと手洗いうがいをしてたにも関わらず、風邪引きました。

なので、人の邪魔したいときはその人を病気にすればヨロシと言うこと。
効果は抜群。風邪程度で少なくとも1週間はおとなしくなります。
心の病気の強烈なやつなら、相手の人生ごとおとなしくさせることができます。

こういうのを悪用して金儲けしている人たちいるのかなぁ。
なんでも気持ちよくなる病気なんかになっちゃってね、気がついたらみんなやっちゃってたりしてね、ってばかやろうつってね。

2014年11月23日日曜日

10247歩

昨夜は大学の剣道部の同窓会があって、飲みまくった後にダンスして、デロデロな状態で、終電を逃し、歩いて麻布から五反田まで帰ってきました。

さすがに遠かったです.

2014年11月22日土曜日

ひさびさにてっはぁ

texを最初に触ったのは大学生の時で、そのときの先生某えみ先生から、texはドイツ読み(ギリシアって言ってたかも)で行こうぜ、「て」のあとは、息を吐くだけの音で「はぁ」だぜ、と言われてマジかよ、と思ったのを覚えています。
結局その発音をする人は周りにはいなくて、周りではだいたい「テフ」と呼んでいました。

そもそもテフむのは日本でも一部の人らしいとそのときに聞いていたけれど、だいたいテフなので、私もテフと呼んでいます。けれど、それもそろそろやめて、「テク」と呼ぼうかと思ってきました。なんとなく。


それで今日は朝4時に起きてから、テクを書いている。
早起きテク。
字面がテクい。そんで結局みんなやっちゃたりしちゃってね、って、ばかやろうっつてね。

それで原因がさっぱりわからないのだけど、テクの画像の貼りつけにハマりました。

\includegraphics[width=0.19\linewidth,bb=0 0 150 150]{AAA.jpg}
これはAAA.jpgを貼りつけるためのコードですが、jpgはバウンディングボックスを持っていないので、前の括弧内に、bbで定義します。
AAA.jpgは縦横200bpなので、本来ならbb=0 0 200 200にするべきです。
しかし、なぜか出力した画像が小さくなってしまいました。
周りに余白があるように見えます。
なのでうーん4分の1くらい削っているていで、150にして見ようかと調整してみました。
すると、ぴったり。

たぶん、これは和文フォントを使った文書なので、英文のbpと実は違うんじゃないかと、疑っているのですが、今のところ原因はわかりません。
ま、わかってもわからなくて、出る絵が所望ならいいのですが。

2014年11月21日金曜日

治りかけ

先日に続き、薬飲んでます。
総合感冒薬。
とりあえず眠くなります。
眠くなることに関しては効果抜群で、先日同様二度寝しました。
こんな生活続けたくないですね。
学会にも行けないし。

そんな中、腹筋台を買いました。
これで腹筋を取り戻す。学会に行く準備として。

2014年11月20日木曜日

続・風邪

風邪ひいたので総合感冒薬を飲んでいます。すごく眠くなる。
そのせいか、いつも通り早起きしても、なんかやって、二度寝してしまいました。
結局起きたのは6時半です。薬すごい。

眠くなるけれどその代わりに体は楽です。
さすが薬。

体は楽になるけれど、薬ではウィルスは活性化を止めれないという。
ウィルスすげー。

ま、そのウィルスを不活性にするのは人間なので、人間すげーとなるのですが、そもそもウィルスって石鹸程度で不活性になりますから、発症するやつの自己管理ができていないってだけですかね。

2014年11月19日水曜日

風邪引いたか

風邪。
でもそれとは関係なく早く目覚めるようになりました。
4時半に安定してます。

昨日はどうしてもはずせない用事があったので、しんどかったけど、葛根湯2本飲んだらかなり楽になりました。でも、薬は薬で効果時間があって、切れると、戻りました。
疲労もあったかな。

治るまで走るのはやめよう。

2014年11月18日火曜日

ない

今日は3時半に起きました。
余裕ある生活、いいね。

今朝は論文読んだだけで何も作ってない。

2014年11月17日月曜日

続・腰痛

怠けてしまった。6時半に起床。

おとといの運動で当日から腰の筋肉が痛い。
昨日からストレッチや軽い運動はしているけれど、これはいつ治るのかしら。

2014年11月16日日曜日

腰痛

昨日は走ったり飲んだりで一日が結構大変でした。

ロングストロークに腰を動かすことがあったので、昨日の時点で腰の筋肉が痛かったですが、今朝も続いて痛いです。
ま、そのうち治るでしょう。

2014年11月15日土曜日

朝焙煎

5時に起きるのは苦ではあるけれど、起きてしまえば眠気には勝てます。

今朝はコーヒーのストックが切れたので、焙煎してました。
30分以上かかる上に、結構面倒見ていないと、片面しか焼けなかったり、ムラができたりします。
今朝は適当に放置したせいで、黒に近い茶色になりました。まるでプーアル茶のような黒さ。

ま、いいっすわ。

2014年11月14日金曜日

靖子

5時半。

いつからだった覚えていないですが、Youtubeのホームページにはおすすめというのが出てきます。
この機能は、思考停止状態でも適当に動画を見れるだけでなく、新しい何かとの出会いを助けてくれます。その新しい何かは、だいたい広告目的の動画なのですが。

その広告目的の中に、先日、大森靖子という歌手が出てきました。
出てきたのはどうでもよいのです。今日の話題ではありません。
今日の話題は「靖子」という名前の読みについてです。

私は、これを直観的に、「やすこ」と読みます。
でもこの歌手の場合は「せいこ」と読みます。
確かに「せいこ」とも読めますが、直観的には「やすこ」です。
では、なぜ「やすこ」が直観的なのでしょう。
そもそも漢字に親しくない私が「靖」という漢字を知っていること自体が疑問です。

どこかでこの漢字を見たことがあるのだろうと思い、靖でググってみました。
靖国神社。
これです。靖国。やすくに。
国は「くに」と読むので、靖は「やす」と読むはずです。
国を子に取り換えると、靖子と書いて「やすこ」の読むはず。

なので、私は靖子を「やすこ」と読んだのです。
今まで関わった女性にこういう名前の人がいたのかとドキドキしたのですが、どうやら違ったようです。
自分の記憶に疑いを持っていたけど、疑いが晴れて良かった。

この大森靖子にはドキドキさせられました。なぜか毎日声を聴いています。

2014年11月13日木曜日

歪度と尖度

今日は5時半に起きました。
習慣になると楽なものです。

統計量について平均、分散、歪度、尖度と耳にすることはありますが、計算方法は平均と分散くらいしか知りませんでした。
暇だったので、歪度と尖度の計算法を調べてみると、結構簡単で、歪度は(残余/標準偏差)^3の総和/全数、尖度は(残余/標準偏差)^4の総和/全数でした。
https://onlinecourses.science.psu.edu/stat501/node/161

結構簡単な計算なので、もっと早くに知っておけばよかったと思いました。

2014年11月12日水曜日

朝ランニング

今日は5時50分に起きました。1時くらいに寝たので、だいたい5時間弱寝てます。

朝に時間があると、いろいろと活動したくなります。
そのひとつは運動です。
時間にも体力にも余裕があるので、ちょっと運動をしたくなります。
私の場合、コーヒーを一発淹れてから走っています。
以前、長距離を走って膝を痛めたことがあったので、また傷めないように短い距離にしています。
ささっと。30分かからないくらいで走り終えます。
こんな感じで、やれていなかったことができるようになってきます。

早起きは結構良いれす。

2014年11月11日火曜日

朝は飽きやすい

今日も早起きできました。
おかげでブログが書けます。
夜は時間がないので書けません。

9時ごろ寝て、起きたのは4時50分です。
その間目が覚めたのは2度あり、最初は1時、二度目は4時30分です。
たぶん慣れの問題です。

起きて1時間ほどネットを徘徊すると、飽きます。
夜のほうが飽きる感覚は少ない気がします。
朝、行動すると無駄を減らせるかもしれません。

2014年11月10日月曜日

早起き

今日から早起きを始めました。
5時40分に起きて、まず昨日焙煎したコーヒーを淹れました。
狙い通りシティに仕上げれました。

珈琲ネタで、最近知ったのはThird wave coffeeという言葉で、wikipediaを読む限り、こだわって出している店が増えてるね、的な意味らしいです。
Thirdがあるなら、First, Secondもあるのですが、これまたwikipediaを読む限り、First waveはFolgersで、Second waveはスタバ的なアレとのこと。
なるほど。朝コーヒーの専門ショップとかそんなのちゃっちぃ産業は関係ないらしい。

今後も波と呼ばれるような広がりは起こるかもしれませんね。
特に、コーヒーや茶のような人間の生活サイクルに入ったものは、起こしやすいのかもしれませんけど。

話は全然違いますが、ブログが見れるようになってます。
土曜日は確かにbloggerへのアクセスができなかったのになぁ。ドメインが変わった気もするけど、ま、いいわ。

2014年11月8日土曜日

不思議なこともあるもんだな。
今、このブログにはアクセスできないらしい。
でも、記事は書ける。
不思議だな。
噂のDNS乗っ取りの件かな。

2014年11月6日木曜日

Color transfer (以下略)の実装

かなり古い技術ですが、ReinhardらのColor transfer between imagesは宅で実装するにはちょうどいいのでやってみました。正しいかは知りませんが。

http://dl.acm.org/citation.cfm?id=618848
http://www.cs.tau.ac.il/~turkel/imagepapers/ColorTransfer.pdf
この技術を簡単に説明すると、心理を考慮した色空間で、画像Aの色の分布を画像Bの分布に似せると、画像Aの構図で画像Bっぽい画像Cができる、と言ったものです。

画像A
画像B
画像C
上の画像AとBの場合では、画像Cの緑の映え方が、Bっぽい印象になりました。
でも、Bの哀愁漂う雰囲気は引き継がれていない気がします。こういう微妙な印象は、変えれないのかもしれません。もしかしたら実装が間違っているのかもしれません。よくわかりません。

今日はうどんだな、なんて思ったら、うどんっぽい画像になる、とかそういうこともありません。
うどん
うどんの雰囲気を持つはずの画像
論文に書いてある通りに実装したつもりですが、どこか違っているのかもしれません。でも、ま、見た感じ合っているっぽいので、違っても誤差の範囲でしょう。

以下、C++コード


#include <iostream>
#include <fstream>
#include <vector>

#include <omp.h>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#if defined(_DEBUG) || defined(DEBUG)
#pragma comment(lib, "opencv_core247d.lib")
#pragma comment(lib, "opencv_highgui247d.lib")
#pragma comment(lib, "opencv_imgproc247d.lib")
#else
#pragma comment(lib, "opencv_core247.lib")
#pragma comment(lib, "opencv_highgui247.lib")
#pragma comment(lib, "opencv_imgproc247.lib")
#endif

void BGR2LSM(cv::Mat bgr, cv::Mat& lsm){
 double trans[] = {
  0.0402, 0.5783, 0.3811,
  0.0782, 0.7244, 0.1967,
  0.8444, 0.1288, 0.0241};
 lsm = cv::Mat::zeros(bgr.size(),CV_64FC3);
 for(int i=0;i<bgr.size().height;i++){
  for(int j=0;j<bgr.size().width;j++){
   for(int k=0;k<3;k++){
    double t = 0;
    for(int l=0;l<3;l++){
     if(0==bgr.at<cv::Vec3b>(i,j)[l]){printf("error\n");}
     t += trans[k*3+l]*(double)bgr.at<cv::Vec3b>(i,j)[l];
    }
    lsm.at<cv::Vec3d>(i,j)[k] = t;
   }
  }
 }
}
void LSM2BGR(cv::Mat lsm, cv::Mat& bgr){
 double trans[] = {
  0.0497,-0.2439,1.2045,
  -1.2186,2.3809,-0.1624,
  4.4679,-3.5873,0.1193};
 bgr = cv::Mat::zeros(bgr.size(),CV_8UC3);
 for(int i=0;i<bgr.size().height;i++){
  for(int j=0;j<bgr.size().width;j++){
   for(int k=0;k<3;k++){
    double t = 0;
    for(int l=0;l<3;l++){
     t += trans[k*3+l]*(double)lsm.at<cv::Vec3d>(i,j)[l];
    }
    if(t<0)t=0;
    if(t>255)t=255;
    bgr.at<cv::Vec3b>(i,j)[k] = t;
   }   
  }
 }
}

void LSM2logLSM(cv::Mat lsm, cv::Mat& logLSM){
 logLSM = cv::Mat::zeros(lsm.size(),CV_64FC3);
 for(int i=0;i<lsm.size().height;i++){
  for(int j=0;j<lsm.size().width;j++){
   for(int k=0;k<3;k++){
    logLSM.at<cv::Vec3d>(i,j)[k] = log(lsm.at<cv::Vec3d>(i,j)[k]);
   }
  }
 }
}

void logLSM2LSM(cv::Mat logLSM, cv::Mat& lsm){
 lsm = cv::Mat::zeros(logLSM.size(),CV_64FC3);
 for(int i=0;i<lsm.size().height;i++){
  for(int j=0;j<lsm.size().width;j++){
   for(int k=0;k<3;k++){
    lsm.at<cv::Vec3d>(i,j)[k] = exp(logLSM.at<cv::Vec3d>(i,j)[k]);
   }
  }
 }
}

void logLSM2LAB_Ruderman(cv::Mat logLSM, cv::Mat& lab){
 double trans[] = {
  1.0/sqrt(3.0), 1.0/sqrt(3.0), 1.0/sqrt(3.0),
  1.0/sqrt(6.0), 1.0/sqrt(6.0),-2.0/sqrt(6.0),
  1.0/sqrt(2.0),-1.0/sqrt(2.0), 0
 };
 lab = cv::Mat::zeros(logLSM.size(),CV_64FC3);
 for(int i=0;i<logLSM.size().height;i++){
  for(int j=0;j<logLSM.size().width;j++){
   for(int k=0;k<3;k++){
    double t = 0;
    for(int l=0;l<3;l++){
     t += trans[k*3+l]*(double)logLSM.at<cv::Vec3d>(i,j)[l];
    }
    lab.at<cv::Vec3d>(i,j)[k] = t;
   }
  }
 }
}

void LAB_Ruderman2logLSM(cv::Mat lab, cv::Mat& logLSM){
 double trans[] = {
  sqrt(3.0)/3.0, sqrt(6.0)/6.0, sqrt(2.0)/2.0,
  sqrt(3.0)/3.0, sqrt(6.0)/6.0,-sqrt(2.0)/2.0,
  sqrt(3.0)/3.0,-sqrt(6.0)/3.0, 0
 };
 logLSM = cv::Mat::zeros(lab.size(),CV_64FC3);
 for(int i=0;i<logLSM.size().height;i++){
  for(int j=0;j<logLSM.size().width;j++){
   for(int k=0;k<3;k++){
    double t = 0;
    for(int l=0;l<3;l++){
     t += trans[k*3+l]*(double)lab.at<cv::Vec3d>(i,j)[l];
    }
    logLSM.at<cv::Vec3d>(i,j)[k] = t;
   }
  }
 }
}

void BGR2LAB_Ruderman(cv::Mat bgr, cv::Mat &lab){
 cv::Mat lsm,logLSM;
 BGR2LSM(bgr,lsm);
 LSM2logLSM(lsm,logLSM);
 logLSM2LAB_Ruderman(logLSM,lab);
}

void LAB_Ruderman2BGR(cv::Mat lab, cv::Mat& bgr){
 cv::Mat lsm,logLSM;
 LAB_Ruderman2logLSM(lab,logLSM);
 logLSM2LSM(logLSM,lsm);
 LSM2BGR(lsm,bgr);
}

void average(cv::Mat im, cv::Vec3d &mean, cv::Vec3d &var)
{
 for(int k=0;k<3;k++){
  mean[k] = 0;
 }
 for(int i=0;i<im.size().height;i++){
  for(int j=0;j<im.size().width;j++){
   for(int k=0;k<3;k++){
    mean[k] += im.at<cv::Vec3d>(i,j)[k];
   }
  }
 }
 for(int k=0;k<3;k++){
  mean[k] /= im.size().height*im.size().width;
 }
 for(int i=0;i<im.size().height;i++){
  for(int j=0;j<im.size().width;j++){
   for(int k=0;k<3;k++){
    double t = im.at<cv::Vec3d>(i,j)[k]-mean[k];
    var[k] += t*t;
   }
  }
 }
 for(int k=0;k<3;k++){
  var[k] /= im.size().height*im.size().width;
 }
}

void correction(cv::Mat& source, cv::Mat target){
 cv::Vec3d smean,svar,tmean,tvar;
 average(source,smean,svar);
 average(target,tmean,tvar);
 cv::Vec3d ssd,tsd;
 for(int k=0;k<3;k++){
  ssd[k] = sqrt(svar[k]);
  tsd[k] = sqrt(tvar[k]);
 }
 for(int i=0;i<source.size().height;i++){
  for(int j=0;j<source.size().width;j++){
   for(int k=0;k<3;k++){
    double labd = source.at<cv::Vec3d>(i,j)[k] - smean[k];
    source.at<cv::Vec3d>(i,j)[k] = labd*tsd[k]/ssd[k]+tmean[k];
   }
  }
 }
}

void normalizeRangeVec3b(cv::Mat &im, int min, int max){
 for(int i=0;i<im.size().height;i++){
  for(int j=0;j<im.size().width;j++){
   for(int k=0;k<3;k++){
    im.at<cv::Vec3b>(i,j)[k] = 
     (double)(max-min)*(double)im.at<cv::Vec3b>(i,j)[k]/255.0 + min;
   }
  }
 }
}

int main(int argc, char* argv[])
{
 std::string sourcename = "a.jpg";
 std::string targetname = "b.jpg";
 cv::Mat source = cv::imread(sourcename);
 cv::Mat target = cv::imread(targetname);
 normalizeRangeVec3b(source,1,255);
 normalizeRangeVec3b(target,1,255);
 
 //Ruderman
 cv::Mat sourcelab, targetlab;
 BGR2LAB_Ruderman(source,sourcelab);
 BGR2LAB_Ruderman(target,targetlab);

 correction(sourcelab,targetlab);
 //reverce
 LAB_Ruderman2BGR(sourcelab,source);
 LAB_Ruderman2BGR(targetlab,target);
 cv::imwrite(targetname+"like"+sourcename,source);
 return 0;
}





LSM空間

心理系の色周辺で、色をLSM空間で表現することがあります。
こういうのは自前で持っていないと面倒なことが多いので、宅の暇な時間に、OpenCVのMat用に書いてみました。

画像処理ではReinhardらのColor Transfer between imagesで使われています。
http://dl.acm.org/citation.cfm?id=618848

以下、c++コード


void BGR2LSM(cv::Mat bgr, cv::Mat& lsm){
 double trans[] = {
  0.0402, 0.5783, 0.3811,
  0.0782, 0.7244, 0.1967,
  0.8444, 0.1288, 0.0241};
 lsm = cv::Mat::zeros(bgr.size(),CV_32FC3);
 for(int i=0;i<bgr.size().height;i++){
  for(int j=0;j<bgr.size().width;j++){
   for(int k=0;k<3;k++){
    double t = 0;
    for(int l=0;l<3;l++){
     t += trans[k*3+l]*(double)bgr.at<cv::Vec3b>(i,j)[l];
    }
    lsm.at<cv::Vec3f>(i,j)[k] = t;
   }
  }
 }
}

2014年11月3日月曜日

10月は5.6km

膝を軋むので、しばし安静に。