tata色々な備忘録

データ解析、画像解析、化学分析などなど

python+Opencvによる画像処理10(線や文字の書き込み)

画像にスケールを書き込む必要があり、線や文字の書き込み法を調べたのでメモ。

(1) 線の書き込み
cv2.line(image,(start_x,start_y),(end_x,end_y),color,thickness)
(2)文字の書き込み
cv2.putText(image,text,(start_x,start_y),font, font size,color)

フォントの種類(これのみ、日本語は多分不可)

FONT_HERSHEY_COMPLEX
FONT_HERSHEY_COMPLEX_SMALL
FONT_HERSHEY_DUPLEX
FONT_HERSHEY_PLAIN
FONT_HERSHEY_SCRIPT_COMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_HERSHEY_SIMPLEX
FONT_HERSHEY_TRIPLEX
FONT_ITALIC
実行結果

f:id:tatabox2000:20141006011119p:plain

参考

Drawing Functions in OpenCV — OpenCV 3.0.0-dev documentation

PyQt(PySide)とOpenCVで画像処理その5(イベントフィルター)

前回の続きということで、マウス操作にてカーソル位置の取得を行う。 PyQt(PySide)とOpenCVで画像処理その4(右クリックメニュー) - tataboxの備忘録

イベントフィルターを使用する。 前回のコードに下記を追加

 def __init__(self, parent = None):
 
・
・
・
 
#ここから
        #イベントフィルターの追加
    self.pic_View.installEventFilter(self)


 #イベントフィルター時に実施する関数
 def eventFilter(self, source, event):
    #画像表示部の情報をマウスボタンを押す際に取得
       if (event.type() == QtCore.QEvent.MouseButtonPress and source is self.pic_View):
    #右クリックはコンテキストメニュー用に例外処理
        if event.button() == QtCore.Qt.RightButton:
            pass
        else:
     #マウス位置の取得
            pos = event.pos()
     #メッセージボックスで表示
            msgbox = QtGui.QMessageBox(self)
            msgbox.setText('mouse position: (%d, %d)' % (pos.x(), pos.y()))
     #メッセージボックスの表示
            ret = msgbox.exec_()
   #戻り値が必要
    return QtGui.QWidget.eventFilter(self, source, event)

左orホイールクリックで、メッセージボックスにカーソルの座標が表示される

f:id:tatabox2000:20140916193929j:plain

ホイールに拡大縮小、左クリックに元倍率、右クリックにコンテキストメニューを割り振る予定。

参考

python - PyQt: how to handle event without inheritance - Stack Overflow

PyQt(PySide)とOpenCVで画像処理その4(右クリックメニュー)

前回の続き。コンテキストメニュー(右クリックメニュー)の追加方法について。

PyQt(PySide)で画像処理その3(OpenCVとの連携) - tataboxの備忘録

main_setup.pyに下記を追記

 def __init__(self, parent = None):
 
・
・
・
 
#ここから
        pic_view = self.pic_View
    #コンテキストメニューの表示
        pic_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    #コンテキストメニューを定義する関数との接続
        pic_view.customContextMenuRequested.connect(self.contextMenue)

 def contextMenue(self,event):
    #メニュー(Qメニュー)
        menu = QtGui.QMenu()
    #項目名と実行する関数の設定
    menu.addAction('canny',self.make_canny)
    menu.addAction('test1',self.make_canny)
    menu.addAction('test2',self.make_canny)

    #マウス位置に出現
        menu.exec_(QtGui.QCursor.pos())

右クリックでメニューが追加表示される。

f:id:tatabox2000:20140916184209j:plain

PyQt(PySide)で画像処理その3(OpenCVとの連携)

前回の続き。
PyQt(PySide)で画像処理その2(GUI動作設定の基本) - tataboxの備忘録

今回はExecuteボタンを押すと1)表示画像をOpencvにてエッジ検出し、 2)GUIにて元画像と重ねて表示するコードを作成する。

OpenCVにて画像処理する下記のコードを作成し、opencv_test.pyという名前で、他のファイルと同じフォルダに保存する。

main_setup.pyを下記のように編集して、先ほどのopencv_test.pyと連携させる。

実行結果

(ファイル選択後にExecuteボタンを押す) f:id:tatabox2000:20140902185241j:plainf:id:tatabox2000:20140902185324j:plain

このように、Opencvにてエッジ検出した画像が表示される。

参考
python - How to configure color when convert numpy array to QImage? - Stack Overflow

PyQt(PySide)で画像処理その2(GUI動作設定の基本)

PyQt(PySide)で画像処理(その1) - tataboxの備忘録

前回の続き。

画像と重なるため、若干レイアウトを変更しました。

f:id:tatabox2000:20140901000714p:plain

というわけで、Qtで画像を開き、画像に合わせてフレームのサイズを変更するコードです。

前回作成したpyqt_Opencv.pyと同じフォルダに下記のファイルを入れます。

from PySideを PyQt4に書き換えることでPyQtでも動作します。

重要ポイントは下記の3つ
(1)前回生成したフォームの引き継ぎ

生成ファイルからUi_(+メインウィンドウ名)のクラスを
インポートすることで、フォームを引き継ぎます。

"""生成されたフォームのファイルからフォームをインポート"""
from pyqt_Opencv import Ui_Qt_CV_MainWindow
(2)シグナル&スロット

シグナル&スロット(実行関数)には幾つかの表記法がありますが、今回は以下の書式です。 QtCore.QObject.connect(操作オブジェクト名,QtCore.SIGNAL("シグナル名"),実行する関数名)

