- 1.画像変換–アフィンおよび非アフィン変換
- 2.画像の翻訳–画像を上下左右に移動します
- 3.画像の回転–画像の回転
- 4.スケーリング、サイズ変更、および補間
- 5.画像ピラミッド–サイズを変更する別の方法
- 6.トリミング–必要な画像領域を切り取ります
- 7.画像を明るくしたり暗くしたりするための算術演算
前のチュートリアルでは、我々はOpenCVのを知ったととしては、前のチュートリアルで語らなど、グレースケール、彩度、ヒストグラム、色空間、RGBコンポーネントのようにそれを使用して処理するいくつかの基本的なイメージを行っている、OpenCVのは、オープンソースの通勤・ビジョンライブラリでありC ++、Python、およびJavaインターフェイスであり、Windows、Linux、Mac OS、iOS、およびAndroidをサポートします。そのため、PythonおよびLinux環境のRaspberryPiに簡単にインストールできます。また、OpenCVとカメラが接続されたRaspberry Piを使用して、顔検出、顔ロック、オブジェクトトラッキング、車のナンバープレート検出、ホームセキュリティシステムなど、多くのリアルタイム画像処理アプリケーションを作成できます。
このチュートリアルでは、OpenCVを使用して画像を操作する方法を確認します。ここでは、OpenCVを使用して画像に次の関数を適用する方法を学習します。
- 画像変換–アフィンおよび非アフィン変換
- 画像の翻訳–画像を上下左右に動かす
- 画像の回転–画像の回転
- スケーリング、サイズ変更、および補間
- 画像ピラミッド–サイズ変更のもう1つの方法
- トリミング–必要な画像領域を切り取ります
- 画像を明るくしたり暗くしたりするための算術演算
1.画像変換–アフィンおよび非アフィン変換
変換は、画像に適用される幾何学的歪みです。ここでの歪みは、間違いではなく、画像がキャプチャされたポイントから生じる遠近法の問題を修正するための修正タイプを意味します。画像変換には、アフィンと非アフィンの2種類があります。
アフィン変換には、スケーリング、回転、平行移動の3つのタイプがあります。アフィン変換で重要なことは、画像変換の前後で線が平行になることです。
非アフィン変換または射影変換は、平行度、長さ、または角度を保持しませんが、共線性と入射角を保持します。共線性は、2つの点が同じ直線上にあることを意味します。
非アフィン変換は、コンピュータービジョンで非常に一般的であり、さまざまなカメラアングルから生成されます。非アフィン変換または射影変換は、ホモグラフィとも呼ばれます。
2.画像の翻訳–画像を上下左右に移動します
xとyの変換を同時に実装すると、画像の変換によって画像が上下左右に移動し、さらに斜めに移動します。
ここで、画像変換を実行するために、 opencv のwarpAffine関数を使用します 。cv2.warpAffine を使用してこれらの変換を実装しますが、そのためには変換行列が必要です。
変換行列、
T = 1 0 Tx
0 1 ty
T X、T yは、画像のシフトが発生する方向です。
ここで、T XはX軸に沿ってシフトしています(水平)
T YはY軸に沿ってシフトします(垂直)
#これは、画像の位置を単純にシフトするアフィン変換です 。#これらの変換を実装するためにcv2.warpAffineを使用します。 import cv2 import numpy as np image = cv2.imread( 'input.jpg') #画像の 高 さと幅を保存します height、width = image.shape print(image.shape) quater_height、quater_width = height / 4、width / 4 T = np.float32(、]) img_translation = cv2.warpAffine(image、T、(width、height)) print(T) cv2.imshow( 'original_image'、image) cv2.waitKey(0) cv2.imshow( '翻訳 '、img_translation) cv2.waitKey(0) cv2.destroyAllWindows()
コンソール出力-(183、275)–高さと幅
-T行列
]
3.画像の回転–画像の回転
画像の回転とは、回転する点がピボットのように機能するのと同じように、ある点または画像の中心にある点を中心に画像を回転させることです。
翻訳の場合と同様に、T行列があり、回転の場合はM行列があります。
回転行列、M行列=Cosθ-Sinθ
SinθCosθ
ここで、θは反時計回りに測定された回転角です。
また、OpenCVでは、関数 cv2.getRotationMatrix2D(rotation_center_x、rotation_center_y、回転角、スケール) を使用して、画像の販売と回転を同時に行うことができることに注意してください。
opencvのwarpAffine関数を使用して画像の回転を取得しますが、前の場合のように変換行列の代わりに、回転行列を使用します。
import cv2 import numpy as np image = cv2.imread( 'input.jpg') height、width = image.shape #高さと幅を2で割って、画像を中心に 回転 させますrotation_matrix = cv2.getRotationMatrix2D((width / 2 、height / 2)、90,1)rotated_image = cv2.warpAffine(image、rotation_matrix、(width、height)) cv2.imshow( 'original image'、image) cv2.waitKey(0) cv2.imshow( 'rotated image '、rotated_image) cv2.waitKey(0) cv2.destroyAllWindows()
これで、画像が90度回転し、キャンバスサイズが同じままであるが、回転のために画像サイズがキャンバスサイズに収まらないため、キャンバスサイズのためにトリミングされます。倍率を負に設定することで調整できますが、画像の背後に黒い背景が表示されます。
したがって、画像を予測または推測して画像の高さと幅を設定できます。または、画像を転置する別の方法で画像を回転させることもできますが、画像は反時計回りに90度の倍数で回転します。
4.スケーリング、サイズ変更、および補間
スケーリングとサイズ変更はアフィン変換であり、画像のサイズ変更は私たちがかなりの時間をかけて行ってきたものであり、ピクセルを拡張するときに画像をより大きなサイズにサイズ変更する場合のように、補間も処理しました。ピクセルとそれが補間の出番です。
これは、画像サイズを小さいものから大きいものに増やしたり、画像サイズを大きいものから小さいものに減らしたりすると発生する可能性があります。
技術的には、補間は、既知のデータポイントの離散セット内に新しいデータポイント(ピクセル)を構築する方法です。
OpenCVには次のようなさまざまなタイプの補間方法があります
cv2.INTER_AREA –縮小またはダウンサンプリングに適しています
cv2.INTER_NEAREST-最速
cv2.LINEAR –ズームまたはアップサンプリングに適しています(デフォルト)
cv2.CUBIC-より良い
cv2.INTER_LANCZOS4-最高
#サイズ変更はcv2.resize関数を使用すると非常に簡単で、その引数は #cv2.resize(image、dsize(output image size)、x_scale、y_scale、interpolation) import cv2 import numpy as np image = cv2.imread( 'input。 jpg ') cv2.imshow(' Original_image '、image) cv2.waitKey(0) #画像を元の画像サイズの3/4にします。つまり、75%に 縮小しますimage_scaled = cv2.resize(image、None、fx = 0.75、fy = 0.75) #線形補間はopen cvのデフォルトの方法であるため、関数として実装する必要はありません。 cv2.imshow( 'scaling_linearinterpolation'、image_scaled) cv2.waitKey(0) #画像のサイズを2倍にしましょう img_double = cv2.resize(image、None、fx = 2、fy = 2、interpolation = cv2.INTER_CUBIC) cv2.imshow( 'scaing_cubicInterpolation'、img_double) cv2.waitKey(0) #正確な寸法でサイズ変更を行いましょう image_resize = cv2.resize(image、(200,300)、interpolation = cv2.INTER_AREA) cv2.imshow( 'scaling_exact'、 image_resize) cv2.waitKey(0) cv2.destroyAllWindows()
5.画像ピラミッド–サイズを変更する別の方法
ピラミッド型の画像とは、拡大(画像の拡大)または縮小(画像の縮小)のいずれかを指します。
これは単にサイズ変更の別の方法であり、画像を簡単かつ迅速に拡大縮小し、縮小して新しい画像の高さと幅を半分に減らすことができます。
これは、オブジェクトを探すたびに画像を拡大縮小するオブジェクト検出器を作成するときに役立ちます。
import cv2 image = cv2.imread( 'input.jpg') smaller = cv2.pyrDown(image) larger = cv2.pyrUp(smaller) cv2.imshow( 'original'、image) cv2.waitKey(0) cv2.imshow( 'smaller'、smaller) cv2.waitKey(0) cv2.imshow( 'larger'、larger) cv2.waitKey(0) cv2.destroyAllWindows()
大きな画像では、元の画像と同じサイズでありながら、小さな画像から大きな画像に直接変換されるため、ぼやけが少ないことがわかります。しかし、補間すると、画像を拡大したときにスペースを埋めながらピクセルを推定するため、前回と同様に画質が向上します。
同じコードを実行しますが、3次補間を使用すると、大きな画像の品質が向上します。以下の画像は、元の画像、拡大されたバージョンの画像、小さい画像、および小さい画像の3次補間バージョンの比較を示しています。
import cv2 image = cv2.imread( 'input.jpg') smaller = cv2.pyrDown(image) larger = cv2.pyrUp(smaller) cv2.imshow( 'original'、image) cv2.waitKey(0) cv2.imshow( 'smaller'、smaller) cv2.waitKey(0) cv2.imshow( 'larger'、larger) cv2.waitKey(0) #3次補間を使用して小さい画像から変換された大きい画像の品質を向上する img_double = cv2.resize(smaller、なし、fx = 2、fy = 2、interpolation = cv2.INTER_CUBIC) cv2.imshow( 'scaing_cubicInterpolation'、img_double) cv2.waitKey(0) cv2.destroyAllWindows()
注: サイズがどんどん小さくなっている画像の複数の小さなコピー、またはサイズが継続的に大きくなっている画像の複数の大きなコピーを作成する場合は 、for ループまたは while ループを pyrDown または pyrUp 関数内に保持して使用できます。
6.トリミング–必要な画像領域を切り取ります
画像のトリミングとは、画像のセグメントを抽出することです。
OpenCVには直接トリミング機能はありませんが、以下のコードを使用して numpy で簡単に行うことができます
トリミング=画像
画像配列を配置し、インデックス作成ツールまたはメソッドをnumpyに使用して、開始行から終了行、開始列から終了列をコンマで区切って定義し、画像を取得するためにトリミングする長方形を抽出します。
import cv2 import numpy as np image = cv2.imread( 'input.jpg') height、width = image.shape #開始ピクセル座標を取得しましょう(トリミング長方形の左上) start_row、start_col = int(height *.25) 、int(width *.25) #終了ピクセル座標を取得しましょう(右下) end_row、end_col = int(height *.75)、int(width *.75) #単にインデックスを使用して、希望する長方形を 切り抜きます= image cv2.imshow( "original image"、image) cv2.waitKey(0) cv2.imshow( "cropped image"、 cropped )cv2.waitKey(0)cv2.destroyAllWindows()
start_col または start_rowの 代わりにピクセル値を直接使用できることに 注意してください 。これらは、ユーザーが簡単に識別できるようにするために与えられたものです。
7.画像を明るくしたり暗くしたりするための算術演算
OpenCVの算術演算は、基本的に画像に行列を加算または減算します。行列を加算または減算すると、輝度の増減に影響します。
したがって、行列を加算または減算するには、行列を作成する必要があります 。numpyに は、画像と同じサイズの1の行列を与える np.ones という関数があります。
import cv2 import numpy as np image = cv2.imread( 'input.jpg') #1の行列を作成し、それを100のスケーラーで乗算します ' #np.onesは、すべての画像と同じ次元の行列を生成しますこの場合の値は100です M = np.ones(image.shape、dtype = "uint8")* 100 #これを使用してこの行列Mを画像に追加します #明る さ の増加に注意してくださいadded = cv2.add(image 、M)を加えcv2.imshow( "が追加") cv2.waitKey(0) 我々はsubstractもでき#likewise 輝度の低下が#notice 減算= cv2.subtract(画像、M) cv2.imshow(減算、 "減算" ) cv2.waitKey(0) cv2.destroyAllWindows()
これは、OpenCVを使用して画像にさまざまな画像処理操作を適用する方法です。次のチュートリアルでは、他の画像操作機能を続行します。