完全に実力不足な理系大学生からの成長ブログ

プログラミング能力皆無、でも頑張ります。

Mac(OS Sierra)の初期化

こんにちは、クリスマスが近づいてきました。

相変わらず24日予定が無いと思われてるかもしれませんが、
僕は親戚が集まってクリスマスパーティーをすることになりました!やった!(?)

その前日には研究室でもクリスマスパーティーがあるので
過去に例がないくらいクリスマスに予定があるわけです。





さて、この記事は
Kogakuin Univ Advent Calendar 2016 - Adventar
の17日目の記事になります。
遅れてしまって申し訳ない(2016/12/19現在)

タイトルの通り、macの初期化についてです。

一応バージョンとか書くのが普通ですかね?

先ずはバックアップ!!

なんですけど・・・・・、



僕はiCloudに課金して50GBあるのでそこに全部ブッ込んであります。
だからバックアップは取ってません!

ここから初期化!!

とりあえずシステム終了で電源を切ります。

そのあと、command + R + 電源 の長押しで起動してください。
下の画面になったら手を離していいみたいです。
f:id:yori1029:20161217153610j:plain


しばらく待ってたら下の画面になります。
f:id:yori1029:20161217153624j:plain

ディスクユーティリティを選択してください。



f:id:yori1029:20161217153636j:plain
次に左側にあるMacintosh HDを選択してください。


f:id:yori1029:20161217153650j:plain
そしたら消去。


f:id:yori1029:20161217153707j:plain
フォーマットはMac OS Extendedにしてください。
はい、消去。


f:id:yori1029:20161217153745j:plain
そしたらディスクユーティリティは閉じます。

f:id:yori1029:20161217153757j:plainf:id:yori1029:20161217153842j:plain
ついにmacOSの再インストール!!
ここでWi-Fiに繋ぐ必要があった気がする。

指示に従って続ける。

f:id:yori1029:20161217153810j:plainf:id:yori1029:20161217153824j:plainf:id:yori1029:20161217153842j:plainf:id:yori1029:20161217153856j:plainf:id:yori1029:20161217153907j:plainf:id:yori1029:20161217153920j:plain

ここまでやったらかなり待たされます。

その後、ついに「ようこそ」

f:id:yori1029:20161217153932j:plain


各種設定をして…

f:id:yori1029:20161219144103p:plain

f:id:yori1029:20161217154002j:plain


完了!!
f:id:yori1029:20161217154016j:plain

なぜ初期化したのか

はい、これですね。


僕、パソコン詳しくないのに無理して技術的な内容書こうと思ったらダメになっちゃいました!笑

本当は頑張って調べればなんとかなったかもなんですけど笑
無能すぎてダメでした笑

終わりに

みなさん、僕みたいにならないように!!(普通ならない)

アドベントカレンダーの担当は今年最後なんですけど、
来年機会があったらやりたいし、技術的な内容かけるようにしたいなぁって思います。

自己分析ってどーやるの?

どうもこんにちは、そろそろクリスマスです。
12月24日は万が一予定が入った時のために空けてありますが、
予定が入る気配はないです。


さて、関係ないところから始まってしまいましたが
今年は大学のアドベントカレンダーに参加させてもらったので書かせていただきたいと思います。
4年生になってから強い人たちと関われてよかったなぁと思う今日この頃。
とってもありがたいことです。

この記事は、
Kogakuin Univ Advent Calendar 2016 - Adventar
2016 10日目の記事です。


僕は技術ネタほとんどないので就職活動について書こうかなって思います。

就活でやること

まぁまず初めになんですけど就職活動ってやることいっぱいあるんですよ。

たくさんある中、具体的になにすんねん!って一番思ったのが自己分析なのでそれについて書こうかなって思います。


自己分析ってなんのためにやるの?

なんでやるかわかってないとやる気でないですよね笑

目的は、ざっくり言うと自分を理解するためです。


だって、自分がどんな人間なのかわからないと、
何がしたくて何ができるとか考えられないですよね?


例えば、自分の力でバリバリ会社を動かしていきたい!っていう人には
個人の力で影響を与えにくい大企業は向きませんよね?

