【OpenCV】輝度分布データからの画像を作成する方法!

f:id:yshgs_elec:20200612221820j:plain
数値計算なんかをしていると、座標ごとの数値の大小を表すファイルが出力されることはよくあります。
今回は、そんなテキストファイルから画像を作成する方法をご紹介します。
(この記事では取り扱いを簡単にするために白黒画像で説明します。)
ご存じの方も多いと思いますが、コンピュータでは、白を255, 黒を0というように色の濃度を数字の大きさによってあらわしています。
そのため、数字の大小を表す分布データさえあれば、それを簡単に画像にすることが可能です。
イメージを持ってもらうためにデータをつくるところからやってみましょう。
 
まずはエクセルを使って数値の分布ファイルを作ってみましょう。
私は以下のように左上から右下にかけて255を入力し、その他は0となるデータを作成しました。
今回は600×600のデータを作成しています。

f:id:yshgs_elec:20200612062438j:plain

データ作成用VBAプログラム
以下で紹介しているVBAコードを使うと、今回紹介するデータと全く同じデータを作成することができます。
VBAの使用方法については以下を参照ください。
www.higashisalary.com

◆画像作成に用いるデータ作成用VBAコード

Sub makedata()
For i = 1 To 600
For j = 1 To 600
If Abs(i - j) < 5 Then
Cells(i, j) = 255
Else
Cells(i, j) = 0
End If
Next
Next
End Sub

次に、エクセルで作ったデータをコピーし、テキストファイルに張り付けましょう。
コピー&ペイストでOKです。
このとき私はdata.txtという名前で保存しています。
 
前準備が終わったところで早速本題に入っていきましょう。
プロンプトから先ほど作成したテキストファイルが置いてある場所に移動し、pythonを起動しましょう。
あとは以下のプログラムを実行するだけです。

import cv2
import numpy as np
aaa=np.loadtxt('data.txt')
cv2.imwrite('test.jpg',aaa)

※openCVやnumpyはインストールしておく必要があります。
先ほど紹介したpythonプログラムを実行した結果、test.jpgとして以下のような画像が出力されました。
白い部分が255の数値が入っている場所、黒い部分が0の数値が入っている場所です。たったの4行のプログラムで、簡単にテキストファイルから画像を作ることができましたね。
今回のポイントはnp.loadtxtでテキストファイルの行列データを読み込み、そのデータをcv2.imwriteで画像にした点です。

f:id:yshgs_elec:20200612062558j:plain

次に、もう少しこのスキルを応用してみましょう。
先ほどのエクセルファイルを少しいじってみます。
下の画像のように、先ほど作ったデータの上に0の数値が入った行をいくつか挿入してみましょう。
※挿入した分、下行を削除しておきましょう。画像サイズが異なると、うまく処理ができないためです。
このデータを先ほどと同じ要領でテキストデータに張り付けます。
私はdata2.txtとして保存しました。

f:id:yshgs_elec:20200612063726j:plain

それでは次に、これらのデータを足し合わせた画像を作成してみます。
実行コードは以下の通りです。

import cv2
import numpy as np
aaa=np.loadtxt('data.txt')
bbb=np.loadtxt('data2.txt')
ccc=aaa+bbb
cv2.imwrite('test2.jpg',ccc)

pythonプログラムを実行した結果、test2.jpgとして以下のような画像が出力されました。
同じ線が少しずれて表示されていますね。
numpyの便利なところはそれぞれ行列を宣言しておけば、あとは普通の演算式で各配列内内部を処理してくれるという点です。
頻繁につかうスキルですので必ず覚えておきましょう。
f:id:yshgs_elec:20200612062948j:plain
このようにpython,openCV,numpyなどを使いこなすことによって、いろいろなことができるようになりますね。
是非使いこなせるようになり、日々の業務を自動化していきましょう。
それではまた!!!

コメント

タイトルとURLをコピーしました