この記事では、画像を漫画にする方法を学びます! かなりクールでしょう! では、始めましょう!
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() |
この記事もチェック:PythonとOpenCVを使って画像分割|二値化やグレースケールの変換等を解説
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() |
画像を漫画に変換する最終アウトプット
以下の画像は、オリジナル画像から漫画画像までのすべてのバージョンを表示しています。
このコードを別の画像でテストしてみました。結果は以下の通りです。
まとめ
今日、あなたはたった数行のコードで写真を漫画にする方法を学びました。
何かを学んでいただけたでしょうか?読んでくれてありがとうございました!