OpenCV 4.5.3(日本語機械翻訳)
列挙型 | 関数
Imgproc_transform

列挙型

enum cv::InterpolationFlags {
cv::INTER_NEAREST = 0 , cv::INTER_LINEAR = 1 , cv::INTER_CUBIC = 2 , cv::INTER_AREA = 3 ,
cv::INTER_LANCZOS4 = 4 , cv::INTER_LINEAR_EXACT = 5 , cv::INTER_NEAREST_EXACT = 6 , cv::INTER_MAX = 7 ,
cv::WARP_FILL_OUTLIERS = 8 , cv::WARP_INVERSE_MAP = 16
}
補間アルゴリズム[【詳解】(英語]
enum cv::WarpPolarMode { cv::WARP_POLAR_LINEAR = 0 , cv::WARP_POLAR_LOG = 256 }
極座標マッピングモードの指定[【詳解】(英語]
enum InterpolationMasks { INTER_BITS = 5 , INTER_BITS2 = INTER_BITS * 2 , INTER_TAB_SIZE = 1 << INTER_BITS , INTER_TAB_SIZE2 = INTER_TAB_SIZE * INTER_TAB_SIZE }

関数

CV_EXPORTS_W void cv::resize (InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
画像のサイズを変更します.[【詳解】(英語]
CV_EXPORTS_W void cv::warpAffine (InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar())
画像にアフィン変換を施します.[【詳解】(英語]
CV_EXPORTS_W void cv::warpPerspective (InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar())
画像に透視変換を施します.[【詳解】(英語]
CV_EXPORTS_W void cv::remap (InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar())
一般的な幾何学変換を画像に適用します.[【詳解】(英語]
CV_EXPORTS_W void cv::convertMaps (InputArray map1, InputArray map2, OutputArray dstmap1, OutputArray dstmap2, int dstmap1type, bool nninterpolation=false)
画像変換マップを、ある表現から別の表現に変換します。[【詳解】(英語]
CV_EXPORTS_W Mat cv::getRotationMatrix2D (Point2f center, double angle, double scale)
2次元回転のアフィン変換行列を求めます.[【詳解】(英語]
CV_EXPORTS Matx23d cv::getRotationMatrix2D_ (Point2f center, double angle, double scale)
CV_EXPORTS Mat cv::getAffineTransform (const Point2f src[], const Point2f dst[])
3組の対応点からアフィン変換を計算します.[【詳解】(英語]
CV_EXPORTS_W void cv::invertAffineTransform (InputArray M, OutputArray iM)
アフィン変換の逆変換を行います.[【詳解】(英語]
CV_EXPORTS_W Mat cv::getPerspectiveTransform (InputArray src, InputArray dst, int solveMethod=DECOMP_LU)
対応する4つの点の組から透視変換を求めます.[【詳解】(英語]
CV_EXPORTS Mat cv::getPerspectiveTransform (const Point2f src[], const Point2f dst[], int solveMethod=DECOMP_LU)
CV_EXPORTS_W Mat cv::getAffineTransform (InputArray src, InputArray dst)
CV_EXPORTS_W void cv::getRectSubPix (InputArray image, Size patchSize, Point2f center, OutputArray patch, int patchType=-1)
画像から,サブピクセル精度でピクセル単位の矩形を取得します.[【詳解】(英語]
CV_EXPORTS_W void cv::logPolar (InputArray src, OutputArray dst, Point2f center, double M, int flags)
画像を半極座標空間にリマップします。[【詳解】(英語]
CV_EXPORTS_W void cv::linearPolar (InputArray src, OutputArray dst, Point2f center, double maxRadius, int flags)
画像を極座標空間に再マッピングします。[【詳解】(英語]
CV_EXPORTS_W void cv::warpPolar (InputArray src, OutputArray dst, Size dsize, Point2f center, double maxRadius, int flags)
画像を極座標または半極座標空間に再マッピングします。[【詳解】(英語]

詳解

列挙型詳解

InterpolationFlags

補間アルゴリズム

列挙値
INTER_NEAREST

最近傍補間

INTER_LINEAR

バイリニア補間

INTER_CUBIC

バイキュービック補間

INTER_AREA

画素の面積関係を利用したリサンプリング。モアレのない結果が得られるので、画像のデシメーションには好ましい方法かもしれません。しかし、画像を拡大すると、INTER_NEAREST法と同様の結果になります。

INTER_LANCZOS4

8x8近傍でのLanczos補間を行います。

INTER_LINAR_EXACT

ビット厳密なバイリニア補間

INTER_NEAREST_EXACT

ビット単位の正確な最近傍補間。PIL, scikit-image, Matlabでの最近傍法と同じ結果が得られます.

INTER_MAX

補間コードのマスク.

warp_fill_outliers

フラグを指定すると,出力画像のすべてのピクセルを埋めます.そのうちのいくつかが,ソース画像の外れ値に対応する場合,それらは0にセットされます

warp_inverse_map

フラグ、逆変換

例えば,以下のようになります.linearPolarまたはlogPolarは変換します。

  • フラグははあまり成功しません。が設定されています。$dst( \rho , \phi ) = src(x,y)$
  • フラグが設定されています。$dst(x,y) = src( \rho , \phi )$

WarpPolarMode

極座標マッピングモードの指定

参照
warpPolar
列挙値
ワープ_ポーラー_リニア

画像を極座標空間へ/からリマップします。

WARP_POLAR_LOG

セミログ極性空間への/からの画像のリマップを行います。

関数詳解

convertMaps()

CV_EXPORTS_W void cv::convertMaps ( InputArray map1,
InputArray map2,
OutputArray dstmap1,
OutputArray dstmap2,
int dstmap1type,
bool nninterpolation = false
)

画像変換マップを、ある表現から別の表現に変換します。

この関数は、リマップ用のマップのペアを、ある表現から別の表現に変換します。以下のオプション( (map1.type(), map2.type())$\rightarrow$(dstmap1.type(), dstmap2.type()) ) がサポートされています。

  • $\texttt{(CV_32FC1, CV_32FC1)} \rightarrow \texttt{(CV_16SC2, CV_16UC1)}$. これは,最も頻繁に使われる変換操作で,元の浮動小数点マップ(remapを参照)を,よりコンパクトで高速な固定小数点表現に変換します。1 番目の出力配列には,丸められた座標が含まれ,2 番目の出力配列(nninterpolation=false の場合のみ作成)には,補間テーブルのインデックスが含まれます.
  • $\texttt{(CV_32FC2)} \rightarrow \texttt{(CV_16SC2, CV_16UC1)}$. 上述と同じですが,元のマップは 1 つの 2 チャンネルマトリックスに保存されます.
  • 逆変換.当然のことながら,再構成された浮動小数点型マップは,元のマップと全く同じものではありません.
引数
map1 CV_16SC2, CV_32FC1, CV_32FC2 のいずれかのタイプの最初の入力マップ.
map2 2 番目の入力マップは,それぞれ CV_16UC1,CV_32FC1,または none(空の行列).
dstmap1 src と同じサイズで, dstmap1type 型の 1 番目の出力マップ.
dstmap2 2番目の出力マップ.
dstmap1type CV_16SC2, CV_32FC1, または CV_32FC2 であるべき,最初の出力マップの種類.
nninterpolation 固定小数点型マップが,最近傍補間に利用されるのか,より複雑な補間に利用されるのかを示すフラグ.
参照
remap,undistort,initUndistortRectifyMap

getAffineTransform()

CV_EXPORTS Mat cv::getAffineTransform ( const Point2f src[],
const Point2f dst[]
)

3組の対応点からアフィン変換を計算します.

この関数は,アフィン変換の行列を$2 \times 3$の行列を計算し,次のようにします.

\[\begin{bmatrix} x'_i \\ y'_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\]

ここで

\[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2\]

引数
src 入力画像中の三角形の頂点の座標
dst デスティネーション画像における,対応する三角形の頂点の座標
参照
warpAffine,transform

getPerspectiveTransform() [1/2]

CV_EXPORTS Mat cv::getPerspectiveTransform ( const Point2f src[],
const Point2f dst[],
int solveMethod = DECOMP_LU
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

getPerspectiveTransform() [2/2]

CV_EXPORTS_W Mat cv::getPerspectiveTransform ( InputArray src,
InputArray dst,
int solveMethod = DECOMP_LU
)

対応する4つの点の組から透視変換を求めます.

この関数は,アフィン変換の行列を$3 \times 3$透視変換の行列を以下のように計算します。

\[\begin{bmatrix} t_i x'_i \\ t_i y'_i \\ t_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\]

ここで

\[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2,3\]

引数
src 変換元画像の四角形の頂点の座標.
dst コピー先の画像にある,対応する四角形の頂点の座標
solveMethod に渡されるメソッドです.cv::solve(DecompTypes)
参照
findHomography,warpPerspective,perspectiveTransform

getRectSubPix()

CV_EXPORTS_W void cv::getRectSubPix ( InputArray image,
Size patchSize,
Point2f center,
OutputArray patch,
int patchType = -1
)

画像から,サブピクセル精度でピクセル単位の矩形を取得します.

関数 getRectSubPix は, src.Of.Picture からピクセルを抽出します.

\[patch(x, y) = src(x + \texttt{center.x} - ( \texttt{dst.cols} -1)*0.5, y + \texttt{center.y} - ( \texttt{dst.rows} -1)*0.5)\]

ここで,非整数の座標にあるピクセルの値は,バイリニア補間を用いて取得されます.マルチチャンネル画像の各チャンネルは,独立して処理されます.また,画像はシングルチャンネルまたは3チャンネルの画像でなければいけません.矩形の中心は画像内になければなりませんが,矩形の一部が画像外にあっても構いません.

引数
image 元画像。
patchSize 抽出されたパッチのサイズ.
center ソース画像内の抽出された矩形の中心の浮動小数点座標.中心は画像内になければなりません。
patch src と同じサイズの patchSize と同じチャンネル数を持つ,抽出されたパッチ.
patchType 抽出されたピクセルの深さ.デフォルトでは, src と同じ深さになります.
参照
warpAffine,warpPerspective

getRotationMatrix2D()

Mat cv::getRotationMatrix2D ( Point2f center,
double angle,
double scale
)
inline

2次元回転のアフィン変換行列を求めます.

この関数は,以下のような行列を計算します.

\[\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot \texttt{center.x} - \beta \cdot \texttt{center.y} \\ - \beta & \alpha & \beta \cdot \texttt{center.x} + (1- \alpha ) \cdot \texttt{center.y} \end{bmatrix}\]

ここで

\[\begin{array}{l} \alpha = \texttt{scale} \cdot \cos \texttt{angle} , \\ \beta = \texttt{scale} \cdot \sin \texttt{angle} \end{array}\]

この変換は,回転中心を自分自身にマッピングします.これがターゲットではない場合は,シフトを調整します.

引数
center ソース画像における回転の中心.
angle 度単位で表される回転角度.正の値は,反時計回りの回転を意味します(座標原点は左上隅であると仮定します).
scale 等方性のスケールファクターです。
参照
getAffineTransform,warpAffine,transform

getRotationMatrix2D_()

CV_EXPORTS Matx23d cv::getRotationMatrix2D_ ( Point2f center,
double angle,
double scale
)

invertAffineTransform()

CV_EXPORTS_W void cv::invertAffineTransform ( InputArray M,
OutputArray iM
)

アフィン変換の逆変換を行います.

この関数は,次式で表されるアフィン変換の逆変換を求めます$2 \times 3$行列 M で表される逆アフィン変換を求めます.

\[\begin{bmatrix} a_{11} & a_{12} & b_1 \\ a_{21} & a_{22} & b_2 \end{bmatrix}\]

その結果は,M と同じ型の$2 \times 3$結果もまた,M と同じ型の行列です.

引数
M 元のアフィン変換。
iM 出力される逆アフィン変換.

linearPolar()

CV_EXPORTS_W void cv::linearPolar ( InputArray src,
OutputArray dst,
Point2f center,
double maxRadius,
int flags
)

画像を極座標空間に再マッピングします。

非推奨:
この関数は、以下と同じ結果をもたらしますcv::warpPolar(src, dst, src.size(), center, maxRadius, flags)

logPolar()

CV_EXPORTS_W void cv::logPolar ( InputArray src,
OutputArray dst,
Point2f center,
double M,
int flags
)

画像を半極座標空間にリマップします。

非推奨:
この関数は、以下と同じ結果をもたらしますcv::warpPolar(src, dst, src.size(), center, maxRadius, flags+WARP_POLAR_LOG);

remap()

CV_EXPORTS_W void cv::remap ( InputArray src,
OutputArray dst,
InputArray map1,
InputArray map2,
int interpolation,
int borderMode = BORDER_CONSTANT ,
const Scalar & borderValue = Scalar()
)

一般的な幾何学変換を画像に適用します.

関数 remap は,指定されたマップを用いて入力画像を変換します.

\[\texttt{dst} (x,y) = \texttt{src} (map_x(x,y),map_y(x,y))\]

ここで,非整数の座標を持つピクセルの値は,利用可能な補間手法の1つを用いて計算されます.$map_x$および$map_y$は,それぞれ独立した浮動小数点型マップである$map_1$および$map_2$の独立した浮動小数点マップ,あるいは,インターリーブされた$(x,y)$を使用します。$map_1$のインターリーブされた浮動小数点マップ,または convertMaps を用いて作成された固定小数点マップとしてエンコードすることができます。マップを浮動小数点表現から固定小数点表現に変換したい理由は,再マッピング操作が非常に高速(2倍)になるからです.変換されたケースでは$map_1$には,ペア (cvFloor(x), cvFloor(y)) が含まれており$map_2$補間係数のテーブルのインデックスを含みます.

この関数は,インプレイス処理を行うことはできません.

引数
src 元画像。
dst 出力画像.map1 と同じサイズで, src と同じ型です.
map1 (x,y)点,または CV_16SC2 , CV_32FC1, CV_32FC2 型の x 値のみからなる最初のマップ.高速化のために浮動小数点表現を固定小数点に変換する方法の詳細は, convertMaps を参照してください.
map2 2番目のマップは,それぞれ CV_16UC1, CV_32FC1, none (map1 が (x,y) 点の場合は,空のマップ)の型を持つ y 値のマップです.
interpolation 補間方法(以下のInterpolationFlags). メソッドINTER_AREAおよびINTER_LINEAR_EXACTは,この関数ではサポートされません.
borderMode ピクセル外挿法(参照BorderTypes). borderMode=BORDER_TRANSPARENTの場合は,ソース画像の「外れ値」に対応する出力画像のピクセルが,この関数によって変更されないことを意味します.
borderValue ボーダーが一定の場合に利用される値です.デフォルトでは,0です.
覚え書き
現在の実装上の制限により,入力画像と出力画像のサイズは 32767x32767 以下でなければなりません.

resize()

CV_EXPORTS_W void cv::resize ( InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR
)

画像のサイズを変更します.

関数 resize は,画像 src を指定されたサイズまで,あるいはそれ以上にリサイズします.ただし,初期状態の dst の型やサイズは考慮されません.代わりに,サイズとタイプはsrc,dsize,fxを満たす。fy. あらかじめ作成された dst に収まるように src のサイズを変更したい場合は,以下のようにこの関数を呼び出します.

// explicitly specify dsize=dst.size(); fx and fy will be computed from that.
resize(src, dst, dst.size(), 0, 0, interpolation);
CV_EXPORTS_W void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
Resizes an image.

画像を各方向に2分の1ずつ縮小したい場合は,このように関数を呼び出します.

// specify fx and fy and let the function compute the destination image size.
resize(src, dst, Size(), 0.5, 0.5, interpolation);
Template class for specifying the size of an image or rectangle.
Definition: core/types.hpp:316

画像を縮小するには,一般的に補間が最適です.INTER_AREA一方,画像を拡大する場合には,c::INTER_CUBIC(遅い)あるいはINTER_LINEAR(より速いが,それでも問題はない).

引数
src 入力画像.
dst src.size(), fx, fy から計算されたサイズ,または dsize (0でない場合)を持ちます.
dsize 出力画像のサイズ.これが0の場合,次のように計算されます.

\[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}\]

dsize または fx とfy の両方が0以外でなければいけません.
fx 水平軸方向のスケールファクタ; これが0の場合,以下のように計算されます

\[\texttt{(double)dsize.width/src.cols}\]

fy 垂直軸方向のスケールファクタ;0に等しい場合,次のように計算されます

\[\texttt{(double)dsize.height/src.rows}\]

interpolation 補間法,参照InterpolationFlags
参照
warpAffine,warpPerspective,remap

warpAffine()

CV_EXPORTS_W void cv::warpAffine ( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR ,
int borderMode = BORDER_CONSTANT ,
const Scalar & borderValue = Scalar()
)

画像にアフィン変換を施します.

関数 warpAffine は,指定された行列を用いて入力画像を変換します.

\[\texttt{dst} (x,y) = \texttt{src} ( \texttt{M} _{11} x + \texttt{M} _{12} y + \texttt{M} _{13}, \texttt{M} _{21} x + \texttt{M} _{22} y + \texttt{M} _{23})\]

フラグWARP_INVERSE_MAPがセットされている場合 それ以外の場合,変換はまずinvertAffineTransformで反転された後,M の代わりに上述の式に入れられます.この関数は,インプレース処理を行うことはできません.

引数
src 入力画像.
dst src と同じ型で,サイズが dsize である出力画像.
M $2\times 3$変換行列.
dsize 出力画像のサイズ.
flags 補間手法の組み合わせ(参照InterpolationFlagsを参照してください)と,オプションのフラグWARP_INVERSE_MAPこれは,M が逆変換であることを意味します ($\texttt{dst}\rightarrow\texttt{src}$).
borderMode ピクセル外挿法(参照BorderTypes); borderMode=BORDER_TRANSPARENTの場合,入力画像中の「外れ値」に対応する出力画像中のピクセルは,この関数によって変更されないことを意味します.
borderValue ボーダーが一定の場合に使われる値で,デフォルトでは0です.
参照
warpPerspective,resize,remap,getRectSubPix,transform

warpPerspective()

CV_EXPORTS_W void cv::warpPerspective ( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR ,
int borderMode = BORDER_CONSTANT ,
const Scalar & borderValue = Scalar()
)

画像に透視変換を施します.

関数 warpPerspective は,指定された行列を用いて入力画像を変換します.

\[\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right )\]

フラグWARP_INVERSE_MAPが設定されている場合は,その行列を用いて元画像を変換します.そうでない場合は,まず invert で変換を反転させてから,M の代わりに上の式に入れます.この関数は,インプレースでは動作しません.

引数
src 入力画像.
dst src と同じ型で,サイズが dsize である出力画像.
M $3\times 3$変換行列.
dsize 出力画像のサイズ.
flags 補間手法の組み合わせ (INTER_LINEARまたはINTER_NEARESTを参照してください)と,オプションのフラグWARP_INVERSE_MAPM を逆変換として設定する ($\texttt{dst}\rightarrow\texttt{src}$).
borderMode ピクセル外挿法 (BORDER_CONSTANTまたはBORDER_REPLICATE).
borderValue の値は,境界が一定の場合に使用されます.デフォルトでは,0 に設定されています.
参照
warpAffine,resize,remap,getRectSubPix,perspectiveTransform

warpPolar()

CV_EXPORTS_W void cv::warpPolar ( InputArray src,
OutputArray dst,
Size dsize,
Point2f center,
double maxRadius,
int flags
)

画像を極座標または半極座標空間に再マッピングします。

Polar remaps reference

ソース画像を次の変換を用いて変換します。

\[ dst(\rho , \phi ) = src(x,y) \]

ここで

\[ \begin{array}{l} \vec{I} = (x - center.x, \;y - center.y) \\ \phi = Kangle \cdot \texttt{angle} (\vec{I}) \\ \rho = \left\{\begin{matrix} Klin \cdot \texttt{magnitude} (\vec{I}) & default \\ Klog \cdot log_e(\texttt{magnitude} (\vec{I})) & if \; semilog \\ \end{matrix}\right. \end{array} \]

および

\[ \begin{array}{l} Kangle = dsize.height / 2\Pi \\ Klin = dsize.width / maxRadius \\ Klog = dsize.width / log_e(maxRadius) \\ \end{array} \]

線形マッピングとセミログマッピング

極座標マッピングには,線形または半対数があります。のいずれかを追加します。WarpPolarModeからflagsのいずれかを追加して、ポーラーマッピングのモードを指定します。

Linearはデフォルトのモードです。

セミログマッピングは、人間の「小窩座」と呼ばれる視覚を模倣しています。小窩座では、視線方向の視力が非常に高く、周辺部では視力が低くなります。

dsizeに関するオプションです。
  • 両方の値がdsize <=0(の場合(デフォルト)、デスティネーションイメージはソースのバウンディングサークルの面積と(ほぼ)同じになります。

    \[\begin{array}{l} dsize.area \leftarrow (maxRadius^2 \cdot \Pi) \\ dsize.width = \texttt{cvRound}(maxRadius) \\ dsize.height = \texttt{cvRound}(maxRadius \cdot \Pi) \\ \end{array}\]

  • のみの場合dsize.height <= 0のみの場合,出力画像の面積は境界円の面積に比例しますが,スケーリングはKx * Kx:

    \[\begin{array}{l} dsize.height = \texttt{cvRound}(dsize.width \cdot \Pi) \\ \end{array} \]

  • 両方の値がdsize > 0によってスケーリングされた場合,出力画像は指定されたサイズになるので,外接円の面積は以下のようにスケーリングされます.dsize.
リバースマッピング

を加えたリバースマッピングを行うことができます。WARP_INVERSE_MAPからflags

極座標から元の座標を計算するには、次のようにします。$(rho, phi)->(x, y)$:

引数
src 元画像。
dst 出力画像.src と同じ種類になります。
dsize 出力画像のサイズ(有効なオプションについては,説明を参照してください).
center 変換の中心を表します.
maxRadius 変換する境界円の半径です.逆方向の大きさを表すスケールパラメータもここで決まります.
flags 補間方法の組み合わせです.InterpolationFlags+WarpPolarMode.
  • を追加します。WARP_POLAR_LINEARは,リニアポーラマッピングを選択します(デフォルト)。
  • を追加します。WARP_POLAR_LOGを選択すると、セミログ・ポーラー・マッピング
  • を追加します。WARP_INVERSE_MAPを選択して,逆方向のマッピングを行います。
覚え書き
  • この機能はインプレースでは動作しません。
  • 大きさと角度を度単位で計算するにはcartToPolarが内部で使用されているため、角度は0から360まで、約0.3度の精度で測定されます。
  • この関数はremap. 現在の実装上の制限により,入力画像と出力画像のサイズは 32767x32767 未満でなければなりません.
参照
cv::remap