python 图像数据类型及颜色空间转换

本文介绍了Python图像处理中的图像数据类型及其转换,包括unit8到float的转换,以及颜色空间转换,如RGB到灰度、HSV、LAB等。使用了skimage和cv2库进行转换,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、图像数据类型及转换

在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, 可用如下代码查看数据类型:

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

在上面的表中,特别注意的是float类型,它的范围是[-1,1]或[0,1]之间。一张彩色图片转换为灰度图后,它的类型就由unit8变成了float

1、unit8转float

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

输出:

uint8
float64

2、float转uint8

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)

输出:

float64
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.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)
复制代码



(1)将RGB图像转为HSV, LAB, GRAY, 顺变将不是224大小的图片resize一下

[python]  view plain  copy
  1. # -*- coding: utf-8 -*-  
  2. import os  
  3. import cv2  
  4. N = 0  
  5. imgPath = "TrainDataExpd/"  
  6. savePath = "TrainDataFinal/"  
  7.   
  8. for root, dirs, files, in os.walk(imgPath):  
  9.     for name in files:  
  10.         N += 1  
  11.         print N  
  12.         folder = root.split('/')[-1]  
  13.         ImgName, ext = os.path.splitext(name)  
  14.         saveFolder = savePath + folder + '/'  
  15.   
  16.         if not os.path.exists(saveFolder):  
  17.             os.mkdir(saveFolder)  
  18.         imgFilePath = os.path.join(root,name)  
  19.         Img = cv2.imread(imgFilePath)  
  20.         size = Img.shape  
  21.         width = size[0]  
  22.         height = size[1]  
  23.   
  24.         if width != 224 or height != 224:  
  25.             NewImg = cv2.resize(Img, (224,224))  
  26.             cv2.imwrite(saveFolder + name, NewImg)  
  27.             # RGB2Gray  
  28.             GrayImg = cv2.cvtColor(NewImg,cv2.COLOR_BGR2GRAY)  
  29.             cv2.imwrite(saveFolder + ImgName + 'G' + '.jpg', GrayImg)  
  30.             # RGB2HSV  
  31.             HSVImg = cv2.cvtColor(NewImg,cv2.COLOR_BGR2HSV)  
  32.             cv2.imwrite(saveFolder + ImgName + 'H' + '.jpg',HSVImg)  
  33.             # RGB2lab  
  34.             LABImg = cv2.cvtColor(NewImg,cv2.COLOR_BGR2LAB)  
  35.             cv2.imwrite(saveFolder + ImgName + 'L' + '.jpg', LABImg)  
  36.   
  37.         else:  
  38.             cv2.imwrite(saveFolder + name, Img)  
  39.             GrayImg = cv2.cvtColor(Img,cv2.COLOR_BGR2GRAY)  
  40.             cv2.imwrite(saveFolder + ImgName + 'G' + '.jpg', GrayImg)  
  41.             HSVImg = cv2.cvtColor(Img,cv2.COLOR_BGR2HSV)  
  42.             cv2.imwrite(saveFolder + ImgName + 'H' + '.jpg',HSVImg)  
  43.             LABImg = cv2.cvtColor(Img,cv2.COLOR_BGR2LAB)  
  44.             cv2.imwrite(saveFolder + ImgName + 'L' + '.jpg', LABImg)  


(2)另可以用PIL的Image:

# Img = Image.open(path)
# # convert to gray
# GrayImg = Img.convert('L')
# GrayImg.save("C:/Users/liesmars/Desktop/gray.jpg")


(3)颜色通道分离 合并:

img = cv2.imread(path)
# b = cv2.split(img)[0]
# g = cv2.split(img)[1]
# r = cv2.split(img)[2]

MergedImg1 = cv2.merge([b,g,r])


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值