画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

05 | 2017/06 | 07
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV】実写(写真)をアニメ風にするフィルタ処理

メインページOpenCV

Twitterのアイコンを作るのに、顔写真のまんまだと、ちょっと抵抗があったので、cartoon filter などと言われる実写の画像をアニメ風に変換する処理をOpenCVで作成して、こいつをTwitterのアイコンにしてみました。

といっても、かなり参考にしたのはOpenCV.jpにあるcvAdaptiveThreshold関数のサンプル
これだと輪郭は雰囲気は出ていますが、色がグラデーションがかっているので、cvPyrSegmentation関数を使って減色処理を追加しました。

結果、こんな感じまでできました。

OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
処理前 処理後

処理の概要は以下の通り

適応的二値化処理(cvAdaptiveThreshold関数)を使って、指定した範囲内を平均した輝度値よりも指定したしきい値以下となる部分を二値化(今回はその部分を黒にする)して、画像の輪郭を作成します。

【処理前】
OpenCVで実写(写真)をアニメ風に変換

【処理後】
OpenCVで実写(写真)をアニメ風に変換

この部分はOpenCV.jpの処理とほぼ同じ処理を行いましたが、ノイズが多かったので、メディアンフィルタを追加しました。

次に画像ピラミッドを使った画像の分割処理(cvPyrSegmentation関数)を使って、色の減色を行いました。
やっぱりこの部分もOpenCV.jpをかなり参考にしました。

【処理後】
OpenCVで実写(写真)をアニメ風に変換

ただ、この処理に決めるまでに、cvPyrMeanShiftFiltering関数cvSmooth関数のバイラテラルフィルタなども試そうとしたのですが、なぜかエラーが出て、結局、cvPyrSegmentation関数しか使えなかった、という事でこの処理にしました。

あとはcvAndで2つの画像を足し合わせる(ANDをとる)だけ。

【処理後】
OpenCVで実写(写真)をアニメ風に変換

この処理を下記のように関数にまとめてみました。
//---------------------------------------------------------------
//【関数名 】:cv_CartoonFilter
//【処理概要】:アニメフィルタ
//【引数  】:src        = 入力画像(カラー8bit3ch)
//      :dst        = 出力画像(カラー8bit3ch)
//      :  輪郭の設定
//      :BlockSize    = 値を小さくすると輪郭が細かくなる    3, 5, 7・・・
//      :ContThre    = 値が小さいほど輪郭が増える
//      :  減色の設定
//      :PyrLevel = 値が小さいと同じ色の領域が細かくなる
//      :SegmentThre 値が大きいと同じ色の領域が大きくなる
//      :  共通
//      :MedianLevel = ノイズ除去レベル 3, 5, 7・・・
//【戻り値 】:なし
//【備考  】:画像サイズが 幅を(2のPyrLevel乗) もしくは 高さを(2のPyrLevel乗)で
//      :割り切れないない場合、処理できない部分が残ります。
//      :<推奨設定値例>
//      :BlockSize    = 11
//      :ContThre    = 5.0
//      :PyrLevel    = 5
//      :SegmentThre = 30.0
//      :MedianLevel = 5
//---------------------------------------------------------------

void cv_CartoonFilter(IplImage* src, IplImage* dst,
            int BlockSize, double ContThre,
            int    PyrLevel, double SegmentThre, int MedianLevel){

    ////////////////////////////////////////////////////////////////
    //
    // 輪郭画像の作成
    //
    ////////////////////////////////////////////////////////////////


    IplImage* contour_gray  = cvCreateImage (cvGetSize (src), IPL_DEPTH_8U, 1);
    IplImage* contour_color = cvCreateImage (cvGetSize (src), IPL_DEPTH_8U, 3);

    // カラー⇒モノクロ変換
    cvCvtColor (src, contour_gray, CV_BGR2GRAY);
    // 適応的二値化
    cvAdaptiveThreshold (contour_gray, contour_gray, 255,
        CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, BlockSize, ContThre);
    // ノイズ除去
    cvSmooth(contour_gray, contour_gray, CV_MEDIAN, MedianLevel);
    // モノクロ変換⇒カラー
    cvCvtColor (contour_gray, contour_color, CV_GRAY2BGR);
    // 解放
    cvReleaseImage(&contour_gray);

    ////////////////////////////////////////////////////////////////
    //
    // 減色画像の作成
    //
    ////////////////////////////////////////////////////////////////


    CvMemStorage *storage = cvCreateMemStorage (0);
    CvSeq *comp = 0;
    CvRect roi;

    // 領域分割のためにROIをセットする
    roi.x = roi.y = 0;
    roi.width = src->width & -(1 << PyrLevel);
    roi.height = src->height & -(1 << PyrLevel);
    cvSetImageROI (src, roi);
    cvSetImageROI (dst, roi);
    // 画像ピラミッドを使った領域分割
    cvPyrSegmentation (src, dst, storage, &comp, PyrLevel, 255.0, SegmentThre);
    // ノイズ除去
    cvSmooth(dst, dst, CV_MEDIAN, MedianLevel);
    // 解放
    cvReleaseMemStorage (&storage);
    cvResetImageROI(src);
    cvResetImageROI(dst);
   
    ////////////////////////////////////////////////////////////////
    //
    // 輪郭画像 + 減色画像の作成
    //
    ////////////////////////////////////////////////////////////////


    cvAnd(dst, contour_color, dst);


    // 解放

    cvReleaseImage(&contour_color);


}

この関数を使う時は、こんな感じで↓
cv_CartoonFilter(src_img, dst_img, 11, 5.0, 5, 30.0, 5);

3番目以降の値で輪郭の太さや減色の雰囲気などが変わってくるので、上記関数のコメント部分を参考にしながら、いろいろ試してみて下さい。

この処理、思ったより楽しかったので、いろいろ試してみました。

処理前   処理後
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換

楽しい!!!
年賀状にも、この処理を使おうっかな~。

Loading...
スポンサーリンク

この記事に対するコメント

この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/261-0ba89a87
この記事にトラックバックする(FC2ブログユーザー)

現在の閲覧者数: / 合計