画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(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でアンシャープマスキング(Unsharp Masking)

メインページOpenCV

アンシャープマスキング(Unsharp Masking)もOpenCVに無い関数の1つのなのですが、OpenCVの関数を使ってアンシャープマスキングを実現する手法を紹介します。

アンシャープマスキングのアルゴリズムについては以前、アンシャープマスキング(鮮鋭化フィルタ)のページで紹介しているので、そちらを参照願います。

カーネルを直に設定する方法

void cv_UnsharpMasking1(IplImage* src_img, IplImage* dst_img){
    //カーネルの設定
    float KernelData[] = {
        -1/9.0f, -1/9.0f, -1/9.0f,
        -1/9.0f, 17/9.0f, -1/9.0f,
        -1/9.0f, -1/9.0f, -1/9.0f,
        };
    //カーネルの配列をCvMatへ変換
    CvMat kernel = cvMat (3, 3, CV_32F, KernelData);
    //フィルタ処理
    cvFilter2D (src_img, dst_img, &kernel);
}

アルゴリズムを忠実に行う方法

ただ単にアンシャープマスキングを行うのであればカーネルを指定してしまった方が簡単ですが、ここでは負の輝度値が必要となる場合の画像間演算(cvAddやcvSubなど)を使う例として参照して頂ければと思います。

void cv_UnsharpMasking2(IplImage* src_img, IplImage* dst_img){

    // 符号付き画像データの確保
    IplImage* src_imgS = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_16S, src_img->nChannels);
    IplImage* dst_imgS = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_16S, src_img->nChannels);
    IplImage* ave_imgS = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_16S, src_img->nChannels);
    IplImage* sub_imgS = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_16S, src_img->nChannels);

    //平滑化
    cvSmooth(src_img, dst_img, CV_BLUR);

    //符号付き16 ビット整数に変換
    cvConvertScale(src_img, src_imgS, 1, 0);
    cvConvertScale(dst_img, ave_imgS, 1, 0);

    // 元画像から平滑化画像を引く
    // src_imgS - ave_imgS = sub_imgS
    cvSub(src_imgS, ave_imgS, sub_imgS);

    // 元画像に上記差分を足す
    // src_imgS + sub_imgS = dst_imgS

    cvAdd(src_imgS, sub_imgS, dst_imgS);

    // 符号付きデータから符号なしデータへ
    cvConvertScale(dst_imgS, dst_img, 1, 0);

    // 解放
    cvReleaseImage(&src_imgS);
    cvReleaseImage(&dst_imgS);
    cvReleaseImage(&ave_imgS);
    cvReleaseImage(&sub_imgS);
}

ポイントは画像間演算の計算では、計算するデータの全て(関数の引数全て)が同じ型にしないとならない点。
つまり、計算結果に符号付きの値が欲しい場合は、計算する元のデータも符号付きにしないとなりません。

例えば、cvSubの引数に全て符号無しの値を設定してしまうと、当然、符号無し(負の値は0(ゼロ)となる)になるのでご注意下さい。
 
 



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

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

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














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


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

現在の閲覧者数: / 合計