- 画像とは何ですか?
- コンピュータが画像を保存する方法
- 機械が画像を識別するのが難しい理由
- OpenCVのアプリケーションと使用
- PythonとAnacondaを使用したOpenCVのインストール
- OpenCVで画像を開いて保存する
- OpenCVのグレースケーリング画像
- 色空間
- RGB画像の個々のコンポーネントの調査
- 画像を個々のRGBコンポーネントに変換する
- 画像のヒストグラム表現
- OpenCVを使用した画像と形状の描画
芸術は見る方法であり、見ることは信じることであると彼らは言いますが、その逆もまた真実です。信じることは見ることであり、ビジョンの賜物なしでこの世界に住むことを想像するのは本当に難しいです。私たちの目が開いたばかりのとき、私たちは世界を見て、私たちの周りの世界を認識し、見始めましたが、時間が経つにつれて、同じ素晴らしい経験は平凡なものになります。しかし、私たちが技術を進歩させているとき、私たちは機械もそれを見て理解することができる寸前にいます。現在、スマートフォンのロックを顔で解除するだけではSFとは思えませんが、マシンビジョンの開発の話は20年以上前にさかのぼります。
この分野の最初の正式なステップは、1999年にIntelイニシアチブで取り戻されました。このとき、進行中のすべての研究は、元々C ++で記述されたOPENCV(オープンソースコンピュータービジョン)の下で共同作業され、2006年に最初のメジャーリリース1.0が行われました。 2009年、2015年に3番目、2018年に4番目になりました。現在、OpenCVはC ++、Python、およびJavaインターフェイスを備えており、Windows、Linux、Mac OS、iOS、およびAndroidをサポートしています。そのため、PythonおよびLinux環境のRaspberryPiに簡単にインストールできます。また、OpenCVとカメラが接続されたRaspberry Piを使用して、顔検出、顔ロック、オブジェクトトラッキング、車のナンバープレート検出、ホームセキュリティシステムなど、多くのリアルタイム画像処理アプリケーションを作成できます。
openCVを使用した画像処理について学ぶ前に、画像とは何か、そして人間と機械がそれらの画像をどのように認識するかを知ることが重要です。
画像とは何ですか?
画像は、可視光スペクトルの2次元表現です。そして、可視光スペクトルは、赤外線スペクトルと紫外線スペクトルの間にある電磁スペクトルのほんの一部です。
画像はどのように形成されますか:-光が物体からフィルム、センサー、または網膜に反射するとき。
これが私たちの目の働きであり、バリアを使用して光のほとんどのポイントをブロックし、光が通過できる小さな開口部を残します。これは絞りと呼ばれ、焦点の合った画像を形成し、ピンホールカメラの作業モデルです。しかし、ピンホールカメラには問題があり、同じ量の光が開口部に入るため、形成されたフィルムや画像には適さず、焦点を合わせた画像を取得できず、画像の焦点を合わせることができません。フィルムを前後に動かす必要がありますが、これは多くの状況で問題があります。
それとも私たちは、レンズを使用してこの問題を解決することができ、それは、私たちは開口サイズを制御することができ、そして写真にそのFとして知られているストップ、一般的にfの値下げるストップ写真に優れています。
絞りのサイズにより、写真ではボケと呼ばれる被写界深度に入ることができ、画像に焦点を合わせている間、背景をぼかすことができます。
コンピュータが画像を保存する方法
.png、.jpgGなどのさまざまな画像形式について聞いたことがあるかもしれません。これらはすべてアナログ世界のデジタル表現です。コンピュータは画像を保存用のデジタルコードに変換し、ファイルを次の画像に解釈します。表示。しかし、基本的には、画像を保存するための共通のプラットフォームを使用しており、openCVについても同じことが言えます。
OpenCVは、デフォルトでRGB(赤、緑、青)色空間を画像に使用します。各ピクセル座標(x、y)には、8ビット形式の強度の範囲の3つの値(0〜255、2 8)が含まれます。
各色の異なる強度を混合すると、完全なスペクトルが得られます。そのため、絵画やアートでは、これら3色は原色と見なされ、他のすべての色は二次色と見なされます。これは、二次色のほとんどが原色によって形成されるためです。黄色の場合と同様に、次の値があります。赤– 255; 緑– 255; 青–0。
これで、画像は多次元配列に格納されます。プログラミングでは、配列は一連のオブジェクトのコレクションです。ここでは、1D、2D、3Dの3種類の配列を扱います。ここで、「D」は次元を表します。
カラー画像は3次元配列に格納されます。3次元はRGBカラー(後で説明します)を表し、白黒画像は2次元配列に格納され、一緒になって画像のさまざまな強度のピクセルを形成します。また、白黒画像のグレースケール画像とバイナリ画像の2種類があります。
グレースケール画像は2次元配列のグレーの陰影から形成されますが、バイナリ画像は黒または白のいずれかのピクセルです。
機械が画像を識別するのが難しい理由
コンピュータビジョンはそれ自体が挑戦的なタスクです。マシンに視覚、認識、識別の感覚を与えることがどれほど難しいかを想像することができます。コンピュータビジョンを非常に難しくする次の要因があります。
- カメラセンサーとレンズの制限
- 視点のバリエーション
- 照明の変更
- スケーリング
- 咬合
- オブジェクトクラスのバリエーション
- あいまいな画像/目の錯覚
OpenCVのアプリケーションと使用
困難にもかかわらず、コンピュータビジョンには多くのサクセスストーリーがあります
- ロボットナビゲーション–自動運転車
- 顔の検出と認識
- 検索エンジン画像検索
- ナンバープレートの読み取り
- 手書き認識
- Snapchat&フェイスフィルター
- 物体認識
- スポーツにおけるボールとプレーヤーの追跡
- などなど!
PythonとAnacondaを使用したOpenCVのインストール
OpenCVはC ++で書かれていますが、C ++で実装するのは非常に難しいため、Pythonとして高レベルの言語で実装することを選択します。また、Pythonは最も簡単な言語の1つであるため、PythonでOpenCVを実装することには追加の利点があります。初心者向けにもデータサイエンスや機械学習アプリケーションにとって非常に強力であり、画像を多数の配列に格納するため、非常に強力な操作を非常に簡単に実行できます。
基本的なプログラミングは、高校レベルの数学、ウェブカメラ、Python 2.7または3.6(Anacondaパッケージを推奨)への露出で役立ちます。
ステップ1.AnacondaPythonパッケージをダウンロードしてインストールします
www.anaconda.com/downloadにアクセスし、マシンの天候に応じてWindows、Linux、またはMacを選択し、64ビットシステムまたは32ビットシステムのいずれかでPython2.7またはPython3.7バージョンを選択できますが、現在はシステムのほとんどは64ビットです。
PythonのAnacondaディストリビューションには、Spyderスタジオ、jupyterノートブック、anacondaプロンプトが付属しており、Pythonを非常に使いやすくしています。例を実行するためにスパイダースタジオを使用します。
python 2.7または3.7のどちらを選択するかは完全に中立ですが、例ではpython 3.7を使用します。これは、pythonの将来であり、2020からpython 2.7を引き継ぐためです。また、ほとんどのライブラリはpython3.7で開発されています。 Pythonの将来の側面を念頭に置いてください。また、(2/5 = 2.5)などの基本的な数学演算で期待される結果が得られますが、python 2.7では2と評価されます。また、printはpython 3.7(print( "hello"))では関数として扱われます。そのため、プログラマーに実践を提供します。
ステップ2.OpenCVを使用して仮想プラットフォームを作成する
AnacondaプロンプトとここにアップロードされたYMLファイルを使用して、スパイダー用の仮想プラットフォームを作成することにより、OpenCVをインストールします。
YMLファイルを使用して、必要なすべてのパッケージとライブラリをインストールしますが、追加のパッケージをインストールする場合は、そのパッケージのコマンドを実行することで、anacondaプロンプトから簡単にインストールできます。
Windows Searchアイコンに移動し、anacondaプロンプトターミナルを見つけます。インストールしたばかりのanacondaフォルダー内にあります。
次に、ダウンロードしたYMLファイルを見つける必要があります。ここから、端末のディレクトリをYMLファイルがダウンロードされる場所に変更するか、YMLファイルをanacondaが最もインストールされているディレクトリにコピーするかの2つの選択肢があります。 C:\ドライブ内にある場合は、YMLファイルを指定された場所にコピーした後、プロンプトで次のコマンドを実行します
conda env create –f virtual_platform_windows.yml
私のシステムはWindowsで実行されているため、YMLファイルとコマンドはWindowsに対応していますが、WindowsをそれぞれLinuxまたはMacに置き換えることで、システムに応じて変更できます。
注:-パッケージの抽出でエラーが発生した場合は、最初に pytorch と numpyを インストールしてから、上記のコマンドを実行してください。
ここでanacondaナビゲーターを見つけると、「Applications on ___」のドロップダウンメニューが表示され、そこから仮想環境を選択して、そこからSpyderstudioを起動する必要があります。
これで、開始する準備が整いました。
OpenCVで画像を開いて保存する
ここでは、OpenCVでPythonを使用するためのいくつかの基本的なコマンドと用語について説明します。OpenCV imread、imshow、imwriteの3つの基本機能について学習します。
Pythonの#コメントは#記号で示されます
コマンドでPythonにopencvをインポートする
cv2をインポートする
画像へのパスを指定する「imread」を使用して画像をロードします
image = cv2.imread( 'input.jpg')
これで、画像がPythonに読み込まれ、imageという名前の変数として保存されます。
ここで、画像変数を表示するには、「imshow」を使用します。imshow関数の最初のパラメーターは、画像ウィンドウに表示されるタイトルです。名前を文字列として表すには、( '')に入力する必要があります。
cv2.imshow( 'hello world'、image)
waitkeyを使用すると、画像ウィンドウが開いているときに情報を入力できます。空白のままにすると、続行する前に任意のキーが押されるのを待つだけです。数字(0を除く)を配置することで、ウィンドウを開いたままにする時間(時間)の遅延を指定できます。ここではミリ秒単位)。
cv2.waitKey()
「destroyAllWindows」は開いているすべてのウィンドウを閉じます。これを配置しないと、プログラムがハングします。
cv2.destroyAllWindows()
、我々はnumpyの使用します。このため、 numpyのは、 大規模な多次元配列と行列へのサポートを追加するためのPythonプログラミングのためのライブラリです。
import cv2 #importing numpy import numpy as np image = cv2.imread( 'input.jpg') cv2.imshow( 'hello_world'、image) #shape関数は、配列の次元を 調べるときに非常に便利です。画像の寸法を示すタプルを返しますprint(image.shape) cv2.waitKey() cv2.destroyAllWindows()
コンソール出力-(183、275、3)、画像の2つの次元は高さ183ピクセル、幅275ピクセルであり、3は、この画像を作成する他の3つのコンポーネント(R、G、B)があることを意味します(カラー画像は3次元配列に保存されます)。
print( '画像の高さ:'、(image.shape、 'ピクセル')) print( '画像の幅:'、(image.shape、 'ピクセル'))
コンソール出力-画像の高さ:(183、 'ピクセル')
画像の幅:(275、 'ピクセル')
編集した画像をOpenCVに保存する
保存するファイル名と画像を指定するために「imwrite」を使用します。
cv2.imwrite( 'output.jpg'、image) cv2.imwrite( 'output.png'、image)
最初の引数は保存するファイルの名前、{ファイルを読み取るまたは保存するために使用する( '')を文字列として示す}、2番目の引数はファイル名です。
OpenCVを使用すると、画像をさまざまな形式で保存できます。
OpenCVのグレースケーリング画像
グレースケーリングは、画像をフルカラーからグレーの色調(白黒)に変換するプロセスです。
opencvでは、多くの関数が処理前に画像をグレースケールします。これは、画像を単純化し、ほとんどノイズリダクションとして機能し、画像内の情報が少ないため(グレースケール画像が2次元配列に格納されるため)処理時間が長くなるためです。
import cv2 #入力画像をロード image = cv2.imread( 'input.jpg') cv2.imshow( 'original'、image) cv2.waitKey() #cvtcolorを使用して、グレースケールに変換 gray_image = cv2.cvtColor(image 、cv2.COLOR_BGR2GRAY) cv2.imshow( 'grayscale'、gray_image) cv2.waitKey() cv2.destroyALLWindows()
画像をグレースケール に変換する簡単な方法は、画像名の横にある imread 関数の引数0を追加することです。
import cv2 grey_image = cv2.imread( 'input.jpg'、0) cv2.imshow( 'grayscale'、grey_image) cv2.waitKey() cv2.destroyAllWindows()
import cv2 import numpy as np image = cv2.imread( 'input.jpg') print(image.shape) cv2.imshow( 'original'、image) cv2.waitKey() gray_image = cv2.cvtColor(image、cv2.COLOR_BGR2GRAY ) cv2.imshow( 'grayscale'、gray_image) print(gray_image.shape) cv2.waitKey() cv2.destroyALLWindows()
コンソール出力:-( 183、275、3)–カラー画像用
(183、275)–グレースケール画像用
したがって、カラー画像が3次元配列で表され、グレースケール画像が2次元配列で表されていることを明確に示しています。
色空間
色空間は、画像の保存方法です。RGB、HSV、CMYKは異なる色空間であり、これらは色を表す簡単な方法です。
RGB –赤、緑、青。
HSV –色相、彩度、明度。
また、CMYKはインクジェットプリンタで一般的に使用されています。
RGBまたはBGR色空間
OpenCVのデフォルトの色空間はRGBです。RGBは、強度/明るさの異なる青、緑、赤の色を組み合わせて色を生成する加法カラーモデルです。OpenCVでは、8ビットの色深度を使用します。
-赤(0-255)
-青(0-255)
-緑(0-255)
ただし、OpenCVは実際にはBGR形式で色を保存します。
おもしろ情報:-符号なし32ビット整数がメモリに格納される方法のためにコンピュータでBGR順序を使用しますが、それでもRGBとして格納されることになります。色を表す整数。例:-0X00BBGGRRは0XRRGGBBとして格納されます。
HSV色空間HSV(色相、彩度、値/明るさ)は、人間が知覚する色を表現しようとする色空間です。RGBカラーポイントの円筒形表現で色情報を保存します。
色相–カラー値(0-179)
彩度–色の鮮やかさ(0-255)
値–明るさまたは強度(0-255)
HSV色空間形式は、色のセグメンテーションに役立ちます。RGBでは、特定の色をフィルタリングするのは簡単ではありませんが、HSVを使用すると、色の範囲を設定して特定の色を認識しながらフィルタリングすることがはるかに簡単になります。
色相はHSVで色を表し、色相値の範囲は360ではなく0〜180であるため、完全な円を完成していないため、標準とは異なる方法でマッピングされます。
カラーレンジフィルター
- 赤–(165-15)
- 緑–(45-75)
- 青–(90-120)
画像がRGB(赤、緑、青)の色空間で保存されていることを知っているので、OpenCVでも同じことがわかりますが、opencvのRGB形式について最初に覚えておくべきことは、それが実際にはBGRであり、画像の形。
import cv2 import numpy as np image = cv2.imread( 'input.jpg') 最初の0,0ピクセルの#B、G、R値 B、G、R = image print(B、G、R) print(image.shape) #これをグレースケール画像に適用すると gray_img = cv2.cvtColor(image、cv2.COLOR_BGR2GRAY) print(gray_img.shape) #gray_imageピクセル値10,50ピクセル print(gray_img)
コンソール出力: プリント(B、G、R) - 6 11 10
print(image.shape) - (183、275、3 )
print(gray_img.shape) - (183、275 )
print(gray_img) -69
カラー画像は3次元で保存されていることを覚えているので、グレースケール画像には2次元しかありません。グレースケールでは、(R、G、G)なので、3次元は(R、G、B)です。、B)は存在せず、特定のピクセル位置では1つの値しか取得できませんが、カラー画像では3つの値を取得します。
もう1つの有用な色空間はHSVです
import cv2 image = cv2.imread( 'input.jpg') hsv_image = cv2.cvtColor(image、cv2.COLOR_BGR2HSV) cv2.imshow( 'HSV image'、hsv_image) cv2.imshow( 'Hue channel'、hsv_image) cv2。 imshow( 'saturation channel'、hsv_image) cv2.imshow( 'value channel'、hsv_image) cv2.waitKey() cv2.destroyAllWindows()
コードを実行すると、4つの画像が表示されます。そのうちの3つは個別のチャネルのもので、1つは結合されたHSV画像です。
色相チャネルの画像は、値が0から180までしか変化しないため、かなり暗くなります。
また、 imshow 関数はRGBまたはBGR画像を表示しようとしますが、HSV変換はそれと重複することに注意してください。
また、値チャネルは、その明るさのために画像のグレースケールに似ています。
RGB画像の個々のコンポーネントの調査
import cv2 image = cv2.imread( 'input.jpg') # opencvの分割関数は、各カラーインデックスB、G、R = cv2.split(image) cv2.imshow( "Red"、R) cv2.imshow( 「緑」、G) cv2.imshow(「青」、B) 各色成分をマージして、元の画像を#making マージ= cv2.merge() マージ(「マージ」cv2.imshow) 青色が#amplifying マージ= cv2.merge() cv2.imshow( "青の増幅とマージ"、マージ) #個々の色成分の形状を表します。 #RGBコンポーネントの3番目の要素は個別に表されるため、出力は高さと幅の2次元のみになり ますprint(B.shape) print(R。形状) プリント(G.shape) cv2.waitKey(0) cv2.destroyAllWindows()
コンソール出力:形状関数からの画像の#寸法
(183、275)
(183、275)
(183、275)
画像を個々のRGBコンポーネントに変換する
以下のコードでは、画像HxWの次元でゼロの行列を作成しました。ゼロは、ゼロで埋められているが同じ次元の配列を返します。
形状 関数は、画像の寸法を見るときに非常に便利です。ここでは、その形状関数のスライスを行いました。したがって、 形状 は指定されたポイントまで、つまり画像の高さと幅である2番目の指定されたポイントまですべてを取得します。これは、3番目が画像のRGBコンポーネントを表すため、ここでは必要ありません。
import cv2 import numpy as np image = cv2.imread( 'input.jpg') B、G、R = cv2.split(image) zeros = np.zeros(image.shape、dtype = "uint8") cv2.imshow( "RED"、cv2.merge()) cv2.imshow( "Green"、cv2.merge()) cv2.imshow( "Blue"、cv2.merge()) cv2.waitKey(0) cv2.destroyAllWindows()
画像のヒストグラム表現
画像のヒストグラム表現は、画像のコンポーネントを視覚化する方法です。
次のコードを使用すると、組み合わせた個々の色成分の色ヒストグラムを使用して画像を分析できます。
import cv2 import numpy as np #ヒストグラムプロットを作成するにはmatplotlibをインポートする必要があります import matplotlib.pyplot as plt image = cv2.imread( 'input.jpg') histogram = cv2.calcHist(,, None,,) #plot aヒストグラム、 ravel()は 画像配列を平坦化しますplt.hist(image.ravel()、256、)plt.show() #個別のカラーチャネルを表示 color =( 'b'、 'g'、 'r') #we know色を分離し、 iの ヒストグラムにそれぞれプロットし、列挙(色)の列:histogram2 = cv2.calcHist(,, None,,) plt.plot(histogram2、color = col) plt.xlim() plt.show()
calcHist 関数とその個々のパラメーターを理解しましょう
cv2.calcHist(画像、チャネル、マスク、histsize 、範囲)
画像:タイプuint8またはfloat32のソース画像。opencvの画像は配列形式のデータであるため、角かっこ、つまり「」で指定する必要があります。これは、第2レベルの配列も示します。
チャネル:角括弧内にも示されています。これは、ヒストグラムを計算するチャネルのインデックスです。たとえば、入力がグレースケール画像の場合、その値は、渡すことができるカラー画像の場合、または青、緑、赤のチャネルのヒストグラムをそれぞれ計算します。
マスク:マスク画像。完全な画像のヒストグラムを見つけるために、それは「なし」として与えられます。ただし、画像の特定の領域のヒストグラムを見つけたい場合は、そのためのマスク画像を作成し、それをマスクとして指定する必要があります。
履歴サイズ:これはBINカウントを表します。合格するフルスケールでは、角かっこで囲む必要があります。
範囲:これは私たちの範囲であり、通常は
OpenCVを使用した画像と形状の描画
以下は、OpenCVで線、長方形、多角形、円などを描画するためのいくつかの例です。
import cv2 import numpy as np #creating a black square image = np.zeros((512,512,3)、np.uint8) #これを白黒で作成することもできますが、変更はありません image_bw = np.zeros ((512,512)、np.uint8) cv2.imshow( "黒い長方形(色)"、画像) cv2.imshow( "黒い長方形(白黒)"、image_bw)
ライン
# 黒い正方形の上に線を作成します#cv2.line(画像、開始座標、終了座標、色、太さ)#太さ5ピクセルの対角線を 描画しますimage = np.zeros((512,512,3)、np.uint8) cv2.line(image、(0,0)、(511,511)、(255,127,0)、5) cv2.imshow( "blue line"、image)
矩形
# 黒い正方形の上に長方形を作成する#cv2.rectangle(画像、開始座標、終了座標、色、厚さ)#厚さ5ピクセルの長方形を描画する image = np.zeros((512,512,3)、np.uint8) cv2.rectangle(image、(30,50)、(100,150)、(255,127,0)、5) cv2.imshow( "rectangle"、image)
サークル# 黒い正方形の上に円を作成する#cv2.circle(image、center、radius、color、fill)image = np.zeros((512,512,3)、np.uint8) cv2.circle(image、(100,100)、( 50)、(255,127,0)、-1) cv2.imshow( "circle"、image)
ポリゴン#ポリゴン 画像の作成= np.zeros((512,512,3)、np.uint8) #4つのポイントを定義します pts = np.array(、、、]、np.int32) #ポイントを必要な形式に再形成しますpolylines pts = pts.reshape((- 1,1,2 ))cv2.polylines(image 、、 True、(0,255,255)、3)cv2.imshow( "polygon"、image)
テキスト#opencvを使用してテキストを配置する #cv2.putText(image、 '表示するテキスト'、bootom左開始点、フォント、フォントサイズ、色、厚さ) image = np.zeros((512,512,3)、np.uint8) cv2。 putText(image、 "hello world"、(75,290)、cv2.FONT_HERSHEY_COMPLEX、2、(100,170,0)、3) cv2.imshow( "hello world"、image) cv2.waitKey(0) cv2.destroyAllWindows()
コンピュータビジョンとOpenCVはカバーする非常に広大なトピックですが、このガイドはOpenCVと画像処理を学ぶための良い出発点になるでしょう。