こんばんは。 週1投稿を目指しているのですが、別の事に集中しないといけない事がありまして、色々な事にいつも思いますが習慣化させるのは本当に難しいですね。今回はOpenCVで写真から漫画風にする、という事をしてみたいと思います。してみてわかった事ですが、なかなか実用レベルでは使えないですね。漫画化にはCartoonGANやAnimeGANがメジャーのようです。映画「君の名は」のような綺麗な風景画が作れます。またチャレンジして投稿してみます。
今回はこちらのハイビスカスの写真を漫画風に加工します。 
ぼかしフィルタ
\[colwrap\]\[col3\]
①edgePreservingFilter
\[/col3\]\[col3\]
②bilateralFilter
\[/col3\]\[col3\]
③①+detailEnhance
\[/col3\]\[/colwrap\]①cv2.edgePreservingFilter
edgePreservingFilterはエッジ情報を保持しつつ平滑化を行うフィルタです。
\[colwrap\]\[col2\]
Original
\[/col2\]\[col2\]
①edgePreservingFilter
\[/col2\]\[/colwrap\]
1
2
3
4
5
6
| 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と同じくエッジ情報を保持しつつ平滑化を行うフィルタです。
\[colwrap\]\[col2\]
Original
\[/col2\]\[col2\]
②bilateralFilter
\[/col2\]\[/colwrap\]
1
2
3
4
5
6
| 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はディテールを強調し、画像をよりシャープに見せてくれる効果があります。
\[colwrap\]\[col2\]
Original
\[/col2\]\[col2\]
③①+detailEnhance
\[/col2\]\[/colwrap\]
1
2
3
4
5
6
7
| 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)
|
水彩・油絵・スケッチ用フィルタ
\[colwrap\]\[col3\]
④stylization
\[/col3\]\[col3\]
⑥oilPainting
\[/col3\]\[col3\]
⑤pencilSketch(Color)
\[/col3\]\[colwrap\]④cv2.stylization
stylizationは水彩画のような出力をしてくれます。
\[col2\]
Original
\[/col2\]\[col2\]
④stylization
\[/col2\]\[/colwrap\]
1
2
3
4
| 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はその名の通り油絵のような出力をしてくれます。
\[colwrap\]\[col2\]
Original
\[/col2\]\[col2\]
⑥oilPainting
\[/col2\]\[/colwrap\]
1
2
3
4
| 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つを返します。
\[colwrap\]\[col3\]
Original
\[/col3\]\[col3\]
⑥pencilSketch(Color)
\[/col3\]\[col3\]
⑥pencilSketch(Gray)
\[/col3\]\[/colwrap\]
1
2
3
4
5
6
| 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)
|