PythonとOpenCVを使って画像を漫画風(アニメ風)に変換する方法

スポンサーリンク

この記事では、画像を漫画にする方法を学びます! かなりクールでしょう! では、始めましょう!

スポンサーリンク

1. モジュールのインポート

すべてのプログラムの最初のステップは、必要なモジュール(もしあれば)をすべてファイルにインポートすることです。この問題では、openCV, numpy, matplotlib の3つのモジュールをインポートします。

1
2
3
import cv2
import numpy as np
import matplotlib.pyplot as plt

2. 元画像の読み込みとプロット

次のステップでは,関数 imread を用いて画像を読み込み,関数 cvtColor を用いて RGB フォーマットに変換します.そして, imshow 関数を用いて画像をプロットします.以下に、そのコードを示します。

1
2
3
4
5
6
7
img = cv2.imread("image.jpg")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis("off")
plt.title("Original Image")
plt.show()

3. 画像をグレースケールに変換する

次のステップでは,関数 cvtColor を用いて画像をグレースケールに変換します.この処理を行う理由は,処理を単純化し,後々のプログラムの時間的な複雑さを軽減するためです.

これを実現するためのコードを以下に示します.

1
2
3
4
5
6
7
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)
plt.figure(figsize=(10,10))
plt.imshow(gray,cmap="gray")
plt.axis("off")
plt.title("Grayscale Image")
plt.show()

4. エッジの効いた画像の取得

より簡単にするために、グレースケール画像からエッジの立った画像を取得し、その画像に畳み込みネットワークを適用することにします。

これは、adaptiveThresholdを使用し、必要なパラメータを設定することで、縁取り画像を得ることができます。以下はそのコードです。

1
2
3
4
5
6
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9)
plt.figure(figsize=(10,10))
plt.imshow(edges,cmap="gray")
plt.axis("off")
plt.title("Edged Image")
plt.show()

5. 画像を漫画に変える

最後のステップは、bilateralFilter関数を使って畳み込みフィルタを適用することです。そして、ビット演算を利用して、元の画像と縁取りされた画像を渡すことで、画像を漫画に変換します。

以下はそのコードです。

1
2
3
4
5
6
7
color = cv2.bilateralFilter(img, 9, 250, 250)
cartoon = cv2.bitwise_and(color, color, mask=edges)
plt.figure(figsize=(10,10))
plt.imshow(cartoon,cmap="gray")
plt.axis("off")
plt.title("Cartoon Image")
plt.show()

画像を漫画に変換する最終アウトプット

以下の画像は、オリジナル画像から漫画画像までのすべてのバージョンを表示しています。

Cartoonify Image Output Images into Cartoons
Cartoonify Image Output

このコードを別の画像でテストしてみました。結果は以下の通りです。

Cartoonify Image Output 2 Images into Cartoons
Cartoonify Image Output 2

まとめ

今日、あなたはたった数行のコードで写真を漫画にする方法を学びました。

何かを学んでいただけたでしょうか?読んでくれてありがとうございました!

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