簡體   English   中英

當使用 OpenCV 將黑白圖像讀取為 Numpy 數組時,我得到的結果與讀取圖像不同

[英]When reading B/W image as Numpy array using OpenCV I get different results than reading as an image

我的最終用戶正在讀取圖像,將它們轉換為灰度並將它們打包成 H5 文件,例如 numpy arrays 使用以下代碼:

image = Image.open(imageFilename)
greyscaleImage = image.convert("L")
imageData = np.asarray(greyscaleImage)
    if convertTo16Bit:
        imageData16bit = imageData.astype(np.uint16)
        imageData16bit = imageData16bit*8
        imageData = imageData16bit

h5Filename = makeFilename(imageId, appendToName)
h5FullPath = os.path.join(filePath, h5Filename)
h5file = h5py.File(h5FullPath, "w")
dset = h5file.create_dataset("image", data=imageData)

然后我按如下方式閱讀了這些 H5 文件:

        if args.file_types == 'image':
            image = cv2.imread(os.path.join(args.input, filename), cv2.IMREAD_COLOR)
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            
        elif args.file_types == 'h5, hdf5':
            hf = h5py.File(os.path.join(args.input, filename), "r")
            key = list(hf.keys())[0]
            data = np.array(hf[key])
            hf.close()
            image = cv2.cvtColor(np.uint16(data), cv2.COLOR_GRAY2RGB)
            plt.axis('off')
            plt.imshow(image)
            plt.show()

我需要轉換為 RGB,然后在 object 檢測 model 中使用它們。 當我閱讀 H5 文件並查看圖像時,它們丟失了信息,並且 model 無法像使用原始 jpg 文件那樣執行檢測。

請有人可以幫助我了解如何在不丟失任何信息的情況下讀取 H5 文件?

如上所述,您的 HDF5 文件中缺少信息,因為用戶將圖像轉換為灰度(使用image.convert("L") )。 執行此操作時,您的圖像會從 3 個通道變為 1 個通道。 下面的示例代碼演示了這一點。

image = Image.open(imageFilename)
print(image.size,image.mode)
image.show()
imageData = np.asarray(image)
print('Color image:',imageData.dtype, imageData.shape)

greyscaleImage = image.convert("L")
print(greyscaleImage.size,image.mode)
greyscaleImage.show()
imageData = np.asarray(greyscaleImage)
print('Grey scale image:',imageData.dtype, imageData.shape)

您的 object 檢測 model 需要彩色圖像還是可以將 1 通道(灰度)陣列轉換為 3 通道陣列? 如果您需要彩色圖像,我認為您會遇到問題-我認為您無法逆轉該過程。 您的用戶必須將圖像保存為 3 通道 RGB arrays。

如果只需要3通道陣列,可以展開1通道陣列,如下圖。

imageData3x = np.stack((imageData,imageData,imageData),axis=2)
print('3x Grey scale image:',imageData3x.dtype, imageData3x.shape)

plt.axis('off')
plt.imshow(imageData3x)
plt.show()

注意:上面的代碼不處理 HDF5 文件中的其他數據轉換(轉換為np.uint16並將值乘以 8)。 我不清楚為什么要完成其中任何一個。 但是,只要您有一個標簽可以知道if convertTo16BitTrue還是False ,它們就可以很簡單地“撤消”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM