我有一個數據類型爲int16
的圖像。 因此,當我必須將其範圍轉換爲0-255時,我有兩種方法可以在Python中執行此操作。圖像類型int16轉換爲uint8
1)使用numpy.uint8
函數直接
2)使用的OpenCV cv2.normalize
函數0-255範圍,然後使用numpy.uint8
。
在Matlab中,我們直接使用uint8
函數得到轉換。
同樣在第二種情況下,我使用NORM_MINMAX
,強度值的範圍變爲0-4
。
轉換的正確方法是什麼?
我有一個數據類型爲int16
的圖像。 因此,當我必須將其範圍轉換爲0-255時,我有兩種方法可以在Python中執行此操作。圖像類型int16轉換爲uint8
1)使用numpy.uint8
函數直接
2)使用的OpenCV cv2.normalize
函數0-255範圍,然後使用numpy.uint8
。
在Matlab中,我們直接使用uint8
函數得到轉換。
同樣在第二種情況下,我使用NORM_MINMAX
,強度值的範圍變爲0-4
。
轉換的正確方法是什麼?
所有這些做不同的事情。
np.uint8
只考慮你的號碼的最低字節。這就像在做value & 0xff
。
>>> img = np.array([2000, -150, 11], dtype=np.int16)
>>> np.uint8(img)
array([208, 106, 11], dtype=uint8)
cv2.normalize
與cv2.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
就是答案。
感謝您澄清了這個問題......我想調整強度。所以首先我必須使用cv2.normalize然後np.uint8。對? – user3515225
@ user3515225是的,儘管如果您在'cv2.normalize'中傳遞參數'dtype = cv2.CV_8U',您可以一步完成。 – Reti43