また、安定した生活を求める人はベンチャー企業には向いていないと思います。


このように自分が将来どのような仕事をしていたいかというイメージは人によって違うと思います。
まずは、このイメージを具体的にしておくことが大切です。
(ちなみに僕は無難に生活することをイメージしていました。)


さらにいうと仕事って生活の一部なわけで仕事以外のことも考えなきゃいけない。

生活を捨ててやりたいことがある人もいるかもしれない。

人と接することが好きなのか、嫌いなのか、

勉強するのが好きか否か、

どこに住みたいか、

実家がいいのか一人暮らしがいいのか、

どんな業界がいいか、



今適当に出しただけでも考えることってたくさんあるんです。
これらのことを考えないで就職してしまうと・・・



「え!?勤務先九州ですか!?」とか

「親もとから離れてないから一人暮らしできないんですか!?」とか

「え、そんなに人と会話しなきゃいけないんですか!?」とか

「プログラミングできなきゃいけないんですか!?」とか…

こんなことにならないようにして欲しいわけです。

自己分析ってどうやるの?

自己分析の時に確認しておきたいことって
さっきあげたようなことを自分で考えればいいんです。

世間一般でどういうやりかたが主流なのかはわかりませんが、
僕がどうやったかを書いていきます。

過去

でも現在の自分がなんでそういう考えを持っているのかっていうのは
過去の経験があるからですよね?

僕は生まれから現在まで、自分がどんな経験をして来たかを書き出しました。

  • 生まれ
  • 幼少期
  • 小学生
  • 中学生
  • 高校生
  • 大学生

の項目にわけて印象深かったことや、その時ごとに将来やりたいと思っていたことを書き出しました。

現在

現在の自分について考えるのが一番大事なのはもちろんです。
でも今の自分について何を考えればいいの?って話ですよね笑

人によって優先順位は色々あると思うんですけど、
何をするのが好きかを考えるのがいいんじゃないかなって思います。


綺麗事みたいになっちゃいますけど僕は、いろんな人の役に立てる仕事したいなーっていうのを軸にしてました。


プログラミングが好き!とか接客が好き!とか実務としてやりたいことでもいいですし、
ゲームが好きだから携わりたい!とか電車が好きだから鉄道会社がいい!とか

何か決めておくといいと思います。


あとは長所や短所ですかね。
面接の場面でも聞かれるので非常に重要です。

ここで自己分析じゃなくって他己分析っていうのになっちゃうんですけど
身近な人に自分の長所と短所を確認するっていうのも大事だと思います。

今回は自己分析のお話なので、面接とか自己PRのお話は
あんまりしないんですけど

短所を面接で話すときは

どのように改善しようとしてる、とか
こういうことにいきることがある、とか
そういうのがあったほうがいいです。笑



ーーーーーーーー時は就活初期ーーーーーーーー

面接官「長所と短所を教えてください。」
僕「長所は〇〇で〜短所は後始末が悪いところです!!」
面接官「・・・・・・後始末悪いのどうするんですか?笑」
僕「あ、頑張ってなおそうとしtm・・・」

みたいにならないように!!笑

未来

就職後のことを考えるんだから必須ですね。
今まで自分を振り返って来たことを踏まえて、未来の自分がどうありたいかを考えてください。


仕事はもちろんですけど、


どこで暮らしたいか


どんな生活をしたいか

自己分析の後に

自己PRを書いてみてください。

過去に自分の強みが〇〇で役に立ちました、とかいうエピソード
現在自分は〇〇しています、〇〇に自信あります
これらを活かして自分は〇〇なことをしたいです。

自己分析やった後に書くと書きやすいんじゃないかなって思います。

最後に

あんまブログとか書かないんでダラダラした内容になっちゃいました笑
技術ネタ書けるレベルになれたらいいなぁーとか思ってます。

OpenCV + NumPy で画像の周波数フィルタ

プログラムが正しく動いていないことを確認しました。
修正まで少々お待ち下さい。2016/07/29

こんにちは、よりです。
今回は画像とフィルターをフーリエ変換し、周波数空間でフィルター処理を行います。

