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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

970閲覧

バイラテラルフィルタcv2.bilateralFilterでsizeを0とした時の処理結果について

ysk_snn

総合スコア21

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/06/09 07:47

編集2020/06/09 08:12

前提・実現したいこと

バイラテラルフィルタcv2.bilateralFilterでsizeを0とした時、
処理の前後で画像に変化は起きないと考えていたのですが、実際に処理してみた結果、わずかに変化していました。
なぜ変化してしまうのか教えていただけないでしょうか。

該当のソースコード

python3

1im = np.array(Image.open()) 2ret, im_th = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 3 4bi = cv2.bilateralFilter(im, 0, 0, 0) 5ret_bi, im_th_bi = cv2.threshold(bi, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 6 7print(np.count_nonzero(im_th)) 8print(np.count_nonzero(im_th_bi))

result

146903 244746

補足情報(FW/ツールのバージョンなど)

OpenCVのバージョン '4.1.2'

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

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

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

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

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

guest

回答2

0

適当な画像で試しましたが、「わずかに変化する」という現象が再現しません。

  • 試したバージョン: opencv 4.2.0

python

1import cv2 2import numpy as np 3 4img = np.random.randint(0, 256, (300, 300), dtype=np.uint8) 5th1 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] 6 7dst = cv2.bilateralFilter(img, 0, 0, 0) 8th2 = cv2.threshold(dst, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] 9 10 11print(np.array_equal(th1, th2))

python

1!pip uninstall opencv-contrib-python -y 2!pip install opencv-contrib-python 3import cv2 4print(cv2.__version__) 5print(cv2.__file__) 6# Requirement already satisfied: opencv-contrib-python in /root/.local/share/virtualenvs/notebook-Pv36DT_Y/lib/python3.7/site-packages (4.2.0.34) 7# Requirement already satisfied: numpy>=1.14.5 in /root/.local/share/virtualenvs/notebook-Pv36DT_Y/lib/python3.7/site-packages (from opencv-contrib-python) (1.17.4) 8# 4.2.0

投稿2020/06/09 08:00

編集2020/06/09 08:23
tiitoi

総合スコア21956

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

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

ysk_snn

2020/06/09 08:03

th2を更新されているからではないでしょうか ``` import cv2 import numpy as np img = np.random.randint(0, 256, (300, 300), dtype=np.uint8) th1 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] dst = cv2.bilateralFilter(img, 0, 0, 0) th2 = cv2.threshold(dst, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] print(np.array_equal(th1, th2)) ``` とすると、Falseになります
tiitoi

2020/06/09 08:13 編集

すいません。質問のコードを転記した際に間違ってしまったので、修正しました。 今記載されているコードで opencv 4.1.2.30 では True になります。
ysk_snn

2020/06/09 08:15

いま 'cv2.__version__' で確認したところ、私もopencvのバージョンが '4.1.2' なのですが、 tiitoi様のコードをまるごとコピペしてもFalseが表示されてしまいます...
tiitoi

2020/06/09 08:18 編集

すいません。pip list でバージョン確認してたのですが、cv2.__version__ で確認したら、4.2.0 だったみたいです。 !pip list | grep opencv opencv-contrib-python 4.1.2.30 opencv-python-headless 4.2.0.34 opencv-transforms 0.0.3.post1 print(cv2.__version__) 4.2.0 とりあえず、インストールされている opencv を最新版にアップグレードしてそれでも問題が起こるか確認されてはどうでしょうか
ysk_snn

2020/06/09 09:56

何度も対応してくださってありがとうございました。 ライブラリ同士が競合してしまってうまく入らなかったので、また今度トライします... 他の方の回答で、原因らしきものがあったので、質問を閉じることにします。 丁寧にご対応いただいてありがとうございました。 またよろしくお願いいたします。
guest

0

ベストアンサー

サイズ引数への0の指定は想定されており,フィルタサイズは関数内で決定される.
怪しいのはσに0を与えていること.←これがそもそもやることに対して異常.

「実用上意味が無さそうな引数を与えたら結果がこうなった.何故?」ということを突き詰める意味は無いのではないか?と思います.
(原因を知りたければ実装ソースを見れば良い,という話にしかならないのでは.)

#そもそも,何故そのような引数を与えるのでしょう?


例えば,CV 4.0.0 のソースですが,てきとーに bilaterarlFilter_8u() の実装を覗いてみると,

if( sigma_color <= 0 ) sigma_color = 1; if( sigma_space <= 0 ) sigma_space = 1;

という記述が見つかったりします.
想定外の値に対して,勝手に修正を入れる実装になっているわけです.また,

radius = MAX(radius, 1);

という記述もありますから,もしもこの実装が使われるとしたら,あなたが想定する「どっちのσも0.さぁフィルタサイズはどうなるんでしょうね?」といういじわるな話のまま処理が進むわけではないわけですね.
で,結果として画像に変化が起き得るでしょう.この実装固有の結果として.

投稿2020/06/09 08:43

編集2020/06/09 08:55
fana

総合スコア11996

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

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

fana

2020/06/09 09:00

CV4.0.0のある関数の実装コードを覗いた結果を追記しましたが, たまたまこのようなガード処理を見つけたからといって,その振る舞いがドキュメントとかに明記されていないならば,それに依存した呼び出しコードを書くべきではないと思いますから, 突き詰める意味は無いと思います.
ysk_snn

2020/06/09 10:02

ご回答ありがとうございます。 わかりやすかったです! ガード処理という言葉も覚えておきます! >#そもそも,何故そのような引数を与えるのでしょう? フィルタサイズの検討をするにあたって、"0~20"の様に値を振ってしまい、 結果一覧をみてみて違和感を抱いた、という背景でした
fana

2020/06/09 10:11

> ガード処理 「やばそうな事柄へ対処するための処理」という意味合いでそう書いただけで,一般単語かどうかは不明です.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問