スポンサーリンク

Pythonで画像加工!OpenCVの使い方をやさしく解説【初心者向け】

画像処理

1. はじめに|Pythonで画像加工してみよう!

みなさんは「Pythonで画像加工ができる」って聞いたことありますか?

ふだんはスマホアプリで写真を加工することが多いと思いますが、実はPythonを使えば、プログラムで画像を自由にいじることができるんです。「明るさを変える」「サイズを小さくする」「白黒にする」「くるっと回転させる」…こんな操作がたった数行のコードでできてしまうのは、とっても面白いですよ!

今回紹介するのは「OpenCV(オープンシーヴィー)」というライブラリ。名前の通り、コンピュータビジョン(=画像や映像を扱う技術)用に作られたツールです。もともとはC++で作られていますが、Pythonからもかんたんに使えるようになっています。


この記事では、OpenCVを使って以下のような画像操作を体験できます:

  • 画像の読み込みと表示
  • サイズの変更やトリミング(切り抜き)
  • 色の変換(白黒など)
  • 回転・反転
  • 画像の保存
  • 複数の画像を重ねる(合成)
  • 明るさやコントラストの調整

プログラミング初心者の方でも大丈夫!画像が変わっていく様子が目に見えるので、「コードって楽しい!」と実感しやすい内容になっています。

それでは、Pythonで画像加工の世界に一歩踏み出してみましょう!




2. OpenCVの導入と画像データの基本

画像加工を始める前に、まずはPythonでOpenCVを使えるように準備しましょう!

🔧 OpenCVをインストールしよう

PythonにOpenCVを追加するには、以下のコマンドをターミナルやコマンドプロンプトで実行するだけです:

pip install opencv-python

また、画像を画面に表示したいときに便利なライブラリとして**Matplotlib(マットプロットリブ)**も一緒に使います。こちらもまだインストールしていない場合は、以下のようにまとめて入れておくと安心です。

pip install matplotlib

インストールができたら、Pythonコードの最初にこんなふうに書いて準備します:

import cv2
import matplotlib.pyplot as plt

これで準備OKです!


🖼 OpenCVで扱う画像のしくみ

OpenCVで画像を読み込むと、そのデータはNumPyの「ndarray(エヌディーアレイ)」という配列の形で扱われます。ちょっとむずかしく聞こえるかもしれませんが、要するに画像は「数字が並んだデータのかたまり」として扱うんです。

カラー画像の場合、次のような3次元の構造になります:

[縦のピクセル][横のピクセル][色のチャンネル(B, G, R)]

たとえば、500×300ピクセルの画像であれば、次のような配列になります。

画像.shape  # => (500, 300, 3)

ここで注意点がひとつ!
OpenCVは、カラー画像を「BGR(ブルー・グリーン・レッド)」の順番で読み込むんです。
一般的な画像表示では「RGB(レッド・グリーン・ブルー)」が使われるので、そのまま表示すると「色がおかしい?」と感じるかもしれません。

そのときは、以下のように色の順番を変換することで正しい色で表示できます:

画像_rgb = cv2.cvtColor(画像, cv2.COLOR_BGR2RGB)

次回は、実際に画像を読み込んで表示する方法や、基本的な加工(サイズ変更、保存、トリミングなど)を順番に解説していきます!




3. よく使う基本操作をマスターしよう!

OpenCVを使って画像を加工するには、まずよく使う操作を覚えることが大切です。ここでは、基本中の基本ともいえる画像の読み込み・表示・保存・サイズ変更などを、実際のコードと一緒に紹介します!


📥 画像を読み込む(cv2.imread())

画像ファイルを読み込むには、以下のようにcv2.imread()を使います。

import cv2

img = cv2.imread("sample.jpg") # ファイル名を指定

このコードで、画像はNumPy配列(ndarray)として読み込まれます。


👀 画像を表示する(matplotlibとcv2.cvtColor)

OpenCVで読み込んだ画像を表示したいときは、Matplotlibと組み合わせると便利です。ただしOpenCVはBGR形式なので、RGBに変換してから表示しましょう。

import matplotlib.pyplot as plt

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR → RGB変換
plt.imshow(img_rgb)
plt.axis('off') # 軸の目盛りを非表示
plt.show()

💾 画像を保存する(cv2.imwrite())

画像を加工したあとに保存したいときは、次のように書きます。

cv2.imwrite("output.jpg", img)

