詳解R語言圖像處理EBImage包
本文摘自《Keras深度學(xué)習(xí):入門、實戰(zhàn)及進階》第四章部分章節(jié)。
什么是EBImage
EBImage是R的一個擴展包,提供了用于讀取、寫入、處理和分析圖像的通用功能,非常容易上手。EBImage包在Bioconductor中,通過以下命令進行安裝。
install.packages("BiocManager") BiocManager::install("EBImage")
EBImage安裝后,可以通過以下命令將其加載到R中。
library("EBImage")
1. 圖像讀取與保存
EBImage的基本功能包括圖像的讀取、顯示和寫入。使用readImage()函數(shù)讀取圖像,函數(shù)中的參數(shù)files表示需要讀取的文件名或URL,參數(shù)type表示讀取的圖像文件格式,目前支持jpeg、jpg和tiff三種圖像文件格式。
首先,將我們將一張圖像格式為jpg文件的灰色圖像加載到R中。我們可以通過display()函數(shù)對剛剛加載的圖像進行可視化
> img <- readImage('../images/cat.jpg') > display(img ,method = 'browser')
當display()函數(shù)的參數(shù)method為“browser”時,在R中運行命令后將在默認Web瀏覽器中打開圖像,在RStudio中運行命令后將在View窗口打開可交互的圖像。使用鼠標或者鍵盤快捷鍵可以放大或縮小圖像、平移或循環(huán)顯示多個圖像。當參數(shù)method為“raster”時,就在當前設(shè)備上繪制靜態(tài)圖像,我們還可以利用R的低級繪圖函數(shù)在圖像上添加其他元素。運行以下程序代碼將在圖像上添加文本標簽
> display(img,method = 'raster') > text(x = 20,y = 20,label = 'cat',adj = c(0,1),col = 'orange',cex = 2)
上面示例讀入的是黑白圖像(或稱灰色圖像),readImage()和display()函數(shù)也可以輕松讀入彩色照片。
> imgcol <- readImage('../images/cat-color.jpg') > display(imgcol,method = 'raster')
2.色彩管理
colorMode()函數(shù)可用于訪問和更改此屬性,修改圖像的渲染模式。在下一個例子中,我們將一張彩色圖像的模式變?yōu)榛疑℅rayscale),那么該圖像將不再顯示單一的彩色圖像,而是轉(zhuǎn)換為三幀的灰色圖像,分別對應(yīng)紅、綠、藍三個通道。colorMode()函數(shù)只會改變EBImage渲染圖像的方式,并不會改變圖像的內(nèi)容。運行以下程序代碼,將一個彩色圖像渲染為一個具有3幀(紅色通道、綠色通道、藍色通道)的灰色圖像。
> colorMode(imgcol) <- Grayscale > display(imgcol,method = 'raster',all = TRUE,nx = 3)
我們可以使用更靈活的channel()函數(shù)進行色彩空間轉(zhuǎn)換,可以將灰色圖像轉(zhuǎn)換為彩色圖像,也可以從彩色圖像中提取顏色通道。與colorMode()函數(shù)不同,channel()函數(shù)還可以更改圖像的像素強度值。asred、asgreen和asblue轉(zhuǎn)換模式可以將灰色圖像或數(shù)組轉(zhuǎn)換為指定色調(diào)的彩色圖像,此時圖形數(shù)據(jù)也將從二維變成三維。
> img_asgreen <- channel(img,'asgreen') > dim(img) [1] 1920 1080 > dim(img_asgreen) [1] 1920 1080 3
3.圖像處理
作為數(shù)值數(shù)組,可以使用R的任何算數(shù)運算符方便地操作圖像。例如,我們可以通過簡單地利用其最大值減去圖像數(shù)據(jù)來生成負圖像。
> img_neg <- max(img) - img > img_comb <- combine(img,img_neg) TRUE)
我們還可以通過加法來增加圖像的亮度,通過相乘來調(diào)整對比度,以及通過求冪來應(yīng)用伽瑪校正。
> img_comb1 <- combine( + img, + img + 0.3, + img * 2, + img ^ 0.5 + ) > display(img_comb1,method = 'raster',all=TRUE)
我們可以使用標準矩陣的子集選取方式對圖像進行裁剪。比如我們通過選取Image類的部分數(shù)據(jù)用于繪制貓咪的頭像
> img_crop <- img[800:1700, 100:950] > plot(img_crop)
4.空間變換
對于灰色圖像,可以使用R基礎(chǔ)包的t()函數(shù)或者EBImage擴展包的transpose()函數(shù)進行轉(zhuǎn)置。
> img_t <- transpose(img) # 等價于 img_t <- t(img) > plot(img_t)
對于彩色圖像,我們不能使用t()函數(shù),而是需要使用transpose()函數(shù)對其進行轉(zhuǎn)置,其能通過交換空間維度來置換圖像。
> t(imgcol) # 報錯 Error in t.default(imgcol) : argument is not a matrix > imgcol_t <- transpose(imgcol) > plot(imgcol_t)
除了轉(zhuǎn)置,我們還有更多關(guān)于圖像的空間變換,例如平移、旋轉(zhuǎn)、反射和縮放。translate()函數(shù)通過指定的二維向量移動圖像平面,裁剪圖像區(qū)域外的像素,并將進入圖像區(qū)域的像素設(shè)置為背景。參數(shù)v是由兩個數(shù)字組成的向量,表示以像素為單位的平移向量。以下代碼實現(xiàn)將圖像往右移動100像素,往上移動50像素。
> img_rotate <- rotate(img,30) > plot(img_rotate)
使用resize()函數(shù)可以將圖像進行縮放,如果僅提供寬度或者高度之一,則將自動計算另一個尺寸并保持原始寬高比。以下代碼實現(xiàn)將img、imgcol圖像的寬、高均設(shè)置為256。
> # 調(diào)整圖像尺寸 > img_resize <- resize(img,w = 256,h = 256) > imgcol_resize <- resize(imgcol,w = 256,h = 256) > par(mfrow=c(1,2)) > plot(img_resize) > plot(imgcol_resize) > par(mfrow=c(1,1))
flip()和flop()函數(shù)分別圍繞水平軸和垂直軸反射圖像。
> img_flip <- flip(img) > img_flop <- flop(img) > display(combine(img_flip, img_flop), + all=TRUE,method = 'raster')
affine()函數(shù)可以實現(xiàn)空間線性變換,其中像素坐標(用矩陣px表示)轉(zhuǎn)換為cbind(px, 1)%*%m。
> m <- matrix(c(1,-.5,128,0,1,0),nrow=3,ncol=2) > img_affine <- affine(img, m) > display(img_affine)
5.形態(tài)運算
二值圖像是僅包含兩組像素的圖像,其值為0和1,分別表示背景像素和前景像素。這樣的圖像要經(jīng)歷幾種非線性的形態(tài)學(xué)運算:侵蝕、膨脹、打開和閉合。這些操作通過以下方式在二進制圖像上覆蓋一個稱為結(jié)構(gòu)元素的掩碼來工作:
- 腐蝕:對于每個前景像素,在其周圍放置一個遮罩,如果遮罩覆蓋的任何像素來自背景,請將其設(shè)置為背景。
- 膨脹:對于每個背景像素,在其周圍放置一個蒙版,如果蒙版覆蓋的任何像素都來自前景,請將像素設(shè)置為前景。
我們首先讀入一個二值圖像,然后利用markBrush()函數(shù)創(chuàng)建一個形狀為diamond,大小為3的濾波器,再通過erode()函數(shù)對二值圖像進行腐蝕、dilate()函數(shù)對圖像進行膨脹。
> shapes <- readImage('../images/shapes.jpg') > kern = makeBrush(3, shape='diamond') > shapes_erode= erode(shapes, kern) # 腐蝕 > shapes_dilate = dilate(shapes, kern) # 膨脹 > display(combine(shapes,shapes_erode, shapes_dilate), + all=TRUE,method = 'raster',nx = 3)
6.圖像分割
圖像分割是指對圖像進行分割,通常用于識別圖中的對象。非接觸連接的對象可以使用bwlabel()函數(shù)進行分段,而watershed()與propagate()函數(shù)能夠用更復(fù)雜的算法分離彼此接觸的對象。
bwlabel()函數(shù)查找除背景以外的每個相連像素集,并用唯一遞增的整數(shù)重新標記這些集??梢栽趲ч撝档亩M制圖像上調(diào)用它以提取對象。
> shapes_label <- bwlabel(shapes) > table(shapes_label) shapes_label ?0 ? ? 1 ? ? 2 ? ? 3 ? ? 4 ? ? 5 ? ? 6 ? ? 7 ? ? 8 ? ? 9 ? ?10 ? ?11 ? ?12 ? ?13 ? ?14 ? ?15? 16821 ? 398 ? 129 ? 135 ? 11 ? 147 ? ?81 ? 109 ? ?60 ? ?87 ? ?93 ? ?81 ? ?78 ? 100 ? ?87 ? ?15? > max(shapes_label) [1] 15
shapes_label圖像的像素值范圍從0(對應(yīng)于背景)到其包含的對象數(shù),最大值為15。
我們利用normalize()函數(shù)對其進行(0,1)范圍內(nèi)的標準化,這將導(dǎo)致不同的對象以不同的灰色陰影渲染
> display(normalize(shapes_label),method = 'raster') # 灰色渲染
可視化分割的另一種方式是使用colorLabels()函數(shù),該函數(shù)通過唯一顏色的隨機排列對對象進行顏色編碼。
> display(colorLabels(shapes_label),method = 'raster') # 彩色渲染
EBImage將對象掩碼定義為具有相同唯一整數(shù)值的一組像素。通常,包含對象掩碼的圖像就是分割函數(shù)的結(jié)果,如bwlabel、watershed或propagate。通過rmObject()函數(shù)可以將對象從這些圖像中刪除,只需將對象的像素值設(shè)置為0就可以從掩碼中刪除對象。默認情況下,在刪除對象之后,所有剩余的對象都會被重新標記,以便最高對象ID對應(yīng)于掩碼中的對象數(shù)量。參數(shù)reenumerate可用于更改此行為并保留原始對象id。
我們需要將RstudioKeras對象中的“”移除,通過以下程序代碼實現(xiàn)。
> z <- rmObjects(shapes_label,15) # 移除"_" > display(z,method = 'raster')
到此這篇關(guān)于R語言圖像處理EBImage包詳解的文章就介紹到這了,更多相關(guān)R語言圖像處理EBImage內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
R語言rhdf5讀寫hdf5并展示文件組織結(jié)構(gòu)和索引數(shù)據(jù)
這篇文章主要為大家介紹了R語言rhdf5讀寫hdf5并展示文件組織結(jié)構(gòu)和索引數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06R語言實現(xiàn)各種數(shù)據(jù)可視化的超詳細教程
Python語言越來越流行,尤其是在機器學(xué)習(xí)與深度學(xué)習(xí)等領(lǐng)域,但是R語言在數(shù)據(jù)分析與可視化方面仍然具有絕對的優(yōu)勢,下面這篇文章主要給大家介紹了關(guān)于R語言實現(xiàn)各種數(shù)據(jù)可視化的超詳細教程,需要的朋友可以參考下2022-11-11