小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何轉(zhuǎn)換opencv的圖片格式在pytorch中使用

 印度阿三17 2021-03-15

在這里插入圖片描述
首先,如上圖所示,opencv讀入的圖像為 RGB格式,但是我們?cè)趐ytorch中進(jìn)行圖像處理時(shí),要先將RGB轉(zhuǎn)換成BGR,然后在使用img = Image.fromarray(np.uint8(self.camimg)) 將array轉(zhuǎn)換成image格式,這樣轉(zhuǎn)換圖片格式后才能夠在pytorch中使用。

一般圖像的存儲(chǔ)方式是H x W x C的順序(其中H、W、C分別表示圖像的高、寬和通道數(shù),通道數(shù)一般為RGB三通道),另外,其中的每一個(gè)數(shù)據(jù)都是[0,255]的整數(shù),opencv中圖片的格式也是hwc。但在pytorch中為CHW,img = img.transpose(2, 0, 1)。

在使用pytorch的時(shí)候,我們通常要使用pytorch中torchvision包下面的datasets模塊和transforms模塊。而通常情況下在我們使用了這兩個(gè)模塊之后,所處理的圖像數(shù)據(jù)格式已經(jīng)不是我們所熟知的格式了。下面按照代碼來進(jìn)行講解:
#導(dǎo)入需要的包和模塊
import torch
from torchvision import datasets, transforms
import os
#transforms指明了需要對(duì)原始圖像做何種變換
data_transforms = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
data_dir = 'original_data’
image_dataset = datasets.ImageFolder(data_dir, data_transforms)
dataloader = torch.utils.data.DataLoader(image_dataset, batch_size=32, shuffle=True, num_workers=0)

代碼中首先使用datasets模塊讀取圖像數(shù)據(jù),輸出的圖像類型為PILImage,并且圖像中的每一個(gè)數(shù)據(jù)大小范圍已經(jīng)不再是[0,255],而是[0,1]。datasets模塊下有好幾個(gè)讀取圖像的類,比如CIFAR10、MNIST等能夠直接獲取標(biāo)準(zhǔn)數(shù)據(jù)庫;而我們代碼中所使用的類是ImageFolder,它能夠讀取本地存放的圖像。其中需要指定圖像所在文件路徑和需要對(duì)數(shù)據(jù)進(jìn)行的變換。
從上面的data_transforms變量中我們能夠看出進(jìn)行了多種變換,而Compose就是將多種變換組合起來的方法。data_transforms中一共包含了四個(gè)變換,前兩個(gè)是對(duì)PILImage進(jìn)行的,分別對(duì)其進(jìn)行隨機(jī)大小(默認(rèn)原始圖像大小的0.08-1.0)和隨機(jī)寬高比(默認(rèn)原始圖像寬高比的3/4-4/3)的裁剪,之后resize到指定大小224;以及對(duì)原始圖像進(jìn)行隨機(jī)(默認(rèn)0.5概率)的水平翻轉(zhuǎn)。
第三個(gè)transforms.ToTensor()的變換操作是關(guān)鍵一步,它將PILImage轉(zhuǎn)變?yōu)閠orch.FloatTensor的數(shù)據(jù)形式,這種數(shù)據(jù)形式一定是C x H x W的圖像格式加上[0,1]的大小范圍,它的作用有歸一化和將圖像轉(zhuǎn)化為tensor的作用。
后面的Normalize變換是對(duì)tensor這種數(shù)據(jù)格式進(jìn)行的,它的操作是用給定的均值和標(biāo)準(zhǔn)差分別對(duì)每個(gè)通道的數(shù)據(jù)進(jìn)行正則化,即減均值/方差。經(jīng)過上面一系列的轉(zhuǎn)換之后,我們可以得出的結(jié)論是,圖像的數(shù)據(jù)格式首先在維度的排序上發(fā)生了改變,其次數(shù)據(jù)的范圍也發(fā)生了改變。

