opencvのremap()python



Remap Python Opencv



1つは、remap()画像の再マッピングです。これは、画像内の特定の位置にあるピクセルを別の画像内の指定された位置に配置するプロセスです。画像は変形したり、歪んだり、反転したりする可能性があります。画像データの強化を実現し、深度モデルの一般化能力を向上させます。設定した機能に合わせて画像を変形させることができます。より一般的な関数は、x軸の反転、y軸の反転、x軸とy軸の反転に関するものです(画像処理におけるアフィン変換の主な機能は、ズーム、回転、平行移動、ねじれなどです)。
次に、マッピングプロセスを完了するには、ソース画像とターゲット画像のピクセル座標が1対1で対応していないため、非整数ピクセルの補間座標を取得する必要があります。
3、リマップ機能

def remap(src, map1, map2, interpolation, dst=None, borderMode=None, borderValue=None)

srcはソース画像データ、map1は内挿に使用されるX座標、map2は内挿に使用されるY座標、および内挿は使用される内挿アルゴリズムです。
サポートされている補間アルゴリズムは次のとおりです。
INTER_NEAREST-最近隣内挿
INTER_LINEAR –双一次補間(デフォルト値)
INTER_CUBIC –バイキュービックスプライン補間(4×4ピクセルを超える近傍のバイキュービック補間)
INTER_LANCZOS4 -Lanczos補間(8×8ピクセル近傍でのLanczos補間)
ボーダーモードであるborderModeのデフォルト値はBORDER_CONSTANTです。これは、ターゲット画像の「外れ値」のピクセル値がこの関数によって変更されないことを意味します。
borderValueは、一定の境界線がある場合に使用される値であり、デフォルト値はScalar()です。つまり、デフォルト値は0です。



4、サンプルコード

def random_warp_rev(image, res=64): assert image.shape == (256,256,6) res_scale = res//64 assert res_scale >= 1, f'Resolution should be >= 64. Recieved {res}.' interp_param = 80 * res_scale interp_slice = slice(interp_param//10,9*interp_param//10) dst_pnts_slice = slice(0,65*res_scale,16*res_scale) rand_coverage = np.random.randint(20) + 78 # random warping coverage rand_scale = np.random.uniform(5., 6.2) # random warping scale range_ = np.linspace(128-rand_coverage, 128+rand_coverage, 5) mapx = np.broadcast_to(range_, (5,5)) mapy = mapx.T mapx = mapx + np.random.normal(size=(5,5), scale=rand_scale) mapy = mapy + np.random.normal(size=(5,5), scale=rand_scale) interp_mapx = cv2.resize(mapx, (interp_param,interp_param))[interp_slice,interp_slice].astype('float32') interp_mapy = cv2.resize(mapy, (interp_param,interp_param))[interp_slice,interp_slice].astype('float32') warped_image = cv2.remap(image, interp_mapx, interp_mapy, cv2.INTER_LINEAR) src_points = np.stack([mapx.ravel(), mapy.ravel()], axis=-1) dst_points = np.mgrid[dst_pnts_slice,dst_pnts_slice].T.reshape(-1,2) mat = umeyama(src_points, dst_points, True)[0:2] target_image = cv2.warpAffine(image, mat, (res,res)) return warped_image, target_image

5、分析例



slice(start, stop[, step])

この関数の機能は、主にスライス操作関数のパラメータ転送に使用されるスライスオブジェクトを実現することです。

numpy.random.randint(low, high=None, size=None, dtype='l')

この関数の機能は、低(含む)から高(含まない)までの範囲のランダムな整数、つまり[低、高)を返すことです。
パラメータhighの値が書き込まれていない場合は、[0、low)の値が返されます。

numpy.random.uniform(low,high,size)

関数の機能は、一様分布[低、高)からランダムにサンプリングすることです。ドメインは左に閉じて右に開いていることに注意してください。つまり、ドメインには低値が含まれていますが、高値は含まれていません。
パラメータの紹介:



low: sampling lower bound, float type, default value is 0 high: sampling upper bound, float type, the default value is 1 size: The number of output samples, in int or tuple type, for example, size=(m,n,k), then m*n*k samples are output, and 1 value is output by default.

戻り値:ndarrayタイプ、その形状はパラメーターサイズの説明と一致しています。

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

関数の機能は、開始と停止の間に等間隔のデータを返すことです)
間隔の終わりを除外するかどうかを選択します。
start:サンプルデータの開始点を返します
停止:サンプルデータの終点に戻ります
num:生成されるサンプルデータの量。デフォルトは50です。
エンドポイント:Trueには停止が含まれますFalseには停止が含まれません
retstep:Trueの場合、結果はデー​​タ間隔を示します)
dtype:出力配列タイプ
軸:0(デフォルト)または-1

numpy.broadcast_to(array, shape, subok)

この関数の役割は、np.broadcast_to関数が配列を新しい形状にブロードキャストすることです。

np.random.normal(size,loc,scale):

関数の関数は、locの平均値とスケールの標準偏差を持つガウス乱数(フィールド)を与えることです。
パラメーター:
場所:フロート
この確率分布の平均(分布全体の中心に対応)

スケール:フロート
この確率分布の標準偏差(分布の幅に対応して、スケールが大きいほど、短くて太く、スケールが小さいほど、薄くて高くなります)
サイズ:intまたはintのタプル
出力形状。デフォルトはNoneで、1つの値のみが出力されます。

6つ目は、リマップとアフィン変換を使用して、画像の局所的な歪み強調効果を実現することです。
元の画像 画像
ディストーション後