流れ

  1. 元画像をフーリエ変換
  2. フィルターをフーリエ変換
  3. 画素ごとに乗算
  4. 逆変換

大まかにはこんな感じです。
細かい点を補足するとフィルターをフーリエ変換するときの画像サイズですね。
元画像と同じサイズにしてからフーリエ変換します。


今回の入力画像はこちら。
f:id:yori1029:20160705105925j:plain

いつも通りです。

ではコードを見てみましょう。(めっちゃ汚いけど。)

import cv2
import numpy as np

image = cv2.imread("lena.png", 0)
cv2.imshow("in",image)

#画像のフーリエ変換
fimage = np.fft.fft2(image)
"""
outfimage = np.log(np.abs(fimage) + 1)
outfimage = outfimage / np.amax(outfimage) * 255
outfimage = outfimage.astype(np.uint8)
cv2.imshow("fftimage",outfimage)
cv2.imwrite("fftimage.png",outfimage)
"""
#単純平滑化フィルタ
a = np.array([[1/25.0, 1/25.0, 1/25.0, 1/25.0, 1/25.0],
              [1/25.0, 1/25.0, 1/25.0, 1/25.0, 1/25.0],
              [1/25.0, 1/25.0, 1/25.0, 1/25.0, 1/25.0],
              [1/25.0, 1/25.0, 1/25.0, 1/25.0, 1/25.0],
              [1/25.0, 1/25.0, 1/25.0, 1/25.0, 1/25.0]])

#画像サイズを0で初期化した配列を用意
A = np.zeros((512,512)) 

#用意した配列にフィルターをコピー
A[0:5, 0:5] = a[0:5, 0:5]

#フィルターのフーリエ変換
fa = np.fft.fft2(A)
"""
outfa = np.log(np.abs(fa) + 1)
outfa = outfa / np.amax(outfa) * 255
outfa = outfa.astype(np.uint8)
cv2.imshow("fftfa",outfa)
cv2.imwrite("fftfa.png",outfa)
"""
#要素ごとの乗算
outimg = fa * image
"""
foutimg = np.log(np.abs(outimg) + 1)
foutimg = foutimg / np.amax(foutimg) * 255
foutimg = foutimg.astype(np.uint8)
cv2.imshow("aftimg",foutimg)
cv2.imwrite("aftimg.png",foutimg)
"""

#逆変換
fout = np.fft.ifft2(outimg)
out = fout.real + 128l
out = out.astype(np.int8) 
cv2.imshow("out",out)

cv2.waitKey(0)

コメントにしている部分は出力ようなのでスルーしてください。
この処理で周波数空間でのフィルター処理ができます。

5×5の単純平滑化フィルタなのでボケ画像が出力されますね。
f:id:yori1029:20160713011136p:plain

ボケてるのがわかりますよね?


一応周波数空間に変換した時の画像も載せておきます。

まず画像のフーリエ変換
f:id:yori1029:20160713011233p:plain


次にフィルターのフーリエ変換
f:id:yori1029:20160713011259p:plain


最後にこれら二つを要素ごとに乗算したもの(逆変換前)
f:id:yori1029:20160713011336p:plain


他のフィルターも試してみたいですね!
(試さずに終わり)

OpenCVでフーリエ変換(dft)2 表示編

こんにちは、よりです。
今日は下記の記事で紹介したフーリエ変換をした後の画像の表示方法を紹介したいと思います。
yori1029.hatenablog.com

とはいえ手探りで頑張ってるので私のメモ程度のレベルです。
今回はさくさく行きましょう、表示するだけやし。

前回の記事を参照してもらうとわかるんですけど dft 後のデータって2チャンネルになってるし虚部があるから扱いにくいよなーって感じです。
それを何とかして、よく見るフーリエ変換後の画像にしていきたいと思います。


