🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

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

Python

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

Q&A

解決済

1回答

2129閲覧

cv2.imwrite処理を行うと、画素情報の変化が起きるのか

Minarai_stu

総合スコア4

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/11/22 05:42

編集2020/11/22 05:43

前提・実現したいこと

BGR画像を分割したグレースケールの配列(※1補足情報に導出コード)と、その画像(※2補足情報参照)を保存し再度読み込ませた画像の最頻値などが異なります。
原因と解決策を知りたいです。

発生している問題

BGR画像を分割したグレースケールの配列(※1)と、その画像(※2)を保存し再度読み込ませた画像の最頻値などが異なります。

該当のソースコード

python

1import cv2 2import numpy as np 3from scipy import stats 4 5#輝度1以上の最頻値(配列から求める) 6RGB =cv2.split(img_green_masked) 7Blue = RGB[0] 8Brow = np.array(Blue).flatten() 9Bmode = stats.mode(Brow[Brow>0])[0][0] 10#-----------BmodeのBrowはBlueでも変化がありません。 11#-----------img_green_maskedは補足情報参照 12 13#輝度1以上の最頻値(Blueのimwite画像から求める) 14Brow_im = np.array(Brow_imwrite_picture).flatten() 15Bmode = stats.mode(Brow_im[Brow_im>0])[0][0]

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

(※1 グレースケールの配列のコード)
RGB =cv2.split(img_green_masked)
Blue = RGB[0]
Brow = np.array(Blue).flatten()

(※2 Blueを保存した画像)
イメージ説明

(※3 img_green_masked)
イメージ説明

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

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

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

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

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

toast-uz

2020/11/22 07:43

保存して再度読み出したところまで含めてコードを記載ください
Minarai_stu

2020/11/22 10:02 編集

承知しました。 申し訳ありませんが、コードを消してしまったため、質問のソースコードと画像ファイル名が異なっています。 最頻値の出力値は変わらないのですが、問題ないでしょうか? #配列による最頻値計算と画像の保存 RGB =cv2.split(img_green_masked) Blue = RGB[0] cv2.imwrite("Blue.jpg",Blue) Bmode = stats.mode(Blue[0<Blue]) [0][0] print(Bmode) #保存した画像の読み込みと最頻値計算 import cv2 import numpy as np from scipy import stats img=cv2.imread('/content/Blue.jpg') B_mode = stats.mode(img[0<img]) [0][0] print(B_mode)
toast-uz

2020/11/22 10:11

ありがとうございます。jpegで保存して再度読み出していると確認できましたので、私の回答と整合取れていることを確認できました。
guest

回答1

0

ベストアンサー

jpegフォーマットは非可逆ですので、保存して読み出すと元とは異なる可能性があります。そのため、特に、最頻値といったナイーブな(画像の少しの変化に影響されやすい)数値統計結果は、元とは異なる可能性が高いです。

一方、pngやtiffフォーマットは可逆ですので、このようなことは発生しません。

以下のコードで試していますので、ご確認下さい。

Python

1import cv2 2import numpy as np 3from scipy import stats 4 5img_green_masked = cv2.imread('img_green_masked.jpeg') 6 7RGB =cv2.split(img_green_masked) 8Blue = RGB[0] 9cv2.imwrite('sample.jpeg', Blue) 10cv2.imwrite('sample.png', Blue) 11cv2.imwrite('sample.tiff', Blue) 12 13Brow = np.array(Blue).flatten() 14Bmode = stats.mode(Brow[Brow>0])[0][0] 15print("origin's bmode =", Bmode) 16 17Brow_imwrite_picture = cv2.imread('sample.jpeg') 18Brow_im = np.array(Brow_imwrite_picture).flatten() 19Bmode = stats.mode(Brow_im[Brow_im>0])[0][0] 20print("jpeg's bmode =", Bmode) 21 22Brow_imwrite_picture = cv2.imread('sample.png') 23Brow_im = np.array(Brow_imwrite_picture).flatten() 24Bmode = stats.mode(Brow_im[Brow_im>0])[0][0] 25print("png's bmode =", Bmode) 26 27Brow_imwrite_picture = cv2.imread('sample.tiff') 28Brow_im = np.array(Brow_imwrite_picture).flatten() 29Bmode = stats.mode(Brow_im[Brow_im>0])[0][0] 30print("tiff's bmode =", Bmode)

実行結果

origin's bmode = 2 jpeg's bmode = 1 png's bmode = 2 tiff's bmode = 2

投稿2020/11/22 08:31

編集2020/11/22 10:12
toast-uz

総合スコア3266

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

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

Minarai_stu

2020/11/22 10:18

ご回答ありがとうございます。 jpegでは画素情報の変化が起きてしまうことがわかり、非常に勉強になりました。 またtoast-uz様のご回答のコードについて理解を深めていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問