使用opecv讀取并處理圖像,使用matplotlib繪制圖像,最終保存為PIL.Image,再使用pytorch的torchvision.transforms.ToTensor()(img)轉(zhuǎn)化成tensor。
具體操作如下:
在這里插入圖片描述
補(bǔ)充說明:

  1. opencv
    a. 讀取圖像:
    img = cv.imread(path)
    opencv庫使用imread讀取得到的默認(rèn)是一個(gè)BGR模式的彩色圖像,可以使用cv.cvtColor(img, cv.COLOR_BGR2RGB)將顏色模式轉(zhuǎn)化成RGB。opencv的基本圖像類型與numpy數(shù)組可以互相轉(zhuǎn)化。因此可以直接調(diào)用torch.from_numpy(img)將圖像轉(zhuǎn)成tensor。
    b. 保存圖像:
    cv.imwrite(path, img)
    c. 繪制圖像:
    cv.imshow(name, img)
    opencv的繪制圖像操作會(huì)將圖像以窗口的形式顯示在屏幕上,因此需要手動(dòng)執(zhí)行中斷命令來關(guān)閉窗口進(jìn)程。一般會(huì)用到:
    k = cv.waitKey(0) & 0xFF
    if k == 27:
    cv.destroyAllWindows()
    優(yōu)點(diǎn):對(duì)圖像處理的接口豐富,集成了許多常用的圖像處理操作:閾值、邊緣檢測(cè)、角點(diǎn)檢測(cè)、圖像濾波、形態(tài)學(xué)處理、傅里葉變換、直方圖均衡、模板匹配、運(yùn)動(dòng)檢測(cè)(meanshift),并且支持人臉部位識(shí)別。
    缺陷:opencv在讀取圖像時(shí),若path錯(cuò)誤,僅會(huì)返回None,而不會(huì)報(bào)錯(cuò),并且opencv不支持使用imread對(duì)gif格式的圖像進(jìn)行讀取,若要讀取gif格式的圖像,需要使用gif = cv.VideoCapture(path)得到一個(gè)opencv的視頻對(duì)象,然后使用ret,frame = gif.read()讀取該視頻對(duì)象的一幀。
  2. PIL
    PIL是python對(duì)圖像處理的基本庫
    a. 讀取圖像:
    img = PIL.Image.open(path)
    讀取得到的是一個(gè)PIL.xxxImageFile類型,numpy中提供了與將PIL.ImageFile轉(zhuǎn)化為array的接口:
    np.asarray(img) img->array
    Image.fromarray(array) array->img
    可以使用img.convert(model)轉(zhuǎn)換顏色模式。其中model包括:'1’:二值圖,'L’:灰度圖,'P’:8位彩色圖像,'RGB’:24位彩色圖像(每個(gè)通道8位),'RGBA’:相比RGB多了個(gè)alpha通道(不透明度)等等。
    b. 保存圖像:
    img.save(path)
    c. 繪制圖像:
    img.show()
    優(yōu)點(diǎn):支持的圖片格式豐富,并且作為python的基本庫,與各個(gè)庫之間兼容性最好。
    缺點(diǎn):圖像處理算法較少。
  3. matplotlib
    matplotlib是python仿照matlab的繪圖來開發(fā)的圖像繪制庫。
    a. 讀取圖像:
    img = plt.imread()
    matplotlib讀取的圖像類型直接為numpy.array,并且matplotlib讀取圖像時(shí)直接進(jìn)行了歸一化操作。
    b. 保存圖像:
    plt.imsave(path,img)

    img.imsave(path)
    matplotlib在保存圖像時(shí),可以使用imsave保存不帶坐標(biāo)軸的圖像,也可以使用plt.savefig(path)保存帶坐標(biāo)軸的圖像。
    c. 繪制圖像:
    plt.imshow(img)
    plt.show()
    matplotlib在執(zhí)行imshow之后,必須跟著執(zhí)行show()。
    優(yōu)點(diǎn):和matlab的繪圖命令基本相同,不僅可以繪制圖像,也可以繪制其他類型的圖像(折線圖、散點(diǎn)圖、餅圖、熱力圖、3D圖),并且讀入的圖像與numpy直接兼容。
    缺點(diǎn):matplotlib是一個(gè)繪圖的庫,因此沒有圖像處理相關(guān)的算法。
來源:https://www./content-4-891851.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多