スポンサーリンク

【Python】画像のピーク検出。〜 numpy行列の射影投影をplt描写 〜

Python
スポンサーリンク

今回の記事は画像なのピーク値、正確に言うと画像の白でない部分と白以外の部分の充当率を軸方向に射影投影し、ピークちを検出します。(ピーク値と呼んでいいのかは謎笑)

必要なスキルとしては、画像のnumpy配列としての読み込み、ピークち検出のアルゴリズム、plt描写と比較的簡単になっております。

機械学習などで文字判別を行う際に文字感覚が狭すぎると困るなどの場合があると思われるので、そういった際に使用してみてください。

完成図は下記のようになります。

ではメインの早速メインの記事に進ん行きます。

以下の環境はdocker に構築したpythonの環境です。イメージはtensorflowベースのものを利用しております。詳しくはリンクより環境構築手順を確認ください。pythonバージョンは3.6.5です。

スポンサーリンク

画像のピーク検出。〜 numpy行列の射影投影をplt描写 〜

まずは画像の読み込みと白黒画像への変換を行います。

import cv2
import numpy as np
import matplotlib.pyplot as plt

#対象の画像読み込み
img = cv2.imread("./test_cv.png")
print(img.shape)

gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#print(img.shape)
ret, bw_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_OTSU)

height, width = bw_img.shape

必要なライブラリのインストールと、画像の読みこみを行なっております。画像読み込みはopencvで読み込んでおりますが、ここはPILとかでも代用可能。
流れとしては「画像読み込み」→「グレースケール化」→「白黒化」です。

次にアルゴリズムによる白と黒の判別を行なっていきます。

#射影投射###########################################
array_V = np.zeros(width)
#画像を横から縦に回す
for i in range(width):
    total_count = 0
    for j in range(height):
        temp_pixVal = bw_img[j, i]
        if temp_pixVal == 0:
            total_count += 1
    array_V[i] = total_count
#図を写す
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
x_axis = np.arange(width)
ax.bar(x_axis, array_V)
###################################################

array_Vという配列に画像を回していきどのまでの画像が入っているかを確認していきます。

まとめると下記のようなコードになっております。

import cv2
import numpy as np
import matplotlib.pyplot as plt

#対象の画像読み込み
img = cv2.imread("./test_cv.png")
print(img.shape)

gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#print(img.shape)
ret, bw_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_OTSU)

height, width = bw_img.shape

#射影投射###########################################
array_V = np.zeros(width)
#画像を横から縦に回す
for i in range(width):
    total_count = 0
    for j in range(height):
        temp_pixVal = bw_img[j, i]
        if temp_pixVal == 0:
            total_count += 1
    array_V[i] = total_count
#図を写す
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
x_axis = np.arange(width)
ax.bar(x_axis, array_V)
###################################################

これで上記のような結果が得られると思います。

今回の記事は以上です。この射影投影を用いた技術で画像の文字間隔を拡張させる記事を記載しております。きになる方はそちらの記事もご参照ください。

Python
スポンサーリンク
tomoをフォローする
スポンサーリンク
SunnyDayTravel-Blog

コメント

  1. […] こちら詳しい解説はこちらの記事で解説しているのできになる方はご参照ください。 […]

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