opencvのsobelフィルタについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: opencvのsobelフィルタについて

Re: opencvのsobelフィルタについて

#14

by usao » 5年前

オフトピック
その昔,連続関数に関して導出された処理アルゴリズムを離散データに転用しようとした際に
「微分値」の解決にSobelフィルタを脳死的に用いちゃった奴がいたんですよ……
(わたしです^^)

Re: opencvのsobelフィルタについて

#13

by へにっくす » 5年前

> usaoさん
| ・そもそも,画像データの「微分」って何ですか?
ってあったので、リンク先を示したまで
質問者も同じ認識だったと思われる。
深く穿ち過ぎだと思ったのは私だけかしらん。

まあいいけどね。解決したらしいから。

Re: opencvのsobelフィルタについて

#12

by ttb » 5年前

>例えば#10のコードではat<unsigned char>ではなくat<float>を用いても問題が起きますか?
floatに変更したらエラーが出ずに,動きました.
有難うございました.
型についてなどもっと勉強したいと思います.

Re: opencvのsobelフィルタについて

#11

by usao » 5年前

>以下のページで「微分画像」があります。

微分画像という単語は一般的ですが,今回,「微分値」を求むことが目的とのことであるため,
Sobelフィルタで得られた(絶対値が不明瞭な)値が,欲しい「微分値」とイコールなのか否か,という点を微妙に危惧しただけです.
(Sobelフィルタカーネルを畳み込んだ結果の値が,数学で言うところの ∂f(x,y)/∂x とイコールではないですよね.
細かいことを言えば「原画をガウシアンでぼかしたデータに対する,幅を持った中央差分」的な演算が,目的に見合うのか否か,という話も?)


>例外,エラー
atのテンプレート型引数が間違っているように見えます.
その書き方だと,Sobel()にCV_32Fを指定して出力バッファを生成させているのでしょうから,
生成される結果バッファの型は 32bit1ch です.
例えば#10のコードではat<unsigned char>ではなくat<float>を用いても問題が起きますか?

Re: opencvのsobelフィルタについて

#10

by ttb » 5年前

先ほどのコードはRGB画像そのものを渡していました.
しかし,以下のようにチャンネルごとに分けても同じようエラーが出てしまいました.

コード:

		Mat img_channels[3];
		split(img,img_channels);
		
		Mat sobel_xB, sobel_xG, sobel_xR;

		Sobel(img_channels[0], sobel_xB, CV_32F, 1, 0);
		Sobel(img_channels[1], sobel_xG, CV_32F, 1, 0);
		Sobel(img_channels[2], sobel_xR, CV_32F, 1, 0);

		printf("%f", sobel_xB.at<unsigned char>(200, 200));

Re: opencvのsobelフィルタについて

#9

by へにっくす » 5年前

> usaoさん
以下のページで「微分画像」があります。
http://opencv.jp/cookbook/opencv_img.html

> ttbさん
上記のサンプルにもあるように
Sobel関数に渡す前にグレースケールにしたりRGBのチャネルに分けてたりするサンプルが多いのですが、RGB画像そのものを渡したりしてませんか。
掲示されたソースからはそういうコメントやコードが見受けられません。
(そうしているなら失礼しました)

Re: opencvのsobelフィルタについて

#8

by ttb » 5年前

usaoさんへ
 sobel計算結果の受け取りにはMat型の変数を指定しています.
Mat型の変数の値の取得なので.atメソッドで値を取得できると思っていたのですが「例外はハンドルされていません」というエラーが出てしまい取得できませんでした.コードは以下のように書きました.
printf以外の個所は問題有りませんでした.

コード:

Mat img;//入力画像rgb画像
Mat img_sobel;//出力画像
Sobel(img, sobel_img, CV_32F, 1, 0);//x方向微分
printf("%d", img_sobel.at<Vec3b>(200,200)[0]);//確認用にある画素値を出力

Re: opencvのsobelフィルタについて

#7

by usao » 5年前

>RGB別のレイヤーで見るとBが一番目立たなくて、RかGが多い場合が多いです。