指定したファイル名で画像が保存されます。拡張子(.jpg や .png)によって保存形式が決まります。


🔍 画像のサイズを変える(cv2.resize())

画像をリサイズするときは、横と縦のサイズをタプルで指定します。

resized = cv2.resize(img, (200, 150))  # 横200ピクセル、縦150ピクセル

元の縦横比を保ちたい場合は、元のサイズをもとに自分で比率を計算しましょう。


✂️ 一部分を切り出す(トリミング)

NumPyのスライス機能を使えば、画像の一部を切り出せます。

cropped = img[100:300, 200:400]  # 縦100〜300、横200〜400の範囲を抽出

まるで「画像をハサミで切り抜く」ように、必要な部分だけ取り出せます。


⚫ 画像をグレースケール(白黒)にする

カラー画像をモノクロに変換したいときは、以下のコードを使います。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

グレースケール画像は、明るさの情報だけを持った2次元配列になります。


🔄 画像を回転させる(cv2.rotate())

画像を回転させたいときは、定数で向きを指定します。

rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)  # 時計回りに90度回転

他にも以下のような定数が使えます:

  • cv2.ROTATE_180:180度回転
  • cv2.ROTATE_90_COUNTERCLOCKWISE:反時計回り90度

🔁 画像を反転する(cv2.flip())

上下や左右に画像をひっくり返すには、こちらを使います:

flipped = cv2.flip(img, 1)  # 左右反転(1)、上下反転は0、上下左右反転は-1

ここまで覚えれば、画像の基本操作はバッチリです!




4. 画像を合成してみよう!重ね合わせの基本

ここでは、2枚の画像を重ねて合成する方法を紹介します。ポスターやスタンプ画像を合成したり、ロゴを写真に載せたりするのに便利なテクニックです!


🧱 画像の合成ってどうやるの?

画像は数値のかたまり(NumPyの配列)なので、一部分を差し替えたり、数値を混ぜたりすることで、重ね合わせができます。やり方は大きく分けて2つあります:

  1. 不透明な画像を重ねる方法
  2. 透過(アルファ付き)画像を重ねる方法

📌 不透明な画像の合成(上書き)

まずはカンタンな方法から。画像Aに、画像Bをそのまま上書きするイメージです。

# 画像AとBを読み込み
img_a = cv2.imread("background.jpg")
img_b = cv2.imread("overlay.jpg")

# 画像Bの高さ・幅を取得
h, w = img_b.shape[:2]

# 画像Aの左上にBを貼り付ける(上書き)
img_a[0:h, 0:w] = img_b

これだけで画像Bが画像Aの左上に重ねられます!

✅ ポイント:画像サイズが合っていないとエラーになります。貼り付けたい位置やサイズをしっかり確認しましょう。


🌈 アルファ付き画像の合成(透明あり)

透過PNG画像など、「透明な部分がある画像」を重ねるには、もう少し工夫が必要です。

📥 アルファ付き画像の読み込み

img_a = cv2.imread("background.jpg")
img_b = cv2.imread("stamp.png", cv2.IMREAD_UNCHANGED) # アルファチャンネル付きで読み込み

IMREAD_UNCHANGEDを使うことで、RGBA(4チャンネル)として画像を読み込めます。

⚙️ アルファブレンド(透明度を考慮して合成)

# RGBAの各チャンネルに分割
b, g, r, a = cv2.split(img_b)
rgb_b = cv2.merge((b, g, r)) # RGB画像として再構成

# アルファ値を0〜1に正規化
alpha = a / 255.0
alpha = alpha[:, :, None] # 形を整える

# 貼り付け先の座標
x, y = 50, 50
h, w = rgb_b.shape[:2]

# 背景部分の取得
roi = img_a[y:y+h, x:x+w]

# アルファブレンド(透明度を使って合成)
blended = (alpha * rgb_b + (1 - alpha) * roi).astype("uint8")

# 背景画像に戻す
img_a[y:y+h, x:x+w] = blended

この方法では、透明な部分は背景が見え、不透明な部分はしっかり重なって表示されます。


💡 合成の活用例

  • 写真にウォーターマーク(透かし)を入れる
  • スタンプ風のPNG画像を何枚も貼る
  • UIやゲームで複数画像を1つの画面にまとめる

画像を重ねるテクニックは、アイデア次第でいろんな場面で活躍します!
次は、明るさやコントラストを調整して画質を変える方法を紹介します。




