1. 程式人生 > >python中opencv imshow函式顯示一片白色原因

python中opencv imshow函式顯示一片白色原因

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)

進行型別轉換後陣列為:

顯示結果為:

可見現在顯示正常了,因為去掉了高頻係數所以變模糊了。