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.GaussianBlur / Cv2.Filter2D — フィルタ処理の前処理として
CopyMakeBorderと組み合わせることが多い - Cv2.WarpPerspective の使い方【OpenCV/C#(OpenCvSharp)】〜射影変換で画像を補正する〜 — 変換後の黒帯をパディングで調整したい場面で役立つ
- Cv2.InRange の使い方【OpenCV/C#(OpenCvSharp)】〜色範囲でマスクを作る(色抽出)〜 — パディング後の領域分離に組み合わせて使えるテクニック
まとめ
Cv2.CopyMakeBorder は BorderTypes を切り替えるだけで、固定色・反射・繰り返しなど目的に応じたパディングを簡単に追加できます。機械学習の前処理やフィルタ処理の境界対策など、実務で頻繁に登場するので使い方を押さえておくと効果的です。dst には必ず別の Mat を割り当て、using で確実にリソースを解放する点を忘れずに。
🛠 画像処理のプロが開発するSDK/API
本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。
→ 顔認証のなりすまし対策 設計チェックリスト(当ブログ)
→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

