python數字圖像處理(4):圖像數據類型及顏色空間轉換

1、圖像數據類型及轉換數組

在skimage中,一張圖片就是一個簡單的numpy數組,數組的數據類型有不少種,相互之間也能夠轉換。這些數據類型及取值範圍以下表所示:函數

Data type Range
uint8 0 to 255
uint16 0 to 65535
uint32 0 to 232
float -1 to 1 or 0 to 1
int8 -128 to 127
int16 -32768 to 32767
int32 -231 to 231 - 1

一張圖片的像素值範圍是[0,255], 所以默認類型是unit8, 可用以下代碼查看數據類型:ui

from skimage import io,data
img=data.chelsea()
print(img.dtype.name)

在上面的表中,特別注意的是float類型,它的範圍是[-1,1]或[0,1]之間。一張彩色圖片轉換爲灰度圖後,它的類型就由unit8變成了floatspa

一、unit8轉floatcode

from skimage import data,img_as_float
img=data.chelsea()
print(img.dtype.name)
dst=img_as_float(img)
print(dst.dtype.name)

輸出:blog

uint8
float64圖片

二、float轉uint8ip

from skimage import img_as_ubyte
import numpy as np
img = np.array([0, 0.5, 1], dtype=float)
print(img.dtype.name)
dst=img_as_ubyte(img)
print(dst.dtype.name)

輸出:it

float64
uint8io

float轉爲unit8,有可能會形成數據的損失,所以會有警告提醒。

除了這兩種最經常使用的轉換之外,其實有一些其它的類型轉換,以下表:

Function name Description
img_as_float Convert to 64-bit floating point.
img_as_ubyte Convert to 8-bit uint.
img_as_uint Convert to 16-bit uint.
img_as_int Convert to 16-bit int.

 

2、顏色空間及其轉換

如前所述,除了直接轉換能夠改變數據類型外,還能夠經過圖像的顏色空間轉換來改變數據類型。

經常使用的顏色空間有灰度空間、rgb空間、hsv空間和cmyk空間。顏色空間轉換之後,圖片類型都變成了float型。

全部的顏色空間轉換函數,都放在skimage的color模塊內。

例:rgb轉灰度圖

from skimage import io,data,color
img=data.lena()
gray=color.rgb2gray(img)
io.imshow(gray)

其它的轉換,用法都是同樣的,列舉經常使用的以下:

skimage.color.rgb2grey(rgb)

skimage.color.rgb2hsv(rgb)

skimage.color.rgb2lab(rgb)

skimage.color.gray2rgb(image)

skimage.color.hsv2rgb(hsv)

skimage.color.lab2rgb(lab)

 實際上,上面的全部轉換函數,均可以用一個函數來代替

skimage.color.convert_colorspace(arrfromspacetospace)

表示將arr從fromspace顏色空間轉換到tospace顏色空間。

例:rgb轉hsv

from skimage import io,data,color
img=data.lena()
hsv=color.convert_colorspace(img,'RGB','HSV')
io.imshow(hsv)

在color模塊的顏色空間轉換函數中,還有一個比較有用的函數是

skimage.color.label2rgb(arr), 能夠根據標籤值對圖片進行着色。之後的圖片分類後着色就能夠用這個函數。

例:將lena圖片分紅三類,而後用默認顏色對三類進行着色

from skimage import io,data,color
import numpy as np
img=data.lena()
gray=color.rgb2gray(img)
rows,cols=gray.shape
labels=np.zeros([rows,cols])
for i in range(rows):
    for j in range(cols):
        if(gray[i,j]<0.4):
            labels[i,j]=0
        elif(gray[i,j]<0.75):
            labels[i,j]=1
        else:
            labels[i,j]=2
dst=color.label2rgb(labels)
io.imshow(dst)

相關文章
相關標籤/搜索