OpenCVを使用したCartoon(漫画)フィルタ

こんばんは。
週1投稿を目指しているのですが、別の事に集中しないといけない事がありまして、色々な事にいつも思いますが習慣化させるのは本当に難しいですね。今回はOpenCVで写真から漫画風にする、という事をしてみたいと思います。してみてわかった事ですが、なかなか実用レベルでは使えないですね。漫画化にはCartoonGANやAnimeGANがメジャーのようです。映画「君の名は」のような綺麗な風景画が作れます。またチャレンジして投稿してみます。

今回はこちらのハイビスカスの写真を漫画風に加工します。

ぼかしフィルタ

①edgePreservingFilter
②bilateralFilter
③①+detailEnhance

①cv2.edgePreservingFilter

edgePreservingFilterはエッジ情報を保持しつつ平滑化を行うフィルタです。

Original
①edgePreservingFilter

 

edges = cv2.bitwise_not(cv2.Canny(original_image, 100, 200))
color = cv2.edgePreservingFilter(original_image, flags=2, sigma_s=64, sigma_r=0.25)
cartoon = cv2.bitwise_and(color, color, mask=edges)
cv2.imshow("Cartoon1", cartoon)
cv2.imwrite('cartoon1.jpg', cartoon)
cv2.waitKey(0)

②cv2.bilateralFilter

①と同条件でフィルタのみbilateralFilterに変更します。edgePreservingFilterと同じくエッジ情報を保持しつつ平滑化を行うフィルタです。

Original
②bilateralFilter

 

edges = cv2.bitwise_not(cv2.Canny(original_image, 100, 200))
color = cv2.bilateralFilter(original_image, 9, 300, 300)
cartoon = cv2.bitwise_and(color, color, mask=edges)
cv2.imshow("Cartoon2", cartoon)
cv2.imwrite('cartoon2.jpg', cartoon)
cv2.waitKey(0)

③①+cv2.detailEnhance

①と同条件でdetailEnhanceフィルタを追加します。detailEnhanceはディテールを強調し、画像をよりシャープに見せてくれる効果があります。

Original
③①+detailEnhance

 

edges = cv2.bitwise_not(cv2.Canny(original_image, 100, 200))
color = cv2.edgePreservingFilter(original_image, flags=2, sigma_s=64, sigma_r=0.25) 
color = cv2.detailEnhance(color, sigma_s=10, sigma_r=0.15)
cartoon = cv2.bitwise_and(color, color, mask=edges)
cv2.imshow("Cartoon3", cartoon)
cv2.imwrite('cartoon3.jpg', cartoon)
cv2.waitKey(0)

水彩・油絵・スケッチ用フィルタ

④stylization
⑥oilPainting
⑤pencilSketch(Color)

④cv2.stylization

stylizationは水彩画のような出力をしてくれます。

Original
④stylization

 

cartoon = cv2.stylization(original_image, sigma_s=150, sigma_r=0.4)
cv2.imshow("Cartoon4", cartoon)
cv2.imwrite('cartoon4.jpg', cartoon)
cv2.waitKey(0)

⑤cv2.xphoto.oilPainting

oilPaintingはその名の通り油絵のような出力をしてくれます。

Original
⑥oilPainting

 

cartoon = cv2.xphoto.oilPainting(original_image, size=10, dynRatio=1)
cv2.imshow("Cartoon5", cartoon)
cv2.imwrite('cartoon5.jpg', cartoon)
cv2.waitKey(0)

⑥cv2.pencilSketch

pencilSketchもその名の通り鉛筆画のような出力をしてくれます。グレーとカラーの2つを返します。

Original
⑥pencilSketch(Color)
⑥pencilSketch(Gray)

 

pencil_gray, pencil_color  = cv2.pencilSketch(original_image, sigma_s=60, sigma_r=0.5, shade_factor=0.02) 
cv2.imshow("Cartoon6", pencil_color)
cv2.imwrite('cartoon6.jpg', pencil_color)
cv2.imshow("Cartoon7", pencil_gray)
cv2.imwrite('cartoon7.jpg', pencil_gray)
cv2.waitKey(0)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)