1. ホーム
  2. スクリプト・コラム
  3. パイソン

Python+OpenCV 6種類のリアルタイム画像処理を詳しく解説

2022-01-27 12:56:46

OpenCVの画像処理に初めて触れる方にとっては、ガウス関数やフィルタリング、閾値2値化など、頭を悩ませることが多いと思います。ここでは、カメラを通してリアルタイムかつダイナミックに各種画像処理の特徴を確認し、チューニングやテストの参考にもしていただけるような、小さなプロジェクトをご紹介します。

1. ライブラリファイルのインポート

ここでは、PySimpleGUI、cv2、numpyのライブラリファイルを使用します。PySimpleGUIはGUIによる視覚化のためのライブラリファイル、cv2はPythonのOpenCVのインターフェース、numpyは数値変換や演算のためのライブラリファイルで、これらはすべてpipでインポートすることが可能です。

mkvirtualenv -p /sur/bin/python3.5 ml3


2. GUIをデザインする

GUI設計を実装するPySimpleGUIライブラリファイルに基づいて、このプロジェクトのインタフェース設計は比較的簡単で、薄緑色の背景で800X400サイズのフレームを設計し、主に二つの部分:カメラインタフェース領域とコントロールボタン領域で構成されています。その効果は以下の通りです。

GUIコードは以下の通りです。

pip3 install Scikit-learn


3. カメラを呼び出す

パソコン内蔵カメラの電源を入れ、下図のようにGUIインターフェースにデータを表示します。

そのコードを以下に示す。

import sklearn


4. リアルタイム画像処理

4.1. 閾値処理による2値化

閾値['thresh_slider']より大きい値を255、小さい値を0として閾値二値化処理を行い、以下のような効果を得ることができます。

 そのコードを以下に示す。

pip3 install jieba


4.2. エッジ検出

エッジ検出を行うために、values['canny_slider_a']は最小閾値、values['canny_slider_b']は最大閾値を表し、その効果は以下のようになります。

そのコードを以下に示す。

import jieba
jieba.cut("My name is Gan Fawn")


4.3. プロファイルテスト

輪郭検出は、形状解析や物体の検出・認識に有効なツールで、曲線の連続するすべての点(境界線に沿って)を同じ色または強度で結び、以下のような効果を発揮します。

 そのコードを以下に示す。

import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score

# Read the data from the four tables
prior = pd.read_csv("/Users/mac/instacart/order_products__prior.csv")
products = pd.read_csv("/Users/mac/instacart/products.csv")
orders = pd.read_csv("/Users/mac/instacart/orders.csv")
aisles = pd.read_csv("/Users/mac/instacart/aisles.csv")
# Merge four tables into one (user-item categories)
_mg = pd.merge(priority, products, on=['product_id', 'product_id']) # both tables should have the key 
_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
mt = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])
mt.head(10)




4.4. ガウシアンフィルタリング

ガウシアンフィルタリング、(21、21)はガウシアン行列の長さと幅が21であることを意味し、標準偏差は値['blur_slider']として取られます、効果は以下の通りです。

 そのコードを以下に示す。

# cross table (special grouping tool)
cross = pd.crosstab(mt['user_id'], mt['aisle']) # specify two parameters, row and column
cross.head(10)


4.5. 色変換

色空間の変換、HSVからBGRへの変換は以下の通りです。

 そのコードを以下に示す。

# Perform a principal component analysis
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross) # Inputs must be row and column type so cross-tabulation is used before
data


4.6. コントラストを調整する

下図のように、画像の細部をシャープに見せるために、コントラストを強調します。

  そのコードを以下に示す。

if values['enhance']:
    enh_val = values['enhancement_slider'] / 40
    clahe = cv2.createCLAHE(clipLimit=enh_val, tileGridSize=(8, 8))
    lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)
    lab[:, :, 0] = clahe.apply(lab[:, :, 0])
    frame = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)

5. システムを終了する

ダイレクトブレイクでループを抜ける。

if event == 'Exit' or event is None:
    break

以上、Python+OpenCV 6つのリアルタイム画像処理について詳しく説明しましたが、Python+OpenCVのリアルタイム画像処理については、スクリプトハウスの他の関連記事にもご注目ください