Opencvは、画像をズームするためのimresize、pyrUp、pyrDown関数を学習します



Opencv Learns Imresize



opencvで画像のサイズをスケーリングする方法は、一般的に次のとおりです。
1、サイズ変更機能が最も直接的です

2. pyrDown関数とpyrUp関数は、画像ピラミッドに関連する2つの関数であり、画像に対してアップサンプリング操作とダウンサンプリング操作を実行します。

I.はじめに



画像ピラミッドは、もともとマシンビジョンと画像圧縮に使用されていました。画像のピラミッドは一連の画像であり、その解像度はピラミッドの形で徐々に低下し、同じ元の画像に由来します。降圧サンプリングで取得し、一定の終了条件に達するまでサンプリングを停止しません。
ピラミッドの下部は処理される画像の高解像度表現であり、上部は低解像度の近似値です。
画像をレイヤーごとにピラミッドと比較します。レベルが高いほど、画像は小さくなり、解像度は低くなります。


画像がピラミッドの上層に移動すると、サイズと解像度が低下します。 OpenCVでは、PryDownを使用して、ピラミッド内の前の画像から次の画像を生成できます。 PryUpを使用すると、既存の画像が各次元で2倍に拡大されます。
画像ピラミッドでのアップサンプリングとダウンサンプリングは、それぞれOpenCV関数pyrUpとpyrDownによって実現されます。
総括する:
画像のアップサンプリング:pyrUp関数(画像を拡大)
画像のダウンサンプリング:pyrDown関数(画像の縮小)

ここでの上下のサンプリングは画像のサイズ(ピラミッドの方向と反対)、上は画像サイズの2倍、下は画像サイズの半分です。上図のピラミッドの方向を理解すると、ピラミッドの上向きの画像は実際には縮小しており、その逆です。




第二に、pyrDown関数

void pyrDown(InputArray src、OutputArray dst、const Size&dstsize = Size()、int borderType = BORDER_DEFAULT)



以下は、ソースコードの各パラメータの説明です。

@paramsrc入力画像。
@paramdst出力画像。指定されたサイズで、srcと同じタイプです。

@paramdstsize出力画像のサイズ。

デフォルトでは、出力画像のサイズはサイズ((src.cols + 1)/ 2、(src.rows + 1)/ 2)として計算されます。これは、どのような場合でも満たす必要があります。

| dstsize.width * 2-src.cols |<2
| dstsize.height * 2-src.rows |<2

@paramborderTypeピクセル外挿法。cv:: BorderTypesを参照してください(BORDER_DEFAULTのみがサポートされています)

この場所はBORDER_DEFAULTのみをサポートしているため、デフォルトでこの場所に入力することに注意してください


サイズw×hの画像Iの場合、ガウスピラミッドGjは、解像度が低下した複数のガウス画像Ii(iは下付き文字、以下と同じ)で構成されます。
その中で、i = {0,1、...、j}は一連のピラミッドを表します。画像Iiのサイズは(w / 2i)×(h / 2i)である。 [2iは2の累乗です]
画像Iiは2つのステップで取得されます。 1.ガウス関数によって生成されたカーネルを使用したガウス平滑化フィルタリング

2.前の画像のダウンサンプリングインターレースサンプリングが取得されます


この関数は、ガウスピラミッド構造のダウンサンプリングステップを実行します。 A

まず、ソースイメージをカーネルと組み合わせます。

f [ frac {1} {256} begin {bmatrix} 1&4&6&4&1 \ 4&16&24&16&4 \ 6&24&36&24&6 \ 4&16&24&16&4 \ 1&4&6&4&1 end {bmatrix} f]

次に、行と列を拒否することで画像をダウンサンプリングします。

3、pyrUp関数

void pyrUp(InputArray src、OutputArray dst、const Size&dstsize = Size()、int borderType = BORDER_DEFAULT)

デフォルトでは、出力画像のサイズはサイズとして計算されます(src.cols * 2、(src.rows * 2)

この関数は、ガウスピラミッド構造のアップサンプリングステップを実行し、実際にはラプラシアンピラミッドを構築するために使用されます。 A

まず、ソースイメージをアップサンプリングし、行と列をゼロに挿入してから、pyrDownで使用されるカーネルに4を掛けたカーネルで結果を畳み込みます。


4、サイズ変更機能

void resize(InputArray src、OutputArray dst、Size dsize、double fx = 0、double fy = 0、int補間= INTER_LINEAR)

src:入力、元の画像、つまりサイズ変更する画像
dst:出力、サイズ変更後の画像、この画像の内容は元の画像と同じですが、サイズが元の画像と同じではありません
dsize:出力画像のサイズ。このパラメータが0でない場合、元の画像がこのSize(width、height)で指定されたサイズにスケーリングされることを意味します。このパラメータが0の場合、スケーリング後の元の画像のサイズは次の式で計算されます。
dsize = Size(round(fx * src.cols)、round(fy * src.rows))
その中で、fxとfyは、画像の幅方向と高さ方向のズーム率である、以下に説明する2つのパラメータです。
fx:幅方向の倍率。0の場合、(double)dsize.width /src.colsに従って計算されます。
fy:高さ方向のスケーリング比。0の場合、(double)dsize.height /src.rowsに従って計算されます。
補間:これは、補間を指定する方法です。画像が拡大縮小された後、ピクセルを再計算する必要があります。このパラメーターは、ピクセルを再計算する方法を指定するために使用されます。次のタイプがあります。
INTER_NEAREST-最近隣内挿
INTER_LINEAR-双一次補間。最後のパラメーターを指定しない場合、このメソッドがデフォルトで使用されます
INTER_AREA-ピクセル領域の関係を使用したリサンプリング。モアレのない結果が得られるため、画像の間引きに適した方法である可能性があります。ただし、画像をズームすると、INTER_NEARESTメソッドに似ています。
INTER_CUBIC-4x4ピクセル近傍でのバイキュービック補間

INTER_LANCZOS4-8x8ピクセル近傍のランツォシュ補間


したがって、画像の長さと幅を半分に減らすには、次の2つの方法で記述します。

resize(dst, dst1, Size(dst.cols * 0.5, dst.rows * 0.5),0, 0, INTER_LINEAR) resize(dst, dst2, Size(0,0), 0.5, 0.5, INTER_LINEAR)画像を縮小するには、通常、CV_INTER_AREA補間を使用するのが最適です。画像を拡大するには、CV_INTER_CUBIC(低速)またはCV_INTER_LINEAR(高速、見栄えが良い)を使用します。

V.例

resize(tempImage, g_dstImage1, Size(tempImage.cols / 2, tempImage.rows / 2), 0, 0, INTER_AREA) resize(tempImage, g_dstImage2, Size(tempImage.cols * 2, tempImage.rows * 2), 0, 0, INTER_LINEAR) pyrUp(tempImage, g_dstImage3, Size(tempImage.cols * 2, tempImage.rows * 2)) pyrDown(tempImage, g_dstImage4, Size(tempImage.cols / 2, tempImage.rows / 2)) imshow('[Effect Picture 1 resize reduction]', g_dstImage1) imshow('[Effect Picture 2 resize zoom]', g_dstImage2) imshow('[Effect Picture One Upsampling]', g_dstImage3) imshow('[Effect Picture Two Downsampling]', g_dstImage4)



参照:

https://blog.csdn.net/oliverkingli/article/details/54311091

https://blog.csdn.net/woainishifu/article/details/53260546