えっと……だから何?

画像データ中のどの信号がどれだけ重要なのかは
{入力画像次第,質問者の用途次第}ではないのでしょうか.

(というか,そもそも【OpenCVのsobelフィルタについて】の質問なんだけど)

Re: opencvのsobelフィルタについて

#6

by littlestream » 5年前

usaoさんへ
 フルカラーの画像をGIMPなどで見てください。
 RGB別のレイヤーで見るとBが一番目立たなくて、RかGが多い場合が多いです。
 何かのネットの記事で見かけたので実装したのですが……どのURLか
 分からなくなってしまいました。
 しかし、多いからといって全ての画像に当てはまる訳ではない事は分かりました。

Re: opencvのsobelフィルタについて

#5

by usao » 5年前

オフトピック
余計な心配かもしれませんけど…

> 各画素での一次微分値をsobelで求めるのが目的

欲しい「微分値」って何ですか? というのを
しっかり考えて(=定義して)おかないと意味不明なことになりそうな気もしますが……

・そもそも,画像データの「微分」って何ですか?
・Sobel()を使うとして,カーネルサイズ引数とかを変えれば当然出力値も変わるけど?

とか,そういうあたりの話は用途上大丈夫なのだろうか?

Re: opencvのsobelフィルタについて

#4

by usao » 5年前

(Sobelフィルタって何ですか? 的な意味くらいはググって下さい)

> 微分画像の各画素値の取得などは出来るのでしょうか?

OpenCVを使っているなら,そもそもSobel()には計算結果受取用のバッファを渡すハズです.
そのバッファの型から,アクセス手段は自明ではないでしょうか.


> 何の微分値が出るのでしょうか?RGBでしょうか?

それは,入力する画像次第でしょう.
(そもそも計算を行っている箇所(Sobel()の内部)では,入力されたデータがRGBなのか何なのかはわからないですよね.単なる値の塊ですから.)
例えば,グレースケール画像を入力したなら,出力はそのグレー値に関する微分値です.


> Rだけを取り出しRRR画像とします。

それだとRだけしか見ないという話になっていませんか?
(GやBだけに画素値の差が存在する場合は無視??)
本当にそういう話だとしたら,いくらなんでも雑すぎる話に思えますが.

Re: opencvのsobelフィルタについて

#3

by ttb » 5年前

エッジ検出がメインで画素値を求めるというよりも,各画素での一次微分値をsobelで求めるのが目的となっています.
また,sobelパラメータでは何の微分値が出るのでしょうか?RGBでしょうか?
勉強不足で申し訳ありません.
以上の疑問点がもし分かりましたらご教授願います.

Re: opencvのsobelフィルタについて

#2

by littlestream » 5年前

画素値というのは具体的にはRGB値でしょうか?
あと、エッジ検出だけだったら、自分ならこれを使うとっておきの技があるのですが、
あまり知られていないと思います。
まず、フルカラーからRGBのうち、Rだけを取り出しRRR画像とします。
この時点で全ての1つの画素辺りのRとGとB値は同じです。ならば、1つ左のRの画素値と比較して、
しきい値を決め、かなり違うようなら白い点をその座標に打ちます。(この場合、紫ですが)
線画抽出.png
線画抽出.png (58.8 KiB) 閲覧数: 7177 回
Image.png
上は元絵とエッジ検出した画像です。

opencvのsobelフィルタについて

#1

by ttb » 5年前

開発環境
OS windows10
visual studio 2017 c++
opencv3.4.1

現在opencvで画像処理の勉強を行っているのですが調べてもわからないことが有り質問しました.
opencvの中のsobelフィルタを用いると画像の微分画像を作成して,エッジ検出などが出来るかと思いますが(この時点で間違っていたらすみません)sobelフィルタを用いて作成した微分画像の各画素値の取得などは出来るのでしょうか?
例えば640×480の入力画像に対してsobelフィルタを用いて微分画像を作成します.作成した微分画像の(200,200)の位置の微分値の取得をするという感じです.

分かる方いらっしゃいましたらご教授お願いします.

ページトップ