% 移動平均フィルターとエッジ抽出(FreeMat,MATLAB)
XX=imread('C:\FreeMat\2_1 EdgeDetect\An00.png');
XX=double(XX)./255;
YY=0.299*XX(:,:,1)+0.587*XX(:,:,2)+0.114*XX(:,:,3);
YY=(YY(:,1:end-3)+YY(:,2:end-2)+YY(:,3:end-1)+YY(:,4:end))./4;
YY=(YY(1:end-3,:)+YY(2:end-2,:)+YY(3:end-1,:)+YY(4:end,:))./4;
YY=(abs(YY(1:end-2,1:end-2)-YY(2:end-1,1:end-2))<0.005 & ...
abs(YY(1:end-2,1:end-2)-YY(1:end-2,2:end-1))<0.005);
imwrite(YY,'C:\FreeMat\2_1 EdgeDetect\An01.png');
% カラー写真の右半分の色の変化を階段状にする(FreeMat)
% 左右に同じ写真をコピーしておいて、変化具合を見比べます。
% Windowsペイントで、塗りつぶし機能と写真の左半分から色を選ぶ機能で修正して仕上げます。
XX=imread('D:\ichi\android.png'); YY=double(XX)./255;
YY(:,400:end,:)=round(YY(:,400:end,:).*5)./5;
imwrite(YY,'D:\ichi\Android01.png');
上の写真は右半分(400より右)だけの画像です。
少しずらせて撮影した2枚の写真を用いて対象までの距離を計算する。5000x3000の画像での計算時間はMATLABで2分。1000x700なら数秒です。
# matlabの計算時間 0.38 秒
s=sum(1:100000000)
# pythonの計算時間 10秒
s=sum(range(1,100000001));print(s)
ただし、プログラムはやや複雑ですがpythonでもnumpyをimportすれば早くなります。
pythonでは時間を計るのにimport timeも必要です。
# pythonの計算時間 0.9 秒
import numpy as np;
a=np.arange(1,100000001,dtype=np.int64);
print(a.sum());
% FreeMatの計算時間 25秒
s=sum(1:100000000)
% 板書や新聞記事のスマホ写真を見やすくするプログラム。
% ペイントなどで加筆修正して残せます。プログラムは3行だけ。
X=imread('IMG_20160611_143309.jpg');% デジカメ写真を読み込む
% 次の行の数値は写真の写り具合で適宜修正する。
A=(abs(X(:,:,1)-X(:,:,2))<50 & abs(X(:,:,2)-X(:,:,3))<50 & X(:,:,2)>120);
imwrite(A,'wbAI.png','png') % 作成する写真に名前を付ける(png写真の場合)
FreeMatでBingoゲームアプリを作成しました(MATLABでは少し修正が必要です)。
プログラミングの練習問題です。
「ランダムに1~75までの整数(自然数)を表示し、一度出た番号は二度と出ないようにするアルゴリズムを考えよ。」
http://prezi.com/f18prgwtjfyp/?utm_campaign=share&utm_medium=copy
パソコンでfull screenにして→でスライドを進めるとダイナミックに見えます。
mp4はOKですがgifはNGでした。無料版の作成コンテンツは全て公開になります。ゼミの学生さんが研究発表大会で自主的にこれを使ってプレゼンしたので私もやってみました。使い方はこちらにあります。
https://prezi.com/qf7ld288r5om/prezi/
jpg写真を http://www.bannerkoubou.com/anime/ でgifにしました。
※シャバーニサンプル画像は商用利用不可です。
まず、上のような白黒画像を用意します。画素の数値は白いほど大きく、黒いほど小さくなっています。縦横の座標の値とこの数値で3次元データとして、それをいろんな角度から正射影して、その位置に元のゴリラの写真の画素値を入れることで、複数枚の平面画像(写真)を作成します。それをMovieMakerで動画に変換したのがイケメンゴリラの動画です。
X=imread('C:\FreeMat\9_5_EnlargeMov\Rurikei000.jpg');
CPy=size(X,1)/2; CPx=size(X,2)/2; kkk=0;
Wy=size(X,1)/2; Wx=size(X,2)/2; Par=1.0;
for k=1:70
if k<=58
Par=Par*0.98; CPy=CPy-10; CPx=CPx-10;
STy=CPy-Wy*Par; ENy=CPy+Wy*Par; STx=CPx-Wx*Par; ENx=CPx+Wx*Par;
else
CPx=CPx+200; STy=CPy-Wy*Par; ENy=CPy+Wy*Par; STx=CPx-Wx*Par;
ENx=CPx+Wx*Par;
end
STy=ceil(STy); ENy=ceil(ENy); STx=ceil(STx); ENx=ceil(ENx);
XX=X(STy:ENy,STx:ENx,:);
kkk=kkk+1
LabelA=[char('Ruri'), num2str(kkk,'%02d'),char('.jpg')];
Imf=fullfile('C:\FreeMat\9_5_EnlargeMov\',LabelA);
imwrite(XX,Imf);
end
% MyColormapRep.m これで作成したjpgをgif動画に変換しました。
% FreeMatでは path を記入する。
XX=imread('IMG_20151026_151945.jpg');
XX=1-double(XX)./255; YY=XX; i=0; XX(:,:,:)=XX(:,:,:).^1.5;
for k=5:0.1:20
YY(:,:,:)=(cos(XX(:,:,:)*k*pi)+1)/6+XX(:,:,:).*(2/3);
YY(:,:,3)=zeros(size(YY(:,:,3))); i=i+1;
LabelA=[char('御堂筋'), num2str(i,'%04d'),char('.jpg')];
imwrite(YY,LabelA);
end
% FixSizeB.m (MATLAB) 写真を切り取り,サイズと位置を合わせる。
% ただし、位置はクリックする2箇所のみ。
A=1.0;
XX=imread('C:\Users\ichihashi\Desktop\FukuHigu\Fuku24.png');
% 福沢諭吉 樋口一葉 jpeg写真の読み込み
XX=double(XX)./255; image(XX); Sz=size(XX);
Z1 =[342 205]; Z2 =[258 259]; % 事前に実行してコマンドウインドウに出た値
X1=Z1(1)+round((Z1(1)-Z2(1))*A); X2=Z2(1)-round((Z1(1)-Z2(1))*A); % 広げる
Y1=Z1(2)-round((Z2(2)-Z1(2))*A); Y2=Z2(2)+round((Z2(2)-Z1(2))*A); % 広げる
CutA=zeros(Y2-Y1+1,X1-X2+1,3); SzA=size(CutA);
[Z]=ginput(1); Z1=round(Z) % 範囲の右上の座標
[Z]=ginput(1); Z2=round(Z) % 範囲の左下の座標
X1=Z1(1)+round((Z1(1)-Z2(1))*A); X2=Z2(1)-round((Z1(1)-Z2(1))*A); % 広げる
Y1=Z1(2)-round((Z2(2)-Z1(2))*A); Y2=Z2(2)+round((Z2(2)-Z1(2))*A); % 広げる
CutB=XX(Y1:Y2,X2:X1,:); SzB=size(CutB);
CutC=zeros(SzB(1),SzA(2),3); SzC=size(CutC);
for i=1:SzA(2)
ii=ceil(i*SzB(2)/SzA(2)); CutC(:,i,:)=CutB(:,ii,:);
end
for i=1:SzA(1)
ii=ceil(i*SzB(1)/SzA(1)); CutA(i,:,:)=CutC(ii,:,:);
end
image(CutA)
imwrite(CutA,'C:\Users\ichihashi\Desktop\FukuHigu\FukuHigu04.png');
Dancing.gif 文字のダンス (FreeMat, MATLAB)
% 作成したjpg写真を http://www.bannerkoubou.com/anime/ でgifにしました。
% DanceChara.m
W=50; XX=imread('C:\FreeMat\9_1_MovChara\Shak.png');
XX=double(XX)./255; YY=zeros(size(XX));
for kkk=1:7
for i=1:size(XX,1)
for j=1:size(XX,2)
b=i/size(XX,2)*W+(kkk-1)*1; % b=j/size(XX,2)*W+(kkk-1)*1;
y1=round(sin(b)*20); y2=j+y1;
if y2>size(XX,2) y2=size(XX,2); end; if y2<=0 y2=1; end
YY(i,j,:)=XX(i,y2,:);
end
end
LabelA=[char('C:\FreeMat\9_1_MovChara\Shak2'), num2str(kkk,'%03d'),char('.jpg')];
imwrite(YY,LabelA);
end