0
1

More than 1 year has passed since last update.

【文字検出_備忘録】OpenCV X Python 画像の読み込みとグレースケール化

Posted at

産休にはいって、出産まであと1ヶ月切ったので、子供を産まれるまで、どこまでできるかチャレンジ。
私のスペック
・情報工学、学部卒(なのでたかが知れてる)
・とあるメーカー 設計・開発業務 5年目、主にマネジメントしかしてない
・子供1人、2歳(まだ夜泣きもするし、寝るのもへたっぴなので夜はほぼ活動してない)

いや、多分こんな文字検出なんかね、どこでも載ってるんだけど、色々やってみたいので、お勉強兼ねて少し、鈍臭くやった備忘録を書きます。
鈍臭くっていうのは、データの中身をちゃんとみたり、どうしたらAPIやライブラリを使用せずに組んでみたりするってこと。です。

前提条件

開発環境

OS macOS Monterey
ハード iMac (21.5-inch, Late 2015)
Memory 8GB

今までやってきたこと

・開発環境整備
 Python, OpenCVI(Numpy含む), Matlabplotlib
・エディタ SublimeText

やりたいこと

・画像から文字検出

考えてるステップ

Step0 画像の読み込み
Step1 2値化を実施
Step2 輪郭を抽出
Step3 のエッジを検出し、文字を切り抜き

進捗

Step0 画像の読み込み

まず、いろんなライブラリの読み込み。
必要なのは、cv2(画像処理のライブラリ)、numpy(行列計算系,行列のプロットに役に立つ),matplotlib(画像処理結果を、画像で教えてくれる)
だと思う、今のところ。

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

#ファイルパス
IMG = ".../apple.png" #処理対象
IMG_file_path = ".../apple_photo_text" #読み込んだnpyファイルパス+名前
IMG_GRAY_file_path = ".../apple_photo_text_gray" #2値化した後のnpyファイルパス+名前

🌾最初グレースケール化で遊んでたので、GRAYが入ってマス。めんどくさいのでそのまま。

続いて、画像の読み込み

img = cv2.imread(IMG) 
np.save(IMG_file_path,img)

IMG_file_pathのファイルに保存してみた。せっかくなので中身を見てみよう・・

934e 554d 5059 0100 7600 7b27 6465 7363
7227 3a20 277c 7531 272c 2027 666f 7274
7261 6e5f 6f72 6465 7227 3a20 4661 6c73
652c 2027 7368 6170 6527 3a20 2836 3837
2c20 3835 3629 2c20 7d20 2020 2020 2020
2020 2020 2020 2020 2020 2020 2020 2020
2020 2020 2020 2020 2020 2020 2020 2020
2020 2020 2020 2020 2020 2020 2020 200a
fbfb fbfb fbfb fbfb fbfb fbfb fbfb fbfb
....

うーんなるほど。わからん
どうやら、16bitの何からしい。

こういう時は、定義をみましょうね。
Imreadの定義

どうやら、cv::Mat型で返してるらしいのでそっちをみる
CV:Mat型の定義

..わかんないので、先に行こう。

どうやらこれが参考になりました。BGR値で返しているらしく、3次元配列(一つのセルに3つ値が紐づく状態)を、numpy.ndarrayで出力しているそう。
なるほど・

numpu.ndarrayとは

ということで、以下でデータの中身を見るお手伝いをしてみた。

print(img.shape)
#(687, 856, 3)
print(img.dtype)
#uint8

なるほど。つまり、y軸 687pixel x軸 856pixel, dimention(次元)が3次元の配列、各要素はUINT8型の行列式なのである。ちゃんと理解するために、ここでちょっと遊んでみようと思う。

参考
https://qiita.com/sino20023/items/ec7e0ac77547f3b6484b

print(img[200:203,200:205])" #img[Y,X]らしい

出力結果。

[[[134 113 247]
  [134 112 248]
  [134 112 248]
  [134 112 248]
  [134 112 248]]

 [[134 113 247]
  [134 112 248]
  [134 112 248]
  [134 112 248]
  [134 112 248]]

 [[134 113 247]
  [134 112 248]
  [134 112 248]
  [134 112 248]
  [133 111 247]]]

なるほど、めちゃめちゃわかったぞ。
1セルめのBGR値が[134 113 247]
X=0(1行目)が、以下。これがy軸方向に3行続いてるってことだね!なるほどね!!

[[[134 113 247]
  [134 112 248]
  [134 112 248]
  [134 112 248]
  [134 112 248]]

参考記事

ということは、2値化するためにはどまずはBGR値だとすこぶるめんどくさいのでグレースケールに落とし込みます。

グレースケール化は、cvtColorでやりました。imreadでもできるらしいんで、どっちでもいいと思います。

#グレースケール処理
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

実は、これをやったあと、255 = 黄色,0 = 緑っぽく出てきて、ちょっと困惑したんですが、とりあえず、BGR値から解放されてるっぽいのでいいでしょう。
何でかはわからんが、いかを試したら、グレースケールになりました。まぁね、何色かはどうでもいいから。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1