2017-07-29 122 views
0

我用下面的代碼來計算圖像的DCT:圖像類型轉換用的OpenCV imwrite

img = cv2.imread(imgName,0) 
imf = np.float32(img) 
dctimg = cv2.dct(imf) 

的問題是保存與OpenCV的的imwrite功能的圖像時,我發現了期望的輸出。

cv2.imwrite('output-dct.png',dctimg) 

enter image description here

不過,雖然與matplotlib爲plt.imshow(dctimg, cmap='gray')節省我得到全黑圖像。
enter image description here

我知道OpenCV會將它轉換爲8位圖像。所以我試圖用標準化來做同樣的事情

cv2.normalize(orgDct, dctimg,alpha=0, beta=1, 
          norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) 
dctimg = np.uint8(dctimg)*255 
plt.imshow(dctimg, cmap='gray') 

但是結果並不一樣。
enter image description here
如何在使用matplotlib繪圖時達到與imwrite相同的效果?

+0

正常化是錯誤的 - 你設定的範圍,以0-1和數據類型CV_8U。該行之後的行是毫無意義的,只是直接規範化到範圍0-255。 –

回答

0

我使用了imshow函數的vminvmax參數。這給出了與OpenCV的imwrite相同的DCT圖像。

所以該程序是這樣的:

img = cv2.imread(imgName,0) 
imf = np.float32(img) 
dctimg = cv2.dct(imf) 
plt.imshow(dctimg, cmap='gray', vmin = 0, vmax = 255) 

這裏是上面代碼的輸出:
enter image description here

0

你犯了一個錯誤:

dctimg = np.uint8(dctimg)*255 

也許應該

dctimg = np.uint8(dctimg*255) 

,因爲假設你dctimg的值是0.0到1.0之間,你的代碼將只極高轉換值爲1,其餘爲0,然後將結果乘以255 - 幾乎在任何地方產生0。

此外,請確保您的DCT實際上只產生正值。我認爲通常情況並非如此。

+1

是的,這沒有什麼幫助,但問題甚至更早 - 當標準化爲0到1之間的範圍時,「dtype = cv2.CV_8U」。因此,它只是一個和零,轉換爲'np.uint8'可能是多餘的。 –