5. 明るさ・コントラストの調整

「この画像、ちょっと暗いな…」
「もっとハッキリした色にしたい!」

そんなときに役立つのが、明るさやコントラストを調整する処理です。OpenCVなら、これもたった1行でサクッと調整できますよ。


🔧 使う関数は cv2.convertScaleAbs()

OpenCVでは、明るさやコントラストを調整するのに以下の関数を使います:

cv2.convertScaleAbs(画像, alpha=係数, beta=値)

それぞれの引数の意味はこちらです:

  • alpha:コントラストの係数(色の強さ)
    → 1.0で元のまま。大きくするとコントラストが強くなります。
  • beta:明るさの加算値(0〜100くらいまでが目安)
    → 数字を大きくすると全体が明るくなります。

🌞 画像を明るくしてみよう!

bright = cv2.convertScaleAbs(img, alpha=1.0, beta=50)

このコードでは、元の画像をそのままに、明るさだけ+50しています。
ちょっと暗めの画像を明るく見せたいときに便利です!


🎨 コントラストを強くするには?

high_contrast = cv2.convertScaleAbs(img, alpha=1.5, beta=0)

この場合は、色の差がハッキリしたくっきり画像になります。
風景写真や商品写真などを際立たせたいときに使えます。


🔍 比較表示してみよう

明るさやコントラストを調整した画像を並べて表示すると違いがよくわかります。

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 3, figsize=(15, 5))

axs[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axs[0].set_title("元の画像")

axs[1].imshow(cv2.cvtColor(bright, cv2.COLOR_BGR2RGB))
axs[1].set_title("明るさ +50")

axs[2].imshow(cv2.cvtColor(high_contrast, cv2.COLOR_BGR2RGB))
axs[2].set_title("コントラスト 1.5倍")

for ax in axs:
ax.axis("off")

plt.show()

💡 どんなときに使える?

  • 暗く写った写真を明るく補正
  • 文字や物の輪郭をハッキリさせたいとき
  • フィルター風の加工にも応用可能!

ここまでで、画像の見た目を自分好みに調整するテクニックもマスターできましたね!




6. まとめ|OpenCVでできることは無限大!

今回は、Pythonで画像加工をするための強力なツール「OpenCV」の基本を紹介しました。

ここまででできるようになったことをふりかえってみましょう:

✅ 画像の読み込みと表示
✅ BGRからRGB変換で正しい色表示
✅ サイズ変更やトリミング
✅ グレースケールへの変換
✅ 画像の回転・反転
✅ 他の画像との合成(不透明・透過)
✅ 明るさ・コントラストの調整

どうでしょうか?たったこれだけでも、いろんな画像加工ができるようになってきた気がしませんか?

しかもこれらは、OpenCVのほんの入口にすぎません!

OpenCVはこの他にも、

  • 顔検出や物体検出
  • モザイク処理やエッジ検出
  • 動画の加工やリアルタイム処理
  • カメラ画像との連携

などなど、プロっぽい画像処理まで手が届くライブラリです。

「画像加工を自動化してみたい」「AIや機械学習と組み合わせて何かやってみたい」という方にとって、OpenCVは間違いなく強い味方になります。

これをきっかけに、ぜひ自分だけの加工ツールやアプリづくりにも挑戦してみてくださいね!


あわせて読みたい

OpenCVを使った画像加工に興味が出てきたら、こちらの関連記事もぜひチェックしてみてください!


よくある質問(Q&A)

Q
OpenCVで画像を読み込んだら色が変?おかしいのはなぜ?
A

OpenCVは画像をBGR形式で読み込みますが、MatplotlibなどはRGB形式を前提としています。そのまま表示すると色がズレて見えるので、cv2.cvtColor(画像, cv2.COLOR_BGR2RGB)で変換してから表示しましょう。

Q
グレースケール画像って何に使うの?
A

グレースケール(白黒)画像は、顔検出やエッジ検出など画像解析処理に使われることが多いです。処理が軽く、情報の要点を抽出しやすくなります。

Q
サイズ変更(リサイズ)で画像がつぶれてしまうのはなぜ?
A

指定したサイズの縦横比が元画像と違うと、画像が横長・縦長に引き伸ばされてしまいます。縦横比を保ったまま変更したいときは、元のshapeから比率を計算しましょう。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク