質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

OpenCV 明るさの強弱に応じた輪郭検出がしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 125

score 24

現在,OpenCVをPythonで動かして画像処理を行なっています.
Canny法などの手法を利用し,"画像中の輪郭部分を検出して,その部分のみを白,その他の部分は黒となるような輪郭画像を作成する"などの処理はできるようになりました.
ただ,輪郭の明るさの強弱に応じて反応値の大小を変えるといった処理ができず,調べてみてもわからない状態です.
例えば,「輪郭部分のみを白くする輪郭画像を作る場合でも,対象部分の明るさの変化の強弱が大きいほど,より輝度値の高い白になる」などの処理はOpenCVでできるものなのでしょうか.
詳しい方,ご教授のほどよろしくお願いします.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jbpb0

    2021/10/14 11:03

    質問の「色の変化の強弱」を「明るさの変化の強弱」と解釈して、以下書きます
    勘違いしてたら、スルーしてください

    https://pystyle.info/opencv-edge-detection/
    http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_gradients/py_gradients.html
    あたりで紹介されてる微分フィルタの結果は、明るさの変化の強弱に応じた値です
    コード例はPythonですが、C++にも同じものがあります

    ただし、輪郭部分だけの結果ではありません
    輪郭部分だけの結果は、上記のような微分フィルタの結果から、

    > 画像中の輪郭部分を検出して,その部分のみを白

    で検出された輪郭の画素の部分だけ取り出したらいいと思います

    なお、上記参考Webページの二つ目の方にも書いてありますが、微分して負になる数値の結果が消えてしまわないように、ご注意ください

    キャンセル

  • lime00

    2021/10/14 13:55

    ありがとうございます.
    確かに「明るさの変化の強弱」と表現するのが適切でした.
    ご指摘ありがとうございます.

    キャンセル

回答 1

checkベストアンサー

0

元の画像の輝度勾配に応じて,適当に結果画像の輝度を決定すればよいのではないでしょうか.


Sobelフィルタのようなエッジ検出フィルタの結果値から,輝度勾配の強度を見積もることができるでしょう.

例えば,良く見る 3x3 の Sobelフィルタ:

-1 0 1
-2 0 2
-1 0 1

-1 -2 -1
 0  0  0
 1  2  1

から求まる2つの結果値{SX,SY}から,
輝度勾配の強度 = sqrt( SX*SX + SY*SY )
とか何とかして見積ればよいでしょう.

あとはてきとーにその値の大小に応じた結果画像を描画するだけですね.


てきとーな例を追加(コードはC++ですが)

結果画像:上から{入力,Cannyの結果,Sobelから求めた強度に基づくてきとーな明暗描画結果}
イメージ説明

int main()
{
    cv::Mat Src = cv::imread( "Kuro.png", cv::IMREAD_GRAYSCALE );
    if( Src.empty() )return 0;
    //Sobel
    cv::Mat SX( Src.size(), CV_16S );
    cv::Mat SY( Src.size(), CV_16S );
    cv::Sobel( Src, SX, CV_16S, 1, 0 );
    cv::Sobel( Src, SY, CV_16S, 0, 1 );
    //Canny
    cv::Mat Mask;
    cv::Canny( Src, Mask, 100, 50 );
    //ShowImgは単なる表示用
    cv::Mat ShowImg;
    cv::vconcat( Src, Mask, ShowImg );

    //Maskの内容をSobelの結果を用いて明暗がついた感じに更新
    for( int y=0; y<Src.rows; ++y )
    {
        unsigned char *pMask = Mask.ptr<unsigned char>(y);
        const short *pSX = SX.ptr<short>(y);
        const short *pSY = SY.ptr<short>(y);
        for( int x=0; x<Src.cols; ++x, ++pMask, ++pSX, ++pSY )
        {
            if( !*pMask )continue;
            auto Mag = sqrt( (*pSX * *pSX) + (*pSY * *pSY) );
            *pMask = (unsigned char)(   std::min(Mag, 255.0)   );
        }
    }

    //結果表示
    cv::vconcat( ShowImg, Mask, ShowImg );
    cv::imshow( "Result", ShowImg );
    if( cv::waitKey() == 's' ){    cv::imwrite( "Result.png", ShowImg );    }
    return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/10/14 10:43

    …っていう話がよくわからん,という場合,
    「OpenCV Sobel」とかで画像検索とかしてみればよいかもしれません.
    エッジ強度に応じた白黒具合の絵みたいなのを見つけることができるでしょう.

    キャンセル

  • 2021/10/14 13:46

    詳しいご解説ありあがとうございます.
    勉強になりました.

    キャンセル

  • 2021/10/14 13:56

    cartToPolar なんてのがあるので
    これにSobelの結果を与えれば,回答に書いた勾配強度の計算になる.(あと,追加で勾配方向も得られる).

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る