生活を良くします - 怠惰なプログラミング

生活を良くします-怠惰なプログラミング

外資系でエンジニアをやっています。便利なサービスや商品、プログラミングで作ったものなどを紹介していきます

jupyter notebookのインストールの方法と使い方 〜 ノート形式で逐次実行できるpythonエディタ

jupyter notebookとは

ノート形式のpython

グラフもその場で描画可能(Adobeの株価推移)
f:id:what_a_day:20161101192318p:plain
また、作成したグラフは.png形式になっているため、ドラッグ&ドロップでwordやメール、論文などに添付可能です。論文に添付する場合は、おそらく.epsに変換すると思いますが。
様々な種類のグラフを美しく描画可能
f:id:what_a_day:20161101233306p:plain
CSV形式から読み込んだデータで相関図を作成したり、温度分布のようなグラフを作ることさえ可能。このグラフはSeabornというライブラリを使用しています。
マークダウン形式に対応
f:id:what_a_day:20161101234336p:plain
このようにマークダウン形式でかけるので、慣れると普通のノートを取るよりも断然ラク。また、グラフが綺麗にかけてなおかつ作ったらすぐにレポートに貼り付けれるという点が魅力的。

jupyter notebookの始め方

ターミナル上にて実行

  1. brew install python3 // Python3をインストール
  2. python3 --version // Python3の確認
  3. pip3 install --upgrade pip
  4. pip3 install jupyter
  5. jupyter notebookと打ち込む

以下、詳細
ターミナルで以下のコマンドを打ちます。

python3 --version

これでPython 3.*.**などが返ってくれば問題無いです。(*はなんでもいいので数字)
返ってこない場合、Python3を入れましょう。

brew install python3 // Pythonが入っていない場合
pip3 install --upgrade pip
pip3 install jupyter

円形の個数を自動で全て数えてくれるプログラム(おまけ)

楽に正確に物体の個数を調べたい

jupyter上でやった理由は、テスト用の画像を与えた時に本当に正しく個数をカウントできているのかが視覚的に見やすいかなというのが主な点です。
また、個数を数えたのちグラフにしたりメモを取ったりするのもjupyter上で行えばレポート時にも記録用にも管理がしやすいからです。

行ったこと

この画像でテストをすることにしました。
f:id:what_a_day:20161102003321p:plain
画像の2値化
白を物体、またはノイズの色とし、黒をそれ以外の色とすると画像処理がしやすくなります。一定以下の大きさの白の要素はノイズ、それ以上は物体という様に分ける基準にもなります。
画像のオープニング・クロージング
ノイズを消し、本来は測定できる物体をより明確にして測定しやすくします。
今回は幸いにも綺麗な画像を使ったので大丈夫ですが、ノイズ除去には大切になってきます。
2値化され、オープニングされた後の画像
f:id:what_a_day:20161102003331p:plain
コード
とても汚くわかりづらいですが、直す気力がもう無いです。

import os
import cv2
import numpy as np
import os
from matplotlib import pyplot as plt

kernel = np.ones((5,5),np.uint8)

dir_save =None
cnt_emission_number = 0
dir = SAVE_DIRECTORY
    
dir_save = dir
if os.path.isdir(dir):
    
    file_path = FILE_PATH
        
    if not(os.path.isfile(file_path)):
        break
        
    img = cv2.imread(file_path,0)
                                img = cv2.erode(img,kernel,iterations = 1)
    img = cv2.erode(img,kernel,iterations = 1)
            
    img = cv2.dilate(img,kernel,iterations = 1)
    img = cv2.dilate(img,kernel,iterations = 1)

    ret,thresh1 = cv2.threshold(img,5,255,cv2.THRESH_BINARY)
             
    image = thresh1
    cv2.imshow('image',img)
    k = cv2.waitKey(0)
            
    if k == 27:         # wait for ESC key to exit
        cv2.destroyAllWindows()
    elif k == ord('s'): # wait for 's' key to save and exit
        cv2.imwrite('messigray.png',img) // select img you want to show
        cv2.destroyAllWindows()

    img_copy = np.copy(thresh1)
            
    contours = cv2.findContours(img_copy, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]

    min_coin_area = 1

    large_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_coin_area]

    cnt_emission_number += len(large_contours)

    if os.path.isdir(dir):
        print(dir_save + "  " + str(cnt_emission_number))

出力結果は9となったため、おそらくうまく動いていると思います。