前提
openCV(Python)で、
img=cv2.imread(img,cv.IMREAD_GRAYSCALE)としてグレースケールで読み込むと[0,255]範囲の値を返します。
現在、テンプレートマッチングを試していますが、結果として返ってくる
res=cv2.matchTemplate(img,template,eval(method))は[0,1]範囲に正規化された値です。(※補足:methodにcv.TM_SQDIFF_NORMEDを使用した場合)
これらをmatplotlibのimshowで明示的に値域を指定した上で表示してみると、以下の様になります。
左から順に、
- plt.imshow(res,cmap = 'gray', vmin = 0, vmax = 1)
- plt.imshow(res*255,cmap = 'gray', vmin = 0, vmax = 255)
- plt.imshow(img,cmap = 'gray', vmin = 0, vmax = 255)
そして、cv2.imshow()でも、左右のimg([0,255]グレースケール)とres([0,1]グレースケール)を表示してみると、上の結果と同様、問題無く表示されました。問題は、中央の[0,255]範囲に戻したres*255を表示させようとした時です。
発生している問題
ここで、私はresが正規化された値になっている事はやや混乱を招くと感じたので、imgと統一させる為にres255として[0,255]グレースケールに戻してやりました。
そしてこれをcv2.imshow(winname,**res255**)で試しに表示してみると、以下の様に何も表示されませんでした。
しかし、cv2.imwrite("filename.jpg",res*255)で保存してみると、期待している画像が保存されていました。
- これは一体何が起こっているのでしょうか?
2.また、matplotlibのimshowではvmin,vmaxを明示的に指定できますが、(というか指定しないと意図しない結果になる事がある様です。)
cv2.imshow()の公式ドキュメントを見てもそういうオプションは無いみたいでした。
にも拘わらず、前提の節で、cv2.imshow(0255 img) と cv2.imshow(01 img) が問題無く表示されたのは不思議です。
宜しくお願い致します。
該当のソースコード
plt.imshow()で確認
python
1import cv2 as cv 2import numpy as np 3from matplotlib import pyplot as plt 4 5img = cv.imread('mandrill.png',cv.IMREAD_GRAYSCALE) 6template = cv.imread('mandrill_template.png',cv.IMREAD_GRAYSCALE) 7 8res = cv.matchTemplate(img,template,cv.TM_SQDIFF_NORMED) 9 10print(img)#0~255の値で表されている! 11print(res)#こっちは0~1の値で表されている! 12 13plt.subplot(131,),plt.imshow(res,cmap = 'gray', vmin = 0, vmax = 1) 14plt.title('res[0,1]') 15plt.subplot(132),plt.imshow(res*255,cmap = 'gray', vmin = 0, vmax = 255) 16plt.title('res*255[0,255]') 17plt.subplot(133),plt.imshow(img,cmap = 'gray', vmin = 0, vmax = 255) 18plt.title('img[0,255]') 19plt.show()
cv2.imshow()で確認(問題の部分)
python
1def Img_show(img): 2 cv.imshow("img",img) 3 if not cv.waitKey(0)==None: 4 cv.destroyAllWindows() 5 6Img_show(img) 7Img_show(res) 8Img_show(res*255)#これがおかしい! 9cv.imwrite("aaaa.jpg",res*255)#保存結果は正常…
mandrill.png
mandrill_template.png
補足情報(FW/ツールのバージョンなど)
python 3.9.0 64-bit
opencv-python 4.1.5.48
参考したサイト openCV:Template Matching
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/01/30 13:14