"""シグナル&スロット:file_buttonをクリックすると、open_file関数を実行"""
    QtCore.QObject.connect(self.file_button, QtCore.SIGNAL("clicked()"), self.open_file)
(3)おまじない1、2

意味は以下の通りです。クラス名は任意。
1)インポートしたフォームを取り込んで初期化
2)クラスの実行

実行結果(例)

1)Fileボタンを押し、画像ファイルを選択
2)画像とアドレスが表示され、画像に合わせて全体がリサイズ
f:id:tatabox2000:20140901003248p:plain

次はOpencvとの連携について書きます。

続きます(気力があれば)

PyQt(PySide)で画像処理その1(GUIの作成)

久々の更新。

PyQt(やPySide)とOpenCVで画像処理GUIアプリを作ってみる。
※8/31追記 guiqwtはpysideで動かない⇒graphics Viewに変更

1.画面レイアウトの作成

(1)メイン画面

QtDesignerを立ちあげてMainwindowを選択(MacはQt Createrから作成)。

f:id:tatabox2000:20140831133553p:plain

(2)ウィジット(部品)の配置

左のツリービュー(ウィジットボックス)からアイコンをドラッグし、 下記のようにレイアウトする。

f:id:tatabox2000:20140831140941p:plain

使用したウィジットは下記の通り
・Push Button
LCD Number
・Graphics Vier
・Horizontal Slider
・LineEdit
※追記 guiqwtはpysideで動かない⇒graphics Viewに変更

ウィジットボックス中のLayoutの項目で整列できる。適宜活用しましょう。

(3)名称の記入

アイコンやファイルメニューをクリックしてボタンなどに表記する(目的とリンクさせる)。

f:id:tatabox2000:20140831163401p:plain

(4)各ウィジットに名前をつける

右側にあるオブジェクトインスペクタにてウィジット(部品)に名前をつける。
名前を機能とリンクさせて分かりやすくすると良い感じ。

f:id:tatabox2000:20140831142534p:plain

今回はこの名前に設定。 f:id:tatabox2000:20140831212131p:plain

(4)ウィジットのプロパティ

1)画面中央のimagewidgetを選択し、プロパティウィンドウにて mousetrackingにチェックを入れる。
2)Sliderにはプロパティ中のQAbstractSliderにてmaximumの値を254(上2つ)、260000(最下段)に設定。用途は下記の予定。
・254 ;色の閾値最大と最小
・90000:面積の閾値(QLcdnumberの最大値)

f:id:tatabox2000:20140831151506p:plain

(5)シグナルとスロット

シグナル:作業者の動作(テキストを記入した、マウスをクリックしたなど)
スロット:受信側の挙動(テキストの反映、表示など)

f:id:tatabox2000:20140831153759p:plain

今回は下記のシグナルとスロットを対応させている。
・ファイルメニューのQuit⇒MainWindow終了
・各種スライダーの値変更⇒LCDに反映
LCD脇のテキストボックス値変更⇒LCDに反映

(6)保存とpythonコードへの変換

pyqt_Opencv.uiとして適当なフォルダに保存する。 コマンドラインにてそのフォルダへ移動して下記のコマンドを実行する。

$ pyuic4 -i 0 -x pyqt_Opencv.ui -o pyqt_Opencv.py  

PySideの場合は下記

$ pyside-uic -o pyqt_Opencv.py pyqt_Opencv.ui  

ライセンスに関してはPyQtGPL、PySideはLGPLなので、商用するならPySideっすね。

続く(気力があれば)

pythonで散布図行列

pandasを使用して散布図行列や箱ひげを書いてみる。
データはirisを使用。
https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv
(日本語環境テストのため、Nameを種類、lengthを長さ、widthを幅に置換して使用)

前提条件のmatplotlib日本語環境はこちら http://tatabox.hatenablog.com/entry/2013/07/21/025603

# -*- coding: cp932 -*-
import pandas as pd
import numpy as np
from pandas.tools.plotting import radviz

'''matplotlibの日本語環境'''
from matplotlib import rcParams
rcParams['font.family'] = 'IPAexGothic'
rcParams['font.sans-serif'] = ['IPAexGothic']
import matplotlib.pyplot as plt

'''データの読み込み。Windows環境はencoding='cp932'必須'''
iris = pd.read_csv('.//iris.csv',index_col=0,encoding='cp932')

'''最初の5つを表示'''
print iris.head(n=5)

'''概要'''
print iris.describe()

'''相関係数行列とCSV出力'''
iris_corr=iris.corr()
print iris_corr
iris_corr.to_csv('iris_corr.csv')

'''散布図行列'''
pd.scatter_matrix(iris,color='green',diagonal='kde',figsize=(6,6))

'''radviz'''
plt.figure()
radviz(iris,u"種類")

'''箱ひげ'''
iris.boxplot(by=u"種類")

plt.show()

[f:id:tatabox2000:20131103123607p:plainf:id:tatabox2000:20131103123608p:plainf:id:tatabox2000:20131103123606p:plain

他だとpyvttblが良さそう。
https://pyvttbl.googlecode.com/hg-history/0315dcd0bc2fba044fae4449dc9d84f5fc7b66eb/doc/_build/html/scatter_matrix.html

参考

http://blog.livedoor.jp/norikazu197768/archives/12539634.html
http://pandas.pydata.org/pandas-docs/stable/visualization.html (公式)