OpenCVでは、画像のスケーリング、回転、変換をよく使用します。たとえば、ある種類の画像を操作したい場合があります。現時点では、将来のディープラーニングのためにこの種類の画像のサイズを統一する必要があります。また、データセットのトレーニングでは、データセットのサンプルのサイズは通常均一であることがわかります。
ズーム
OpenCVでは、関数cv2.resize()を使用して、画像ズーム構文形式を実現します。
dst = cv2.resize(src、dsize [、fx [、fy [、interpolation]]])
(1)src:元の画像
(2)dsize:ズーム画像サイズ、dsize = 0の場合、デフォルトの計算方法は次のとおりです:dsize = Size(round(fx ∗ src.cols)、round(fy ∗ src.rows))
(3)fx fyとdsizeを同時に0にすることはできません。fx、fyはそれぞれx軸とy軸のズーム係数です。デフォルト値が0の場合、fx =(double)dsize.width / src.cols、fy =(double)dsize .height / src.cols、デフォルトのパラメーターは0で、そのままでは書き込めません
(4)補間:差分法をデフォルトで使用できます。デフォルトはINTER_LINEAR-バイリニア補間(デフォルトで使用)です。現在の差分:
慣れている座標表現は、最初にx座標、次にy座標です。画像処理では、この慣性的な考え方はしばしば間違っています。
コンピュータでは、画像は行列の形で格納されているため、最初に行、次に列になります。したがって、幅×高さ×カラーチャネル= 480×256×3の画像は、256×480×3の3次元テンソルに保存されます。画像処理もこのアイデア(OpenCVでの画像処理を含む)に従って計算されます。つまり、高さ×幅×カラーチャネルです。
しかし、ここで問題が発生します。APIcv2.resizeは小さな例外です。パラメータ入力が幅×高さ×カラーチャンネルだからです。
コードを見てみましょう:
view plaincopy to clipboardprint?
import cv2
pic = cv2.imread("cat.jpg")
cv2.imshow("org",pic)
pic = cv2.resize(pic, (400, 400), interpolation=cv2.INTER_CUBIC)
cv2.imshow('res', pic)
cv2.waitKey(0)
cv2.destroyAllWindows()
最初に元の画像効果を確認します。
ズームした後の効果を見てください。
この方法で縮小した後のアスペクト比は元の画像と同じではないことがわかりました。これで、コードを改善できます。
view plaincopy to clipboardprint?
import cv2
pic = cv2.imread("cat.jpg")
cv2.imshow("org",pic)
pic = cv2.resize(pic, (0, 0), fx=0.5, fy=0.5,
interpolation=cv2.INTER_NEAREST)
cv2.imshow('res', pic)
cv2.waitKey(0)
cv2.destroyAllWindows()
ズームされた画像を直接見てみましょう:
ここで、スケーリングされたサイズを直接指定しない場合は、fxとfyを介してズーム比を直接指定します。0.5は、長さと幅が元のサイズの半分であることを意味します。
スピン
OpenCVでの画像の回転は、主にgetRotationMatrix2D関数を使用して画像の回転行列を取得し、次にアフィン変換関数warpAffineを使用して回転した画像を取得することです。
関数を見てみましょう:
cv2.getRotationMatrix2D(中心、角度、スケール)
・指定できる中心回転中心点(cx、cy)
・角度回転の角度単位は、反時計回りが正の方向、角度が正、つまり反時計回りを意味します。
・スケールズーム係数。1.0に等しい値は、サイズが変更されないままであることを意味します
この関数はアフィン変換行列Mを返し、このアフィン変換行列を次の関数に渡します。
cv2.warpAffine(src、M、dsize [、dst [、flags [、borderMode [、borderValue]]]])→dst
src-input画像。
M変換行列。
dsize-出力イメージのサイズ。
flags-補間方法の組み合わせ(intタイプ!)
borderMode-borderピクセルモード(intタイプ!)
borderValue-borderパディング値。デフォルトでは0です。
次に、画像回転の原理について説明します。
私たちは式に基づいています:
描くことができます:
したがって、対応する変換行列は次のとおりです。
コードを見てみましょう:
view plaincopy to clipboardprint?
import cv2
img = cv2.imread("cat.jpg")
rows,cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('res', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
回転後の効果:
画像翻訳
画像の変換は、実際には行列の動きであり、最も単純な種類の空間変換であり、その式は次のとおりです。
(b0、b1)はオフセットです。
たとえば、右に10ピクセル、下に30ピクセル移動すると、変換行列Mは次のようになります。
ソースコードを見てみましょう:
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread('cat.jpg')
height,width,channel = img.shape
#声明变换矩阵 向右平移10个像素, 向下平移30个像素
M = np.float32([[1, 0, 10], [0, 1, 30]])
#进行2D 仿射变换
shifted = cv2.warpAffine(img, M, (width, height))
cv2.imshow('res', shifted)
cv2.waitKey(0)
cv2.destroyAllWindows()
効果のデモ:
移動の方向を変更する必要がある場合は、マトリックスの値を変更するだけで済みます。
記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