1.讀取的通道不同:cv2讀取圖像為BGR順序通道,PIL讀取圖像為RGB順序通道.
2.讀取圖像代碼對比:
# cv2讀取方式
input1 = r'E:\DRPL\data\blur\1_ILSVRC2012_val_00004507_3_183.jpg'
cv2img = cv2.imread(input1, flags=cv2.IMREAD_COLOR) # 默認以BGR形式打開
cv2.imshow("cv2img", cv2img) cv2.waitKey(0)
# PIL讀取方式
input2 = r'E:\DRPL\data\blur\1_ILSVRC2012_val_00004507_3_re183.jpg'
pilimg = Image.open(input2) pilimg.show()
3.讀取出的圖像類型以及尺度屬性對比:
print(cv2img.shape, cv2img.size, type(cv2img)) print(pilimg.size, type(pilimg))

cv2讀取出圖像的類型為ndarray類型,pil讀取的為PIL類型。
cv2讀取的圖像同時擁有shape()和size()方法,pil只有size()方法。
4.將cv2和PIL轉換為tensor數據類型代碼對比:
trans = transforms.ToTensor() tensor_cv2 = trans(cv2img) tensor_pil = trans(pilimg) print(tensor_cv2.shape, tensor_cv2.size(), type(tensor_cv2)) print(tensor_pil.shape, tensor_pil.size(), type(tensor_pil))

兩者都可以轉換為tensor數據類型
5.cv2圖像和PIL圖像相互轉換:
# 將PIL轉換為cv2
# 方法1:用numpy.asarray()函數轉化類型,再用cv2.cvtColor轉化RGB為BGR通道.
trans_cv2img = cv2.cvtColor(numpy.asarray(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("trans_cv2img", trans_cv2img) cv2.waitKey(0)
# 方法2:可以不使用cv2.cvtColor,但是show出來的圖像會發藍,因為沒有變換通道 trans_tocv2 = numpy.array(pilimg) cv2.imshow("transtocv2", transtocv2) cv2.waitKey(0)
6.其他知識引申:
# 轉換RGB的方法對比
cv2img1 = cv2.cvtColor(cv2img, cv2.COLOR_BGR2RGB) pilimg1 = pilimg.convert('RGB')
將PILimg轉換為cv2時可以使用numpy.array(),也可以使用numpy.asarray(),這兩者的區別在於array會copy出一個副本,占用新的內存,但asarray不會.
就是說將數據源用asarray轉換后賦值給新的變量,再對原始數據源進行操作修改,會影響到新的變量數據.
而如果用array來轉換並賦值給新變量,修改原始數據后不會對新變量造成影響.
他們說PIL讀取圖片速度比cv2快一點,不知道是不是真的