python中opencv imshow函式顯示一片白色原因
阿新 • • 發佈:2018-11-17
imshow
顯示型別
首先應當明確的是,opencv中imshow內部的引數型別可以分為兩種。(1)當輸入矩陣是uint8型別的時候,此時imshow顯示影象的時候,會認為輸入矩陣的範圍在0-255之間。(2)如果imshow的引數是double型別的時候,那麼imshow會認為輸入矩陣的範圍在0-1。
顯示出現問題原因:
用OpenCV中imread輸入照片後是一個數組物件,在進行一系列的對陣列操作後陣列已經變成了float型別,之後再對陣列進行imshow時即出現上面的第二種情況。倘若影象矩陣(double型)的矩陣元素不在0-1之間,那麼imshow會把超過1的元素都顯示為白色,即255。其實也好理解,因為double的矩陣並不是歸一化後的矩陣並不能保證元素範圍一定就在0-1之間,所以就會出錯。
解決的辦法:
用numpy.astype()對陣列型別進行轉換。
import numpy as np
a=np.array([1.11,2.22,3.33]) #資料型別轉換用astype,陣列長度不會變
a=a.astype(np.int8)
print(a)
[1 2 3]
再來看看例項:
import pywt import numpy as np import matplotlib.pyplot as plt import cv2 img=cv2.imread(r'F:\picture_test\13.jpg') img=cv2.cvtColor(img,結果如下:cv2.COLOR_BGR2GRAY) img=cv2.resize(img,(512,512)) coefs=pywt.wavedec2(img, 'db6',level=2) coefs[1]=np.zeros_like(coefs[1]) coefs[2]=np.zeros_like(coefs[2]) con_img=pywt.waverec2(coefs,'db6') print(con_img.dtype.type) print('con_img',con_img) cv2.imshow('con_img=',con_img) cv2.waitKey(0)
顯示照片如下:
上面的程式碼是實現對影象的小波變換,對高頻去掉高頻係數,最後再重構,得到的陣列為float型別。
現在進行型別轉換。
import pywt import numpy as np import matplotlib.pyplot as plt import cv2 img=cv2.imread(r'F:\picture_test\13.jpg') img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img=cv2.resize(img,(512,512)) coefs=pywt.wavedec2(img, 'db6',level=2) coefs[1]=np.zeros_like(coefs[1]) coefs[2]=np.zeros_like(coefs[2]) con_img=pywt.waverec2(coefs,'db6') con_img=con_img.astype(np.uint8) #進行型別轉換 print(con_img.dtype.type) print('con_img',con_img) cv2.imshow('con_img=',con_img) cv2.waitKey(0)進行型別轉換後陣列為: 顯示結果為:
可見現在顯示正常了,因為去掉了高頻係數所以變模糊了。