1 OpenCV の概要
Opencv は、コンピュータ ビジョンにおける古典的な専用ライブラリであり、複数の言語をサポートし、クロスプラットフォームで、強力な機能を備えています。Opencv-Python は Opencv 用の Python インターフェイスを提供し、ユーザーが Python で C/C++ を呼び出して、読みやすさと操作効率を確保しながら必要な機能を実現できるようにします。
Opencv は 1999 年に Intel の Gray Bradsky によって設立され、最初のバージョンは 2000 年に登場しました。Vadim Pisarevsky は Gary Bradsky に加わり、Intel のロシア ソフトウェア Opencv チームを管理します。
2005 年に、Opencv が Stanley で使用され、2005 DARPA Challenge で優勝しました。その後、Gary Bradsky と Vadim Pisarevsky がプロジェクトを率い、Willow Garage の支援を受けて積極的な開発が続けられました。Opencv は現在、コンピューター ビジョンや機械学習に関連するさまざまなアルゴリズムをサポートしており、日々拡張されています。
Opencv は、C++、Python、Java などの複数のプログラミング言語をサポートしており、Windows、Linux、OS X、Android、IOS などのさまざまなプラットフォームで使用できます。CUDA や OpenCL をベースとした高速 GPU 動作のためのインターフェイスも積極的に開発中です。
Opencv-Python は、Opencv C++ API と Python 言語の最良の機能を組み合わせた Opencv 用の Python API です。
1.1 OpenCV-Python
Opencv-Python は、コンピュータ ビジョンの問題を解決するために設計された特殊なライブラリです。Python は、
Guidovan Rossum によって考案された汎用プログラミング言語です。主にそのシンプルさとコードの読みやすさにより、すぐに非常に人気になりました。これにより、プログラマは読みやすさを損なうことなく、より少ないコード行でアイデアを表現できるようになります。
C/C++ などの言語と比較すると、Python は遅いです。とはいえ、Python は C/C++ を使用して簡単に拡張できるため、コンピューターを多用するコードを C/C++ で記述し、Python モジュールとして使用できる Python ラッパーを作成できます。これには 2 つの利点があります。1 つは、コードが元の C/C++ コードと同じくらい高速である (実際の C++ コードがバックグラウンドで実行されているため)、2 つ目は、C/C++ よりも Python でコードを記述するのが簡単です。Opencv-Python は、元の Opencv C++ 実装の Python ラッパーです。
Opencv-Python は、MATLAB スタイルの言語を使用した数値演算用に高度に最適化されたライブラリである Numpy を利用します。すべての Opencv 配列構造は Numpy 配列との間で変換されます。これにより、Scipy や Matplotlib などの Numpy を使用する他のライブラリとの統合も容易になります。
1.2 応用分野
- 人間とコンピュータのインタラクション
- 物体認識
- 画像のセグメンテーション
- 顔認識
- 行動認識
- スポーツ追跡
- ロボット
- スポーツ分析
- マシンビジョン
- 構造解析
- 車の安全運転
以上のように、opencv は非常に強力でさまざまな分野で活躍しますが、浅いところから深いところまで、今回は画像編集と簡単な英数字認識関連の部分を紹介します。画像認識、測位およびその他の機能。
2 opencv-pythonのインストールと使用
まず環境をインストールする必要があります
- python3: python3 をインストールします: Python チュートリアルに詳しい手順があり、Web サイトに Python がインストールされます
- numpy: numpy をインストールします: pip numpy をインストールします
- opencv-python:インストールopencv-python: pip install opencv-python
opencv-python をインストールした後、コマンド ラインで Python インタラクティブ環境を開きます。 import cv2 は成功しました。これは、opencv-python が正常にインストールされたことを意味します。
2.1 imread()
imread関数はデジタル画像を読み取る関数ですが、まずは公式サイトでこの関数の定義を見てみましょう。
cv2.imread(path_of_image, intflag)
関数パラメータ 1: 読み込む必要がある画像の完全なパス 関数
パラメータ 2: ロゴをどの形式で画像に読み込むか、次の方法を選択できます。
- cv2.IMREAD_COLOR: カラー画像を読み込みます。画像の透明度は無視されます。それはデフォルトのフラグです
- cv2.IMREAD_GRAYSCALE: グレースケール モードで画像を読み込みます
- cv2.IMREAD_UNCHANGED: 読み取ったイメージの元のカラー チャネルを保持します。
- 1: cv2.IMREAD_COLOR と同等
- 0: cv2.IMREAD_GRAYSCALE と同等
- -1: cv2.IMREAD_UNCHANGED と同等
color_img = cv2.imread("image_file/1.jpeg")
print(color_img.shape)
gray_img=cv2.imread("image_file/1.jpeg", cv2.IMREAD_GRAYSCALE)
print(gray_img.shape)
#把单通道图像保存后,再读取,仍然是3通道,相当于将单通道复制到3个通道保存
cv2.imwrite("image_file/gray_1.jpeg",gray_img)
2.2 閾値()
この関数の機能は画像を 2 値化することであり、画像の 2 値化とは、画像上のピクセルのグレー値を 0 または 255 に設定することであり、これは画像全体が白と黒のみの明らかな視覚効果を示すことを意味します。二値化は、画像セグメンテーションの最も簡単な方法の 1 つです。2 値化では、グレースケール イメージを 2 値イメージに変換できます。ある臨界階調値よりも大きい画素の階調を最大階調値として設定し、この値よりも小さい画素の階調を最小階調値として設定して二値化を実現する。
例を描いてみる
cv.threshold() は、しきい値セグメンテーションを実装するために使用されます。この関数には 4 つのパラメーターがあります。
- パラメータ 1: 処理される元の画像は通常、前のステップで処理されるグレースケール画像です。
- パラメータ 2: しきい値の設定
- パラメータ 3: 最大しきい値、通常は 255
- パラメータ 4: しきい値方法。主に 5 つのタイプがあります。つまり、THRESH_BINARY、THRESH_BINARY_INV、THRESH_TRUNC、THRESH_TOZERO、および THRESH_TOZERO_INV
例:
ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
ret, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
ret, th3 = cv.threshold(img, 127 、255、cv.THRESH_TRUNC)
ret、th4 = cv.threshold(img、127、255、cv.THRESH_TOZERO)
ret、th5 = cv.threshold(img、127、255、cv.THRESH_TOZERO_INV)
タイトル = ['オリジナル', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
画像 = [img, th1, th2, th3, th4, th5]
Matplotlib を使用してrange(6) の iを表示します:
plt.subplot(2, 3, i + 1)
plt.imshow(images[i], 'gray')
plt.title(titles[i], fontsize=8)
plt .xticks([]), plt.yticks([]) # 座標軸を非表示にする
plt.show()
実際の出力:
対応する公式指示
2.3 形態学Ex()
形態学的演算は、画像の形状に基づく単純な演算です。一般にバイナリ イメージに対して実行される操作。2 つのパラメータを入力する必要があります。1 つは元の画像で、2 つ目は構造要素またはカーネルと呼ばれ、操作の性質を決定するために使用されます。
2 つの基本的な形態学的操作は、侵食と拡張です。それらのバリエーションは、オープニング操作とクローズ操作を構成し、具体的な概念は次のとおりです。
1) 腐食:
土壌侵食と同様に、この操作では前景オブジェクトの境界が侵食されます (ただし、前景は白のままです)。これはどのように行われるのでしょうか? コンボリューション カーネルは画像に沿ってスライドし、コンボリューション カーネルに対応する元の画像のすべてのピクセル値が 1 の場合、中央の要素は元のピクセル値を維持し、それ以外の場合は 0 になります。
これはどのような影響を及ぼしますか? コンボリューションカーネルのサイズに応じて、前景に近いすべてのピクセルが侵食される(0になる)ため、前景のオブジェクトが小さくなり、画像全体の白い領域が減少します。これはホワイト ノイズを除去するのに便利で、接続されている 2 つのオブジェクトを切断する場合などにも使用できます。
2) 拡張:
腐食とは逆に、コンボリューションカーネルに対応する元の画像のピクセル値のいずれかが 1 である限り、中心要素のピクセル値は 1 になります。
したがって、この操作により、画像内の白い領域 (前景) が増加します。一般に、最初に腐食が使用され、次に膨張がノイズを除去するために使用されます。腐食によりホワイトノイズが除去されるため、前景のオブジェクトも小さくなります。そこで、再度拡張してみます。現時点ではノイズは除去されており、元に戻ることはありませんが、その可能性はまだあり、さらに増加するでしょう。インフレートを使用して 2 つの別々のオブジェクトを結合することもできます。
3) オープン操作:
まず腐食してから膨張します。画像内の小さな明るいスポットを削除します (CV_MOP_OPEN)。
4) 密閉運転
まず膨張し、その後腐食します。画像内の小さな暗いスポットを削除します (CV_MOP_CLOSE)。
kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv.imshow("MORPH_OPEN_1", opening)
cv2.waitKey(0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv.imshow("MORPH_OPEN_1", closing)
cv2.waitKey(0)
3 応用例
上記は opencv の簡単な使用法です。次に、検証コードの特定という実際の応用例を見てみましょう。実際、上記の 3 つのステップに従って、画像を段階的に処理し、グレーアウト、二値化、オープン、そして最後に画像を処理することができます。認識された。まず、元の画像は次のとおりです。
1) 最初の処理効果は、輪郭抽出の準備として画像をグレースケールおよび 2 値化し、2 値化後の画像は、開閉操作がしやすい黒または白になります。
src = cv2.imread('image_file/before.png')
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("Binarization", binary)
cv2.waitKey(0)
2) 上記のバイナリ画像に基づいて、結果画像に対してオープン演算を実行してノイズ部分を除去します。
kernel = cv.getStructuringElement(cv.MORPH_RECT, (8, 1))
open_out = cv.morphologyEx(binl, cv.MORPH_OPEN, kernel)
cv.imshow("MORPH_OPEN_2", open_out)
cv2.waitKey(0)
3) 最後の処理として、背景を白に設定し、画像識別コードを識別します。
cv.bitwise_not(open_out, open_out)
cv.imshow("Transform", open_out)
textImage = Image.fromarray(open_out)
text = pytesseract.image_to_string(textImage)
cv2.waitKey(0)
4) 最後に確認コードを印刷します。
4 まとめ
上記の知識ポイントをよく読んでいただければ、opencv-python は画像の基本的な操作に習熟できると思います。次に、デジタル画像のその他の概念についてもいくつか紹介しますので、お楽しみに ~
Lei Jun: Xiaomi の新しいオペレーティング システム ThePaper OS の正式版がパッケージ化されました。Gome App の抽選ページのポップアップ ウィンドウは創設者を侮辱しています。Ubuntu 23.10 が正式にリリースされました。金曜日を利用してアップグレードするのもいいでしょう! Ubuntu 23.10 リリース エピソード: ヘイトスピーチが含まれていたため、ISO イメージが緊急に「リコール」されました 23 歳の博士課程の学生が Firefox で 22 年間続いた「ゴーストバグ」を修正しました RustDesk リモート デスクトップ 1.2.3 がリリースされましたWayland を強化して TiDB 7.4 をサポート リリース: MySQL 8.0 と正式互換. Logitech USB レシーバーを取り外した後、Linux カーネルがクラッシュしました. マスターは Scratch を使用して RISC-V シミュレータをこすり、Linux カーネルを正常に実行しました. JetBrains が Writerside ツールを開始しました技術文書の作成に。著者: JD Logistics Zhang Weinan
出典:JD Cloud Developer Community Ziyuanqishuo Tech 転載の際は出典を明記してください