全体の流れとしては

  1. フーリエ変換したデータを実部と虚部に分ける
  2. すべて実数にする(二乗して平方根
  3. 表示用に対数に変換する
  4. 表示位置を変更する(よく見るフーリエ変換後の画像にする)

って感じです。

今回フーリエ変換する画像はこちら。
f:id:yori1029:20160705105925j:plain



正直全然大したことないので参考にしたサイトのURLとコードを載せます。
下記のサイトの関数 create_fourier_magnitude_image_from_complex を参考に書きました。

opencv_sample_list_jp/main.cpp at master · YusukeSuzuki/opencv_sample_list_jp · GitHub


それでは私のわかりにくいコードも載せます。

#include <iostream> 
#include <cmath>
#include <string>
#include <sstream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <ctype.h>

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
	//入力
	Mat image = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);
	
	//フーリエ変換用Mat
	Mat furimg;

	//実部のみのimageと虚部を0で初期化したMatをRealImaginary配列に入れる
	Mat RealIamginary[] = { Mat_<float>(image), Mat::zeros(image.size(), CV_32F) };
	
	//配列を合成
	merge(RealIamginary, 2, furimg);

	//フーリエ変換
	dft(furimg, furimg);

	//表示用
	Mat divdisplay[2];

	//フーリエ後を実部と虚部に分ける
	split(furimg, divdisplay);

	//表示用にすべて実数に
	Mat display;
	magnitude(divdisplay[0], divdisplay[1], display);

	//対数に変換する(そのため各ピクセルに1を加算)
	display += Scalar::all(1);
	log(display, display);

	//表示用に正規化
	Mat outdisplay;
	normalize(display, outdisplay, 0, 1, CV_MINMAX);

	namedWindow("aftdft");
	imshow("aftdft", outdisplay);

	waitKey(-1);

	return 0;

}


実行すると下図が出てきます。


f:id:yori1029:20160705093146p:plain


これは画像をフーリエ変換し、それを可視化したものです。
しかし普段みるフーリエ変換後の画像とは異なってますよね?
普段見るのは白い部分が中心にきてると思いますが、それは見やすいように変換している画像です。
では変換してみましょう。

追加した部分がわかるように書いたのでそこだけ見てもらえれば大丈夫です。

#include <iostream> 
#include <cmath>
#include <string>
#include <sstream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <ctype.h>

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
	//入力
	Mat image = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);
	
	//フーリエ変換用Mat
	Mat furimg;

	//実部のみのimageと虚部を0で初期化したMatをRealImaginary配列に入れる
	Mat RealIamginary[] = { Mat_<float>(image), Mat::zeros(image.size(), CV_32F) };
	
	//配列を合成
	merge(RealIamginary, 2, furimg);

	//フーリエ変換
	dft(furimg, furimg);

	//表示用
	Mat divdisplay[2];

	//フーリエ後を実部と虚部に分ける
	split(furimg, divdisplay);

	//表示用にすべて実数に
	Mat display;
	magnitude(divdisplay[0], divdisplay[1], display);

	//対数に変換する(そのため各ピクセルに1を加算)
	display += Scalar::all(1);
	log(display, display);

	//ここから下を追加
	//___________________________________________

	const int halfW = display.cols / 2;
	const int halfH = display.rows / 2;

	Mat tmp;

	Mat q0(display,
		Rect(0, 0, halfW, halfH));
	Mat q1(display,
		Rect(halfW, 0, halfW, halfH));
	Mat q2(display,
		Rect(0, halfH, halfW, halfH));
	Mat q3(display,
		Rect(halfW, halfH, halfW, halfH));

	q0.copyTo(tmp);
	q3.copyTo(q0);
	tmp.copyTo(q3);
	q1.copyTo(tmp);
	q2.copyTo(q1);
	tmp.copyTo(q2);

	//____________________________________________
	//ここから上を追加

	//表示用に正規化
	Mat outdisplay;
	normalize(display, outdisplay, 0, 1, CV_MINMAX);

	namedWindow("aftdft");
	imshow("aftdft", outdisplay);

	waitKey(-1);

	return 0;

}

上記のものを実行すると下図がでてきます。
f:id:yori1029:20160705094156p:plain


これで画像のフーリエ変換を可視化することができました!!

OpenCVでのフーリエ変換(dft)


はじめまして、よりです。
今回ブログを書く決意をしたのはやったことを忘れないようにメモしようと思ったからです。


