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

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

フィルタ

フィルタとは、特定の条件に合わせてデータへのアクセスをブロックするプログラムやルーチンを指します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2136閲覧

OpenCV_畳み込みによる総和演算結果を正規化(スケーリング)したい

lime00

総合スコア25

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

フィルタ

フィルタとは、特定の条件に合わせてデータへのアクセスをブロックするプログラムやルーチンを指します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/22 07:54

編集2021/10/22 10:43

現在,OpenCVをPythonで動かして,グレースケール画像に対するガボールフィルタを用いたフィルタリングを行なっています.大体の場合は問題なく動作するのですが,フィルタのパラメータによって,ほとんどが白と黒で構成されるような2値化画像に近い結果が出力されます.現在行なっているやり方としては,cv2.getGaborKernelでガボールフィルタのカーネルを用意し,cv2.filter2Dで畳み込みを行うというやり方を取っています.そこでcv2.filter2Dで畳み込みを行う際に,総和演算結果を正規化することで2値化画像が出力されてしまう問題を解決できるのではないかと考えました.ここで言う正規化とは,総和演算結果のうち最も大きい値のピクセルの画素値が255となるようにバイアスを乗じ,それ以外のピクセルの画素値にも同じバイアスを乗じていくことを指します.現在のやり方では,恐らくいくつかの画素における総和演算結果が255以上となっており,頭打ちによって白い部分が発生していると判断し,そのような処理をしたいと考えております.
この場合,畳み込みを行う際にcv2.filter2Dに頼らずに,自力で畳み込みを行う方法を取るしかないのでしょうか.または,現在のやり方にいくつかの工夫を加えることで,総和演算結果を正規化することができるのでしょうか.詳しい方よろしくお願いします.

出力結果の例
出力結果の例

その際のガボールフィルタのカーネル
カーネル

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/10/22 08:10

> 総和演算結果を正規化する とはどのようなことでしょうか? 各画素位置毎に,フィルタ結果値を正規化するのでしょうか? (そしたら,異なる画素位置でのフィルタ結果値との比較ができなくなるのでは?) (全画素位置で同一のスケールを乗じるのであれば,畳み込み結果画像にあとから一発スケールを乗じれば良いでしょうし…?)
lime00

2021/10/22 10:47

質問内容が不足しており,申し訳ありませんでした.ここで言う正規化とは,総和演算結果のうち最も大きい値のピクセルの画素値が255となるようにバイアスを乗じ,それ以外のピクセルの画素値にも同じバイアスを乗じていくことを指します. 演算結果が255以上となり,頭打ち的に画素値が決まってしまっているが故に白い部分が増えているのではないかと考えております.
fana

2021/10/22 14:42

filter2D の結果を 8bit としなければ,問題は回避できるということでしょうか. リファレンスを見る限り,引数で結果のデータ形式を指定できるように見えますので, 16bt整数 とか 32bit不動小数 とか,「頭打ち」にならないような型で結果を受け, 必要であれば「結果の最大値を用いて…」といったような処理を後処理として行えば良さそうに思えます.
jbpb0

2021/10/23 01:19

https://cvtuts.wordpress.com/2014/04/27/gabor-filters-a-practical-overview/ のコードでは、ガボールフィルタのカーネルの総和が1/1.5=2/3になるように正規化してます こうすると、フィルタ処理後画像の明るさの平均が元画像の2/3になるので、飽和しにくくなります あくまでも、正規化しない場合に比べて飽和しにくくなるだけで、飽和しないわけではないですが 一般的には、フィルタ処理後の平均が元画像と変わらないように、カーネルの総和が1.0になるように正規化することが多いと思うのですが、2/3にしてる理由はよく分かりません (できるだけ飽和させたくない、ということかな??) http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_filtering/py_filtering.html
jbpb0

2021/10/23 01:22

異なる画像からのフィルタ処理後画像の数値比較をする必要がないのなら、ガボールフィルタ適用後に「cv2.normalize」で0〜255にしてしまうとか ただし、「cv2.normalize」適用前に既に255で飽和してたら意味無いので、「cv2.filter2D」の結果が8bit整数にならないようにする必要があります たとえば、こんな感じで gabor = cv2.getGaborKernel(... dst = cv2.filter2D(img.astype(np.float32), -1, gabor) dst_image = dst.copy() cv2.normalize(dst, dst_image, 0, 255, cv2.NORM_MINMAX) dst = dst_image.astype(np.uint8)
lime00

2021/10/23 02:45

お二人とも回答ありがとうございます. jbpb0様のcv2.normalize()を活用するやり方で想定通りの結果が実現できました. 回答欄に記入いただければベストアンサーとしますので,記入のほどお願い致します.
fana

2021/10/23 03:26

> 2/3 何らかの理屈があるのではなく,単に結果を示すのに都合のよいスケーリングを施しただけなんじゃないかな,とか思ったり.
jbpb0

2021/10/23 05:19

> 単に結果を示すのに都合のよいスケーリングを施しただけ でしょうね
guest

回答1

0

ベストアンサー

総和演算結果のうち最も大きい値のピクセルの画素値が255となるようにバイアスを乗じ,それ以外のピクセルの画素値にも同じバイアスを乗じていく

異なる画像からのフィルタ処理後画像の数値比較をする必要がないのなら、ガボールフィルタ適用後に「cv2.normalize」で0〜255にすることができます

ただし、「cv2.normalize」適用前に既に255で飽和してたら意味無いので、「cv2.filter2D」の結果が8bit整数にならないようにする必要があります
たとえば、こんな感じで

python

1gabor = cv2.getGaborKernel(... 2dst = cv2.filter2D(img.astype(np.float32), -1, gabor) 3dst_image = dst.copy() 4cv2.normalize(dst, dst_image, 0, 255, cv2.NORM_MINMAX) 5dst = dst_image.astype(np.uint8)

投稿2021/10/23 03:06

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問