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

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

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

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

Python 3.x

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

フィルタ

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

Python

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

Q&A

解決済

2回答

3769閲覧

OpenCV、cv2.imshowとcv2.imwriteでの出力結果が異なる

potapotapotato

総合スコア13

OpenCV

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

Python 3.x

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

フィルタ

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

Python

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

0グッド

0クリップ

投稿2021/05/13 05:35

編集2021/05/13 05:57

OpenCV、cv2.imshowとcv2.imwriteでの出力結果の違い

前提・実現したいこと

OpenCV,Pythonを触り始めたばかりの初心者です。
OpenCV,Pythonを用いてラプラシアンフィルタをしようと思ったのですが、
cv2.imshowとcv2.imwriteで出力結果が異なります。
結果としてはcv2.imwriteのほうがおそらく正しい処理がされていたのですが、cv2.imshowでも正しく表示させたいです。
どうすればよいでしょうか。
環境はpython3.6、Spyderを使用してます。

画像は順に元画像、cv2.imwrite、cv2.imshowで表示した画像です。
元画像cv2.imwritecv2.imshow

発生している問題・エラーメッセージ

上記の通り出力画像が異なります。

該当のソースコード

Python

1#-*- coding:utf-8 -*- 2import cv2 3 4# 入力画像を読み込み 5img = cv2.imread('sushi.jpg') 6 7# グレースケール変換 8gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) 9 10#8近傍ラプラシアン 11dst = cv2.Laplacian(gray, cv2.CV_32F, ksize=3) 12 13# 結果を出力 14cv2.imwrite('lap8sushi.jpg', dst) 15 16cv2.imshow('lap8sushi.jpg', dst) 17 18cv2.waitKey(0) 19cv2.destroyAllWindows()

試したこと

上記ソースコードではjpg画像を用いてますが、bmp画像でも同じような結果になりました。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

32bit-float な画像を

  • imshow
  • imwrite

に与えた際に,どのように処理されるのか? というのが異なっているというだけの話に思えます.

imshowについてはリファレンスに明記されており,32bit-floatの場合には255が乗じられます.
(つまり,[0.0, 1.0]の範囲を,黒~白 として表示する形)

他方,imwriteで,32bit-floatな画像を jpgやbmpとして保存しようとするとどうなるのか?についての明確な記述は見つかりませんでした.

結果としてはcv2.imwriteのほうがおそらく正しい

と断言できるのかどうかは不明です.

※表示に関しては,そもそもラプラシアンフィルタの結果がとり得る値域を「どのように表示(=可視化)したいのか」にあわせて表示用のデータを適切に用意して表示すべきでしょう.

投稿2021/05/13 09:18

fana

総合スコア11996

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

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

0

結果としてはcv2.imwriteのほうがおそらく正しい処理がされていた

質問のコードの後に下記を追加して、その結果を見てください

python

1import numpy as np 2dst2 = cv2.imread("lap8sushi.jpg", cv2.IMREAD_GRAYSCALE) 3print(np.min(dst)) 4print(np.min(dst2)) 5print(np.max(dst)) 6print(np.max(dst2))

cv2.imwrite()で保存した「lap8sushi.jpg」が正しいのなら、それを読み込んだ「dst2」は、保存前の 「dst」と(ほぼ)一致するはずですが、そうなってますでしょうか?

投稿2021/05/13 06:52

jbpb0

総合スコア7653

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

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

potapotapotato

2021/05/13 07:33

コードを加えて実行してみたところ、 -1254.0 0 996.0 255 との数値が表示されました。 一致してないですね...
jbpb0

2021/05/14 10:31

上記の後にさらに下記を追加して、表示されるデータを比べてみてください print(dst[:10, :10]) print(dst2[:10, :10]) print(dst[-10:, -10:]) print(dst2[-10:, -10:]) そうすると、下記のようになっていると思います ・dstの値で0〜255の範囲だったものは、dst2でも大体同じ値になっているので、「lap8sushi.jpg」に(ほぼ)正しく保存されている ・dstの値で負(マイナス)だったものは、dst2では0か0に近い正(プラス)の値に変わっているので、「lap8sushi.jpg」に正しく保存されてない ・dstの値で255よりも大きなものは、dst2では255か255に近い(255を超えない)値に変わっているので、「lap8sushi.jpg」に正しく保存されてない 普通のJPEGファイルには0〜255の範囲の値しか格納できないので、その範囲から外れるものは正しく保存されないのです (0〜255の範囲の値も、全く同じではなく微妙に変わっているのは、おそらくJPEGの圧縮によるものなので、cv2.imwrite()で品質を上げるように指定したら、もっと変化が減るかもしれません)
jbpb0

2021/05/14 10:38

上記を質問者さん自身で確認した上で、どのように対処すべきか考えてみてください どのように対処すべきかは、フィルタ結果をどのように使いたいかによって変わりますので、質問者さんにしか分かりませんから
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問