Cv2.CopyMakeBorder の使い方【OpenCV/C#(OpenCvSharp)】〜画像に枠(パディング)を付ける〜

OpenCV for C#
📌 準備: OpenCV の環境構築がまだの方はこちら → C++ 環境構築ガイド / C#(OpenCvSharp)セットアップ

Cv2.CopyMakeBorder の使い方【OpenCV/C#(OpenCvSharp)】〜画像に枠(パディング)を付ける〜

Cv2.CopyMakeBorder は、画像の上下左右に任意のサイズの枠(パディング)を追加する関数です。固定色での塗りつぶしや、端ピクセルの反射・繰り返しなど複数の埋め方をサポートしています。

先出しで最小コードを示します。

Cv2.CopyMakeBorder(src, dst, top, bottom, left, right, BorderTypes.Constant, new Scalar(0, 0, 255));

動作環境

  • OpenCV 4.x(OpenCvSharp4)
  • .NET 8 コンソールアプリ(トップレベルステートメント)
  • NuGet: OpenCvSharp4 および OpenCvSharp4.runtime.win(Windows実行時)

環境構築がまだの方は環境構築ガイドを先にどうぞ。


基本の使い方

using OpenCvSharp;

// 画像を読み込む
using var src = Cv2.ImRead("input.jpg");
if (src.Empty())
{
    Console.WriteLine("画像の読み込みに失敗しました。");
    return;
}

// 各辺に 30px の赤いパディングを付ける
using var dst = new Mat();
Cv2.CopyMakeBorder(
    src,
    dst,
    top: 30,
    bottom: 30,
    left: 30,
    right: 30,
    borderType: BorderTypes.Constant,
    value: new Scalar(0, 0, 255) // BGR: 赤
);

Cv2.ImShow("CopyMakeBorder", dst);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

// ファイルに保存
Cv2.ImWrite("output.jpg", dst);
Console.WriteLine($"出力サイズ: {dst.Width} x {dst.Height}");

実行すると、元画像の四辺に 30px 幅の赤い枠が付いた画像がウィンドウに表示されます。入力が 640×480 であれば出力は 700×540 になります。

出力サイズ: 700 x 540

コード解説

行 内容
Cv2.ImRead 元画像を読み込む。Empty チェックは必須
top / bottom / left / right 各辺に追加するピクセル数
BorderTypes.Constant 指定色で塗りつぶすモード
new Scalar(0, 0, 255) BGR 順で赤を指定(Constant 以外では無視される)

引数と戻り値

引数名 型 内容
src Mat 入力画像
dst Mat 出力画像(新しいサイズで書き込まれる)
top int 上辺に追加するピクセル数
bottom int 下辺に追加するピクセル数
left int 左辺に追加するピクセル数
right int 右辺に追加するピクセル数
borderType BorderTypes パディングの埋め方(後述)
value Scalar BorderTypes.Constant 時の塗りつぶし色(省略可・デフォルト黒)

戻り値はなく(void)、結果は dst に書き込まれます。

BorderTypes の主な種類

値 説明 例(端が A B C の場合)
Constant 固定値で塗りつぶす value value | A B C | value value
Reflect 端ピクセルを鏡像で反射 C B A | A B C | C B A
Reflect101 端ピクセルを除いて反射(デフォルト相当) C B | A B C | B A
Replicate 端ピクセルを繰り返す A A | A B C | C C
Wrap 反対側の端を折り返す B C | A B C | A B

実践例

1. 正方形にリサイズする前処理(機械学習でよく使うパターン)

機械学習モデルに入力する前に、アスペクト比を崩さず正方形にしたい場面は多いです。短辺側に Constant パディングを追加することで実現できます。

using OpenCvSharp;

using var src = Cv2.ImRead("input.jpg");
if (src.Empty()) return;

int h = src.Height;
int w = src.Width;
int maxSide = Math.Max(h, w);

// 短辺が長辺に合うようにパディング量を計算
int padTop    = (maxSide - h) / 2;
int padBottom = maxSide - h - padTop;
int padLeft   = (maxSide - w) / 2;
int padRight  = maxSide - w - padLeft;

using var squared = new Mat();
Cv2.CopyMakeBorder(
    src, squared,
    padTop, padBottom, padLeft, padRight,
    BorderTypes.Constant,
    new Scalar(0, 0, 0) // 黒でパディング
);

// 正方形を確認
Console.WriteLine($"元サイズ: {w} x {h}");
Console.WriteLine($"正方形サイズ: {squared.Width} x {squared.Height}");

Cv2.ImWrite("squared.jpg", squared);
元サイズ: 640 x 480
正方形サイズ: 640 x 640

2. 畳み込みフィルタ適用前の境界処理

フィルタ処理(ガウシアンブラー等)で画像端のピクセルが欠損するのを防ぎたい場合、あらかじめ Reflect101 でパディングしてからフィルタを適用し、結果をクロップする手法が使われます。

using OpenCvSharp;

using var src = Cv2.ImRead("input.jpg");
if (src.Empty()) return;

int pad = 5; // フィルタカーネルサイズに合わせる

// 境界を反射パディングで拡張
using var padded = new Mat();
Cv2.CopyMakeBorder(
    src, padded,
    pad, pad, pad, pad,
    BorderTypes.Reflect101
);

// ガウシアンブラーを適用
using var blurred = new Mat();
Cv2.GaussianBlur(padded, blurred, new Size(11, 11), 0);

// パディング分を切り取って元サイズに戻す
using var result = blurred[
    new Rect(pad, pad, src.Width, src.Height)
];

Cv2.ImWrite("filtered.jpg", result);
Console.WriteLine("フィルタ処理完了");
フィルタ処理完了

つまずきポイント

⚠️ dst に src と同じ Mat を渡してはいけない

// NG: src と dst が同一オブジェクト
Cv2.CopyMakeBorder(mat, mat, 10, 10, 10, 10, BorderTypes.Constant);

src と dst に同じ Mat を渡すと未定義動作になります。必ず別の Mat を用意してください。new Mat() を using var dst = new Mat(); で宣言するのが最も安全です。

⚠️ Scalar の色指定は BGR 順

OpenCvSharp では Scalar(B, G, R) の順です。Web やペイントツールで慣れた RGB とは逆順なので、赤を指定したい場合は new Scalar(0, 0, 255) となります。白は new Scalar(255, 255, 255) です。

⚠️ BorderTypes.Transparent はフィルタ系専用

BorderTypes.Transparent は CopyMakeBorder では使用できません(内部でエラーまたは意図しない結果になります)。パディングに使えるのは Constant / Reflect / Reflect101 / Replicate / Wrap です。


関連する関数


まとめ

Cv2.CopyMakeBorder は BorderTypes を切り替えるだけで、固定色・反射・繰り返しなど目的に応じたパディングを簡単に追加できます。機械学習の前処理やフィルタ処理の境界対策など、実務で頻繁に登場するので使い方を押さえておくと効果的です。dst には必ず別の Mat を割り当て、using で確実にリソースを解放する点を忘れずに。

🛠 画像処理のプロが開発するSDK/API

本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。

→ 顔認証のなりすまし対策 設計チェックリスト(当ブログ)
→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

タイトルとURLをコピーしました