pythonの画像処理libのopencvとPILを試しに使っています。
しかし、表示される画像は同じなのに、
2つのデータが違う値で出てくるのです。
データを見るにPILの方が正しい。
上がopencvを、下がPILを使ったコードになります。
お詳しい方いらっしゃいましたら、ご教授頂ければと思います。
Python3
1import cv2 2import numpy as np 3from matplotlib import pyplot as plt 4 5img = cv2.imread('data.tif',-1) 6 7plt.imshow(img) 8 9#######データを確認############## 10img[0][0] 11#9.25e-43
python3
1import matplotlib.pyplot as plt 2import numpy as np 3from PIL import Image 4%matplotlib inline 5 6im = Image.open('data.tif') 7#im.show() 8imarr = np.array(im) 9 10plt.imshow(imarr) 11 12#######データを確認############## 13imarr[0][0] 14#660
###追記(1),(2),(3),(3.1),(4)あります
###追記(1)
Yhaya様のアドバイスを受けてopencvで読み込んでRGBに変換した後、描写することを試みました。
調べて見ると
CV_img_RGB = CV_im[:, :, ::-1].copy()
を挿入し、RGBにするとのことでしたが、エラーが出てしましました。
どこかおかしなところがありますでしょうか。(追記(2)で一応対処済み)
python3
1%matplotlib inline 2import cv2 3from PIL import Image 4import numpy as np 5from matplotlib import pyplot as plt 6 7CV_im =cv2.imread('data.tiff',-1) 8 9#BGRからRGBへ変換 10CV_img_RGB = CV_im[:, :, ::-1].copy() 11 12#変換 13CV2PIL_normalize=Image.fromarray(CV_im_RGB) 14 15#描画 16plt.imshow(CV2PIL_normalize)
error
1IndexError Traceback (most recent call last) 2<ipython-input-108-5afa93a697bc> in <module>() 3 8 4 9 #BGRからRGBへ変換 5---> 10 CV_img_RGB = CV_im[:, :, ::-1].copy() 6 11 7 12 #変換 8 9IndexError: too many indices for array
###追記(2)2018/10/26
------追記(1)より
CV_img_RGB = CV_im[:, :, ::-1].copy()
を挿入し、RGBにするとのことでしたが、エラーが出てしましました。
これは
CV_img_RGB = CV_im[:, ::-1].copy()
に変えることで、正常に動くようになりました。
[:, :, ::-1]
この中の次元をCV_imと合わせる必要があったようです。
これによって表示された画像は、変換前から変化がありました。
ただ、imarrの(PILで読み込んだ正しい)データと比べると
CV_img_RGBの(openCVで読み込んでRGB変換した)データは違う。
(しかも見当違いに違う、e-43も違うとは...)
Python3
1print(imarr[0][0]) 2#660 3 4print(CV_im_RGB[0][0]) 5#6.32e-43
###追記(3)2018/10/26
取り扱うtifデータは1ピクセルにカウント数の入ったデータなのでグレースケール相当のものです。カウント数の範囲は、-2から177880です。
ですので、opencvもPILも配列に変換した後は高さ×幅の2次元になります。
RGBのように3つあるわけではないので、opencvやPILを使うべきデータではないということなのでしょうか。そもそも一般的なtifファイルではない(グレースケールの場合0~255)ので取扱いも違うのでしょうか。
最終的に作りたいプログラムは、カウント数の範囲(-2から177880)のデータを画像として表示させる為に(グレースケールの場合)256に分割して表示したいということです。
その為、minmumとmaximumを調整するプログラムを作りたいと思いました。
minmumは最小値で固定して、maximumを200000にしたり100000にしたりと変更させ、それを256で区別して、表示させる。という感じです。
###追記(3.1)2018/10/26
上の追記(3)でも書いたように元データのtifが1色(カウント数)相当だったため、
質問当初に書いたように読み込みを行った場合を考えた。
・PILの場合
imarr[0][0]
= 660 あってる
・opencvの場合
img[0][0]
= 9.25e-43 良くわからない
そこでopencvのデータに(img[0][0]のデータが660になる)
660(imarr[0][0]
)/9.25e-43(img[0][0]
)
を全配列に掛けてみた。
img * 660/9.25e-43
すると、PILのと同じ値に変換できた。
どうやら定数が掛けているよう。
###追記(4)2018/10/19
そもそもtifファイルがtifに準拠したフォーマットになっているか確認する。
tifをバイナリエディタで開き中にあるタグの情報を確認する。
その後フリーのtif解析ソフトを使って確認してみる。(自信なかったので...)
回答2件
あなたの回答
tips
プレビュー