2017-10-21 766 views
0

我有一個數據類型爲int16的圖像。 因此,當我必須將其範圍轉換爲0-255時,我有兩種方法可以在Python中執行此操作。圖像類型int16轉換爲uint8

1)使用numpy.uint8函數直接

2)使用的OpenCV cv2.normalize函數0-255範圍,然後使用numpy.uint8

在Matlab中,我們直接使用uint8函數得到轉換。

同樣在第二種情況下,我使用NORM_MINMAX,強度值的範圍變爲0-4

轉換的正確方法是什麼?

回答

2

所有這些做不同的事情。

np.uint8只考慮你的號碼的最低字節。這就像在做value & 0xff

>>> img = np.array([2000, -150, 11], dtype=np.int16) 
>>> np.uint8(img) 
array([208, 106, 11], dtype=uint8) 

cv2.normalizecv2.NORM_MINMAX規範類型根據normalisation function

img_new = (img - img.min()) * ((max_new - min_new)/(img.max() - img.min())) + min_new 

它有效地改變一個範圍到另一個和所有的值在之間相應地縮放的正常化值。根據定義,原始最小/最大值將成爲目標最小/最大值。

>>> cv2.normalize(img, out, 0, 255, cv2.NORM_MINMAX) 
array([255, 0, 19], dtype=int16) 

uint8在Matlab簡單的飽和值。上述255一切都變成255,一切都低於0變爲0

>> uint8([2000 -150 11]) 

ans = 

    255 0 11 

如果要複製Matlab的功能,你可以做

>>> img[img > 255] = 255 
>>> img[img < 0] = 0 

你想使用哪一個取決於你正在努力去做。如果你的int16覆蓋了你的像素值的範圍,並且你想把它們重新調整到uint8,那麼cv2.normalize就是答案。

+0

感謝您澄清了這個問題......我想調整強度。所以首先我必須使用cv2.normalize然後np.uint8。對? – user3515225

+0

@ user3515225是的,儘管如果您在'cv2.normalize'中傳遞參數'dtype = cv2.CV_8U',您可以一步完成。 – Reti43