OpenCVでは離散フーリエ変換用の関数 dft が用意されています。
これをつかってフーリエ変換したいと思います。
下記のサイトに dft の解説がありますが基本的には dft(Mat(入力),Mat(出力)) って感じです。
配列操作 — opencv 2.2 documentation


さっそくフーリエ変換するぞー!!

int main(int argc, char **argv)
{
        //入力
	Mat image = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE); 

    //出力配列の用意
	Mat imgout;

    //フーリエ変換
	dft(image, imgout);

	return 0;

}

はい、エラー出ました。
出力結果
OpenCV Error: Assertion failed (type == CV_32FC1 || type == CV_32FC2 || type == CV_64FC1 || type == CV_64FC2) in cv::dft, file ..\..\..\modules\core\src\dxt.cpp, line 2506

英語が読めないのでよくわからないんですけど dft に入れるMatのtypeがよくないんですかね。
というわけで現在入力している画像の詳細を見てみます。

void checkMat(Mat m1) {
	// 行数
	std::cout << "rows:" << m1.rows << std::endl;
	// 列数
	std::cout << "cols:" << m1.cols << std::endl;
	// 次元数
	std::cout << "dims:" << m1.dims << std::endl;
	// サイズ(2次元の場合)
	std::cout << "size[]:" << m1.size().width << "," << m1.size().height << std::endl;
	// ビット深度ID
	std::cout << "depth (ID):" << m1.depth() << "(=" << CV_64F << ")" << std::endl;
	// チャンネル数
	std::cout << "channels:" << m1.channels() << std::endl;
	// (複数チャンネルから成る)1要素のサイズ [バイト単位]
	std::cout << "elemSize:" << m1.elemSize() << "[byte]" << std::endl;
	// 1要素内の1チャンネル分のサイズ [バイト単位]
	std::cout << "elemSize1 (elemSize/channels):" << m1.elemSize1() << "[byte]" << std::endl;
	// 要素の総数
	std::cout << "total:" << m1.total() << std::endl;
	// ステップ数 [バイト単位]
	std::cout << "step:" << m1.step << "[byte]" << std::endl;
	// 1ステップ内のチャンネル総数
	std::cout << "step1 (step/elemSize1):" << m1.step1() << std::endl;
	// データは連続か?
	std::cout << "isContinuous:" << (m1.isContinuous() ? "true" : "false") << std::endl;
	// 部分行列か?
	std::cout << "isSubmatrix:" << (m1.isSubmatrix() ? "true" : "false") << std::endl;
	// データは空か?
	std::cout << "empty:" << (m1.empty() ? "true" : "false") << std::endl;

	cout << endl;
}

この関数を使えば中身がだいたい分かりそうですね。
下記のサイトのcv::Matの様々なプロパティに載ってます。
cv::Matの基本処理 — OpenCV-CookBook

出力結果
rows:512
cols:512
dims:2
size[]:512,512
depth (ID):0(=6)
channels:1
elemSize:1[byte]
elemSize1 (elemSize/channels):1[byte]
total:262144
step:512[byte]
step1 (step/elemSize1):512
isContinuous:true
isSubmatrix:false
empty:false

いろいろ調べた結果、フーリエ変換をした時に出てくる複素数を扱うためにはMatのチャンネルを2にする必要があるそうです。
今回imageに画像を入れましたがこのままだと1チャンネルしかないようなので2チャンネルにします。
mergeという関数が適しているようなのでこれを用いましょう。
mergeさせるのはimageと同じ大きさの複素数のMatです。

int main(int argc, char **argv)
{
	//入力
	Mat image = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);
	
	//フーリエ変換用Mat
	Mat furimg;

	//実部のみのimageと虚部を0で初期化したMatをRealImaginary配列に入れる
	Mat RealIamginary[] = { Mat_<float>(image), Mat::zeros(image.size(), CV_32F) };
	
	//配列を合成
	merge(RealIamginary, 2, furimg);

	//フーリエ変換
	dft(furimg, furimg);

	return 0;

}

今回はエラーが出ませんでした!
おそらくfurimgにフーリエ変換後の値が入っていると思います。

今日はこれからバイトなのでここまで。