在Python中进行图像处理,特别是在使用OpenCV和Pillow(PIL)等库时, 了解和操作图像的数据类型及颜色空间是非常重要的。
from skimage import io,data
img=data.chelsea()
print(img.dtype.name)
uint8
from skimage import data,img_as_float
img=data.chelsea()
from skimage import io
io.imshow(img)
/tmp/ipykernel_343/2155636824.py:2: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images. io.imshow(img)
<matplotlib.image.AxesImage at 0x7f22311b1b80>
print(img.dtype.name)
uint8
dst=img_as_float(img)
print(dst.dtype.name)
float64
io.imshow(dst)
/tmp/ipykernel_343/418255675.py:1: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images. io.imshow(dst)
<matplotlib.image.AxesImage at 0x7f222b71a570>
from skimage import img_as_ubyte
import numpy as np
img = np.array([0, 0.5, 1], dtype=float)
print(img.dtype.name)
float64
dst=img_as_ubyte(img)
print(dst.dtype.name)
uint8
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. |
颜色空间及其转换
如上所述,除了直接转换可以改变数据类型外, 还可以通过图像的颜色空间转换来改变数据类型。
常用的颜色空间有灰度空间、 rgb
空间、hsv
空间和 cmyk
空间。
颜色空间转换以后,图片类型都变成了 float
型。
所有的颜色空间转换函数,都放在 skimage
的 color
模块内。
RGB转灰度图
from skimage import io,data,color
img=data.coffee()
gray=color.rgb2gray(img)
io.imshow(gray)
/tmp/ipykernel_343/2695617095.py:3: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images. io.imshow(gray)
<matplotlib.image.AxesImage at 0x7f222b73e930>
其它的转换,用法都是一样的,列举常用的如下:
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(arr, fromspace, tospace)
表示将 arr
从 fromspace
颜色空间转换到 tospace
颜色空间。
RGB转HSV
from skimage import io,data,color
img=data.coffee()
hsv=color.convert_colorspace(img,'RGB','HSV')
io.imshow(hsv)
/tmp/ipykernel_343/624018904.py:3: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images. io.imshow(hsv)
<matplotlib.image.AxesImage at 0x7f222b7e3fe0>
from skimage import io,data,color
import numpy as np
img=data.coffee()
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)
/tmp/ipykernel_343/1093272992.py:14: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images. io.imshow(dst)
<matplotlib.image.AxesImage at 0x7f222b6311c0>