opencvのsobelフィルタについて
opencvのsobelフィルタについて
開発環境
OS windows10
visual studio 2017 c++
opencv3.4.1
現在opencvで画像処理の勉強を行っているのですが調べてもわからないことが有り質問しました.
opencvの中のsobelフィルタを用いると画像の微分画像を作成して,エッジ検出などが出来るかと思いますが(この時点で間違っていたらすみません)sobelフィルタを用いて作成した微分画像の各画素値の取得などは出来るのでしょうか?
例えば640×480の入力画像に対してsobelフィルタを用いて微分画像を作成します.作成した微分画像の(200,200)の位置の微分値の取得をするという感じです.
分かる方いらっしゃいましたらご教授お願いします.
OS windows10
visual studio 2017 c++
opencv3.4.1
現在opencvで画像処理の勉強を行っているのですが調べてもわからないことが有り質問しました.
opencvの中のsobelフィルタを用いると画像の微分画像を作成して,エッジ検出などが出来るかと思いますが(この時点で間違っていたらすみません)sobelフィルタを用いて作成した微分画像の各画素値の取得などは出来るのでしょうか?
例えば640×480の入力画像に対してsobelフィルタを用いて微分画像を作成します.作成した微分画像の(200,200)の位置の微分値の取得をするという感じです.
分かる方いらっしゃいましたらご教授お願いします.
-
- 記事: 48
- 登録日時: 7年前
Re: opencvのsobelフィルタについて
画素値というのは具体的にはRGB値でしょうか?
あと、エッジ検出だけだったら、自分ならこれを使うとっておきの技があるのですが、
あまり知られていないと思います。
まず、フルカラーからRGBのうち、Rだけを取り出しRRR画像とします。
この時点で全ての1つの画素辺りのRとGとB値は同じです。ならば、1つ左のRの画素値と比較して、
しきい値を決め、かなり違うようなら白い点をその座標に打ちます。(この場合、紫ですが) 上は元絵とエッジ検出した画像です。
あと、エッジ検出だけだったら、自分ならこれを使うとっておきの技があるのですが、
あまり知られていないと思います。
まず、フルカラーからRGBのうち、Rだけを取り出しRRR画像とします。
この時点で全ての1つの画素辺りのRとGとB値は同じです。ならば、1つ左のRの画素値と比較して、
しきい値を決め、かなり違うようなら白い点をその座標に打ちます。(この場合、紫ですが) 上は元絵とエッジ検出した画像です。
Re: opencvのsobelフィルタについて
エッジ検出がメインで画素値を求めるというよりも,各画素での一次微分値をsobelで求めるのが目的となっています.
また,sobelパラメータでは何の微分値が出るのでしょうか?RGBでしょうか?
勉強不足で申し訳ありません.
以上の疑問点がもし分かりましたらご教授願います.
また,sobelパラメータでは何の微分値が出るのでしょうか?RGBでしょうか?
勉強不足で申し訳ありません.
以上の疑問点がもし分かりましたらご教授願います.
Re: opencvのsobelフィルタについて
(Sobelフィルタって何ですか? 的な意味くらいはググって下さい)
> 微分画像の各画素値の取得などは出来るのでしょうか?
OpenCVを使っているなら,そもそもSobel()には計算結果受取用のバッファを渡すハズです.
そのバッファの型から,アクセス手段は自明ではないでしょうか.
> 何の微分値が出るのでしょうか?RGBでしょうか?
それは,入力する画像次第でしょう.
(そもそも計算を行っている箇所(Sobel()の内部)では,入力されたデータがRGBなのか何なのかはわからないですよね.単なる値の塊ですから.)
例えば,グレースケール画像を入力したなら,出力はそのグレー値に関する微分値です.
> Rだけを取り出しRRR画像とします。
それだとRだけしか見ないという話になっていませんか?
(GやBだけに画素値の差が存在する場合は無視??)
本当にそういう話だとしたら,いくらなんでも雑すぎる話に思えますが.
> 微分画像の各画素値の取得などは出来るのでしょうか?
OpenCVを使っているなら,そもそもSobel()には計算結果受取用のバッファを渡すハズです.
そのバッファの型から,アクセス手段は自明ではないでしょうか.
> 何の微分値が出るのでしょうか?RGBでしょうか?
それは,入力する画像次第でしょう.
(そもそも計算を行っている箇所(Sobel()の内部)では,入力されたデータがRGBなのか何なのかはわからないですよね.単なる値の塊ですから.)
例えば,グレースケール画像を入力したなら,出力はそのグレー値に関する微分値です.
> Rだけを取り出しRRR画像とします。
それだとRだけしか見ないという話になっていませんか?
(GやBだけに画素値の差が存在する場合は無視??)
本当にそういう話だとしたら,いくらなんでも雑すぎる話に思えますが.
Re: opencvのsobelフィルタについて
オフトピック
余計な心配かもしれませんけど…
> 各画素での一次微分値をsobelで求めるのが目的
欲しい「微分値」って何ですか? というのを
しっかり考えて(=定義して)おかないと意味不明なことになりそうな気もしますが……
・そもそも,画像データの「微分」って何ですか?
・Sobel()を使うとして,カーネルサイズ引数とかを変えれば当然出力値も変わるけど?
とか,そういうあたりの話は用途上大丈夫なのだろうか?
> 各画素での一次微分値をsobelで求めるのが目的
欲しい「微分値」って何ですか? というのを
しっかり考えて(=定義して)おかないと意味不明なことになりそうな気もしますが……
・そもそも,画像データの「微分」って何ですか?
・Sobel()を使うとして,カーネルサイズ引数とかを変えれば当然出力値も変わるけど?
とか,そういうあたりの話は用途上大丈夫なのだろうか?
-
- 記事: 48
- 登録日時: 7年前
Re: opencvのsobelフィルタについて
usaoさんへ
フルカラーの画像をGIMPなどで見てください。
RGB別のレイヤーで見るとBが一番目立たなくて、RかGが多い場合が多いです。
何かのネットの記事で見かけたので実装したのですが……どのURLか
分からなくなってしまいました。
しかし、多いからといって全ての画像に当てはまる訳ではない事は分かりました。
フルカラーの画像をGIMPなどで見てください。
RGB別のレイヤーで見るとBが一番目立たなくて、RかGが多い場合が多いです。
何かのネットの記事で見かけたので実装したのですが……どのURLか
分からなくなってしまいました。
しかし、多いからといって全ての画像に当てはまる訳ではない事は分かりました。
Re: opencvのsobelフィルタについて
>RGB別のレイヤーで見るとBが一番目立たなくて、RかGが多い場合が多いです。
えっと……だから何?
画像データ中のどの信号がどれだけ重要なのかは
{入力画像次第,質問者の用途次第}ではないのでしょうか.
(というか,そもそも【OpenCVのsobelフィルタについて】の質問なんだけど)
えっと……だから何?
画像データ中のどの信号がどれだけ重要なのかは
{入力画像次第,質問者の用途次第}ではないのでしょうか.
(というか,そもそも【OpenCVのsobelフィルタについて】の質問なんだけど)
Re: opencvのsobelフィルタについて
usaoさんへ
sobel計算結果の受け取りにはMat型の変数を指定しています.
Mat型の変数の値の取得なので.atメソッドで値を取得できると思っていたのですが「例外はハンドルされていません」というエラーが出てしまい取得できませんでした.コードは以下のように書きました.
printf以外の個所は問題有りませんでした.
sobel計算結果の受け取りにはMat型の変数を指定しています.
Mat型の変数の値の取得なので.atメソッドで値を取得できると思っていたのですが「例外はハンドルされていません」というエラーが出てしまい取得できませんでした.コードは以下のように書きました.
printf以外の個所は問題有りませんでした.
Re: opencvのsobelフィルタについて
> usaoさん
以下のページで「微分画像」があります。
http://opencv.jp/cookbook/opencv_img.html
> ttbさん
上記のサンプルにもあるように
Sobel関数に渡す前にグレースケールにしたりRGBのチャネルに分けてたりするサンプルが多いのですが、RGB画像そのものを渡したりしてませんか。
掲示されたソースからはそういうコメントやコードが見受けられません。
(そうしているなら失礼しました)
以下のページで「微分画像」があります。
http://opencv.jp/cookbook/opencv_img.html
> ttbさん
上記のサンプルにもあるように
Sobel関数に渡す前にグレースケールにしたりRGBのチャネルに分けてたりするサンプルが多いのですが、RGB画像そのものを渡したりしてませんか。
掲示されたソースからはそういうコメントやコードが見受けられません。
(そうしているなら失礼しました)
written by へにっくす
Re: opencvのsobelフィルタについて
先ほどのコードはRGB画像そのものを渡していました.
しかし,以下のようにチャンネルごとに分けても同じようエラーが出てしまいました.
しかし,以下のようにチャンネルごとに分けても同じようエラーが出てしまいました.
Re: opencvのsobelフィルタについて
>以下のページで「微分画像」があります。
微分画像という単語は一般的ですが,今回,「微分値」を求むことが目的とのことであるため,
Sobelフィルタで得られた(絶対値が不明瞭な)値が,欲しい「微分値」とイコールなのか否か,という点を微妙に危惧しただけです.
(Sobelフィルタカーネルを畳み込んだ結果の値が,数学で言うところの ∂f(x,y)/∂x とイコールではないですよね.
細かいことを言えば「原画をガウシアンでぼかしたデータに対する,幅を持った中央差分」的な演算が,目的に見合うのか否か,という話も?)
>例外,エラー
atのテンプレート型引数が間違っているように見えます.
その書き方だと,Sobel()にCV_32Fを指定して出力バッファを生成させているのでしょうから,
生成される結果バッファの型は 32bit1ch です.
例えば#10のコードではat<unsigned char>ではなくat<float>を用いても問題が起きますか?
微分画像という単語は一般的ですが,今回,「微分値」を求むことが目的とのことであるため,
Sobelフィルタで得られた(絶対値が不明瞭な)値が,欲しい「微分値」とイコールなのか否か,という点を微妙に危惧しただけです.
(Sobelフィルタカーネルを畳み込んだ結果の値が,数学で言うところの ∂f(x,y)/∂x とイコールではないですよね.
細かいことを言えば「原画をガウシアンでぼかしたデータに対する,幅を持った中央差分」的な演算が,目的に見合うのか否か,という話も?)
>例外,エラー
atのテンプレート型引数が間違っているように見えます.
その書き方だと,Sobel()にCV_32Fを指定して出力バッファを生成させているのでしょうから,
生成される結果バッファの型は 32bit1ch です.
例えば#10のコードではat<unsigned char>ではなくat<float>を用いても問題が起きますか?
Re: opencvのsobelフィルタについて
>例えば#10のコードではat<unsigned char>ではなくat<float>を用いても問題が起きますか?
floatに変更したらエラーが出ずに,動きました.
有難うございました.
型についてなどもっと勉強したいと思います.
floatに変更したらエラーが出ずに,動きました.
有難うございました.
型についてなどもっと勉強したいと思います.
Re: opencvのsobelフィルタについて
> usaoさん
| ・そもそも,画像データの「微分」って何ですか?
ってあったので、リンク先を示したまで
質問者も同じ認識だったと思われる。
深く穿ち過ぎだと思ったのは私だけかしらん。
まあいいけどね。解決したらしいから。
| ・そもそも,画像データの「微分」って何ですか?
ってあったので、リンク先を示したまで
質問者も同じ認識だったと思われる。
深く穿ち過ぎだと思ったのは私だけかしらん。
まあいいけどね。解決したらしいから。
written by へにっくす
Re: opencvのsobelフィルタについて
オフトピック
その昔,連続関数に関して導出された処理アルゴリズムを離散データに転用しようとした際に
「微分値」の解決にSobelフィルタを脳死的に用いちゃった奴がいたんですよ……
(わたしです^^)
「微分値」の解決にSobelフィルタを脳死的に用いちゃった奴がいたんですよ……
(わたしです^^)