ここにディレクトリのタイトルを書きます
画像の幾何変換 01-zoom-cv2.resize()
幾何学的変換とは何ですか?
幾何学的変換は、画像の内容を変更せずに画像を空間的に変換するコンピュータ グラフィックスの画像処理技術です。これらの変換は、画像内のピクセル位置を調整することで実現できます。
一般的な幾何学的変換には次のものがあります。
移動: 画像を水平方向および垂直方向、あるいはその両方に移動します。つまり、画像の各ピクセルを指定された距離に沿って移動します。
拡大縮小: サイズを拡大または縮小して、画像を拡大または縮小します。スケーリング中、それに応じて画像内の各ピクセルの位置が調整されます。
回転: 指定した角度に従って画像のコンテンツが回転するように、特定の回転中心を中心に画像を回転します。
反転: 画像を水平方向および垂直方向に反転します。つまり、画像のピクセルを指定した方向にミラーリングします。
シャーリング: 画像のピクセルの一部を特定の比率に従って特定の方向に移動させ、画像にその方向のミスカット効果を与えます。
幾何学的変換の応用シナリオ
幾何学的変換には、コンピュータ グラフィックスやコンピュータ ビジョンの分野で幅広い応用シナリオがあります。以下に、一般的な幾何学的変換のアプリケーション シナリオをいくつか示します。
画像の位置合わせ: 医療画像やリモート センシング画像などの分野では、空間内の対応する位置が一致するように複数の画像を位置合わせする必要があります。幾何学的変換を使用して画像の移動、回転、拡大縮小を行うことで、画像の位置合わせを行うことができます。
画像強調: 画像強調では、幾何学的変換を使用して画像のサイズと位置を調整し、画像を表示または処理により適したものにすることができます。たとえば、画像を指定したサイズに拡大縮小したり、画像をトリミングしたりできます。
視覚効果とアニメーション: コンピュータ ゲームやアニメーション制作などの分野では、幾何学的変換を使用して画像やオブジェクトを移動、回転、拡大縮小し、さまざまな視覚効果を作成できます。そしてアニメーション。
画像のワーピング: 画像のワーピングとは、顔の変形やスタイル効果などの特定の効果を実現するために、特定のルールに従って画像の特定の領域を変形することを指します。
2D から 3D への変換: コンピュータ支援設計 (CAD) や仮想現実 (VR) では、幾何学的変換を使用して 2D 画像を 3D モデルまたはシーンに変換できます。
視点変換: コンピュータ ビジョンでは、幾何学的変換を使用してさまざまな視点から画像を観察し、画像を再構成、分析、認識できます。
画像のスティッチング: 複数の画像をパノラマにスティッチングする場合、異なる画像間の違いを明確にするために、画像の移動、回転、拡大縮小などの幾何学的変換を実行する必要があります。シームレスに整列すること。
一般に、幾何学的変換は画像処理やコンピュータグラフィックスにおいて重要な役割を果たしており、画像の位置や形状を変更することで、画像の位置合わせ、強調、変形、合成などのさまざまな機能を実現します。
以下は、一般的に使用されるいくつかの画像変換操作を個別に分析したものです。
ズーム
OpenCV では、関数 cv2.resize() を使用して画像のスケーリングを実現します。この関数の具体的な形式は次のとおりです。
dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )
式内:
dst は出力ターゲット画像を表します。画像タイプは src と同じで、そのサイズは dsize (値が 0 以外の場合)、
または src.size()、fx、fy を通じて計算できます。
src は、スケーリングする必要がある元の画像を表します。
dsize は出力画像サイズを表します。
fx は水平方向のスケーリング率を表します。
fy は垂直方向の拡大縮小率を表します。
interpolation は、表 5-1 に示す補間方法を表します。
cv2.resize() 関数では、ターゲット画像のサイズを「パラメータ dsize」または「パラメータ fx および fy」で指定できます。詳細は後述します。
ケース 1: パラメータ dsize で指定する
パラメータ dsize の値が指定されている場合、パラメータ fx とパラメータの値が一致するかどうかに関係なく、ターゲットはパラメータ dsize によって決定されます。 a>
は画像のサイズを示します。
このとき注意する必要があるのは、dsize の最初のパラメータがスケーリングされた画像の幅に対応していることです。 (幅、つまり列数、cols はパラメータ fx に関連します)、2 番目のパラメータはスケーリングされた画像の高さに対応します (高さ、つまり行数はパラメータ fy に関連します) 。
パラメータ dsize の値が指定されている場合、x 方向のスケーリング サイズ (パラメータ fx) は次のようになります。
(double)dsize.width/src.cols
同時に、y 方向のスケーリング サイズ (パラメーター fy) は次のようになります。
(double)dsize.height/src.rows
ケース 2: パラメータ fx および fy で指定
パラメータ dsize の値が None の場合、ターゲット イメージのサイズはパラメータ fx と fy によって決定されます。この時点で、ターゲット画像のサイズは次のようになります。
dsize=Size(round(fx*src.cols),round(fy*src.rows))
補間とは、画像に対して幾何学的な処理を行う際に、直接マッピングできないピクセルに値を割り当てることを指します。
たとえば、画像を 2 倍に拡大すると、直接マッピングできないピクセルが必然的に増えますが、これらのピクセルについては、補間方法によってその値が決定されます。
さらに、いくつかの非整数のマッピング値が存在します。たとえば、逆マッピングでは、ターゲット画像のピクセル値を、元の画像の非整数値に対応する位置にマッピングすることがあります。このような非整数位置が存在する場合、つまり対象画像上の画素点が元画像の特定の位置に対応できない場合には、この時点でこれらの画素点も補間する必要があります。マッピングを完了します。
関数 cv2.resize() は、元の画像のスケーリング機能を実現できます。。操作を開始する前に、ターゲット画像のサイズとタイプ dst を設定する必要があることに注意してください。操作前と最終ターゲット画像のdstは関係ありません。
ターゲット イメージ dst の最終的なサイズとタイプは、src、dsize、fx、fy によって指定されます。元の画像をターゲット画像と同じサイズにサイズ変更したい場合は、上記の属性で
を指定する必要があります。
画像を縮小する場合は、エリア補間法 (INTER_AREA) を使用して最良の結果を取得します。
画像を拡大する場合は、3 次スプライン補間法 (INTER_CUBIC) と二重線を使用します。性的補間 (INTER_LINEAR) メソッドを使用すると、より良い結果が得られます。
3 次スプライン補間法は低速ですが、バイリニア補間法は比較的高速で、効果は劣りません。
実験: 関数 cv2.resize() を使用して配列のサイズを単純に変更します。
import cv2
import numpy as np
img=np.ones([2,4,3],dtype=np.uint8)
#获取图像的尺寸
size=img.shape[:2]
print("size=\n",size)
#缩放图像
rst=cv2.resize(img,size)
print("img.shape=\n",img.shape)
print("img=\n",img)
print("rst.shape=\n",rst.shape)
print("rst=\n",rst)
この例では、関数 cv2.resize() を使用して元の画像のサイズを変更することを想定しています。観察しやすいように、ターゲット イメージを元のイメージと同じサイズに設定します。
実行結果:
size=
(2, 4)
img.shape=
(2, 4, 3)
img=
[[[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]]
[[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]]]
rst.shape=
(4, 2, 3)
rst=
[[[1 1 1]
[1 1 1]]
[[1 1 1]
[1 1 1]]
[[1 1 1]
[1 1 1]]
[[1 1 1]
[1 1 1]]]
プログラムを通じて、目的が達成されておらず、ターゲット画像のサイズが元の画像のサイズと一致していないことがわかりました。
元の画像のサイズは 2 行 4 列で、ターゲット画像のサイズは 4 行 2 列です。
対象画像の行数は元画像の列数となります。
対象画像の列数は元画像の行数となります。
上記の例を通じて、関数 cv2.resize() の dsize パラメータと画像の形状属性が行と列の順序、つまり言い換えれば矛盾していることをさらに確認します。< a i=1> In 形状属性では、最初の値は行数に対応し、2 番目の値は列数に対応します。 dsize パラメータでは、最初の値は列数に対応し、2 番目の値は行数に対応します。 通常、テストには同じサイズの画像を使用しますが、この場合、cv2.resize() 関数の dsize パラメータの具体的な使用方法を見つけることができない可能性があります。 cv2.resize() 関数を使用する場合は、パラメータ dsize の属性の順序に特別な注意を払う必要があります。
実験 2: 関数 cv2.resize() を使用して、単純な画像のスケーリングを完了する
import cv2
img=cv2.imread("lena.png")
print(img.shape)
rows,cols=img.shape[:2]
#重置图像大小
size=(int(cols*0.9),int(rows*0.5))
rst=cv2.resize(img,size)
print("img.shape=",img.shape)
print("rst.shape=",rst.shape)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()
操作結果:
(512, 512, 3)
img.shape= (512, 512, 3)
rst.shape= (256, 460, 3)
プログラムから確認できます。
列数は元の数の 0.9 倍になります。
行数は 0.5 になります。元の数値の倍
実験 3: 関数 cv2.resize() の fx パラメーターと fy パラメーターを制御して画像のスケーリングを完了する
import cv2
img=cv2.imread("lena.png")
print(img.shape)
rows,cols=img.shape[:2]
#重置图像大小
size=(int(cols*0.9),int(rows*0.5))
#rst=cv2.resize(img,size)
rst=cv2.resize(img,None,fx=2,fy=0.5)
print("img.shape=",img.shape)
print("rst.shape=",rst.shape)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()
操作結果:
(512, 512, 3)
img.shape= (512, 512, 3)
rst.shape= (256, 1024, 3)
プログラムからわかります。
fx は水平スケーリングを実行し、列数を 2 倍の 512×2=1024 にします。
fy は垂直スケーリングを実行し、行数を元の 0.5 倍に変更し、結果は 512×0.5=256 になります。