17.颜色空间的转换
17.1.rgb图像转gray图像
from skimage import io,color
img = io.imread('lbxx.jpg')
img_gray = color.rgb2gray(img) #将rgb图像转换成gray图像
io.imshow(img_gray)
运行结果:
17.2.rgb图像转hsv图像
from skimage import io,color
img = io.imread('lbxx.jpg')
img_hsv = color.rgb2hsv(img) #将rgb图像转换成hsv图像
io.imshow(img_hsv)
运行结果:
17.3.将lab图像转成rgb图像
from skimage import io,color
img = io.imread('lbxx.jpg')
img_lab = color.lab2rgb(img) #将lab图像转换成rgb图像
io.imshow(img_lab)
运行结果:
17.4.将hsv图像转成rgb图像
from skimage import io,color
img = io.imread('lbxx.jpg')
gray = color.hsv2rgb(img) #将hsv图像转换成rgb图像
io.imshow(gray)
运行结果:
17.5将rgb图片转成lab图片
from skimage import io,color
img = io.imread('lbxx.jpg')
img_lab = color.rgb2lab(img) #将rgb图像转换成lab图像
io.imshow(img_lab)
注:
(1).HSV(hue,saturation,value)表示色相、饱和度和亮度。
(2).Lab中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;
a表示从红色到绿色的范围,取值范围是[127,-128];
b表示从黄色到蓝色的范围,取值范围是[127,-128]。
运行结果:
17.6.用函数替代的方式将rgb图片转成hsv图片
from skimage import io,color
img = io.imread('lbxx.jpg')
hsv=color.convert_colorspace(img,'RGB','HSV')
#convert是颜色空间,colorspace是颜色通道
io.imshow(hsv)
注:convert是颜色空间,colorspace是颜色通道。
运行结果:
17.7.对图片进行着色
from skimage import io,data,color
import numpy as np
img=io.imread('lbxx.jpg')
img_gray=color.rgb2gray(img)#将RGB图像转换为灰度图像。
rows,cols=img_gray.shape
labels=np.zeros([rows,cols]) #这个数组中的每个元素都被初始化为零。
for i in range(rows):
for j in range(cols):
if(img_gray[i,j]<0.4):
labels[i,j]=0
elif(img_gray[i,j]<0.75):
labels[i,j]=1
else:
labels[i,j]=2
dst=color.label2rgb(labels)
io.imshow(dst)
注:for循环遍历灰度图像的每个像素,根据其灰度值将标签数组的相应位置赋值为0、1或2。具体来说,灰度值小于0.4的像素被标记为0,灰度值在0.4到0.75之间的像素被标记为1,灰度值大于0.75的像素被标记为2。
运行结果:
18.用figure函数和subplot函数分别创建主窗口与子图
18.1. 显示图片的三个通道
from skimage import data
import matplotlib.pyplot as plt
img=io.imread('lbxx.jpg')
plt.figure(num='astronaut',figsize=(8,8)) #创建一个名为astronaut的窗口,并设置大小
plt.subplot(2,2,1) #将窗口分为两行两列四个子图,则可显示四幅图片
plt.title('lbxx') #标题
plt.imshow(img) #显示图片
plt.subplot(2,2,2)
plt.title('R')
plt.imshow(img[:,:,0],plt.cm.gray)
plt.axis('off')
plt.subplot(2,2,3)
plt.title('G')
plt.imshow(img[:,:,1],plt.cm.gray)
plt.axis('off')
plt.subplot(2,2,4)
plt.title('B')
plt.imshow(img[:,:,2],plt.cm.gray)
plt.axis('off') #不显示坐标尺寸
plt.show() #检测、显示窗口
运行结果:
18.2. 批量读取图片
import skimage.io as io
from skimage import data_dir,data
# img1 = io.imread('lbxx.jpg')
str = data_dir+'/*.png'
#创建了一个ImageCollection对象,包含指定路径下所有匹配的图像。
coll = io.ImageCollection(str)
print(len(coll))
io.imshow(coll[1])
注:str = data_dir + '/*.png’这行代码定义了一个字符串,用于指定包含PNG图像的目录。
运行结果:
18.3. 批量转换为灰度图
from skimage import data_dir,io,color
def as_gray(f):
rgb=io.imread('lbxx.jpg')
return color.rgb2gray(rgb)
str = data_dir + '/*.png'
coll = io.ImageCollection(str,load_func=as_gray)
io.imshow(coll[0])
注:读取一个目录中的所有PNG图像,将它们转换为灰度图像,并显示其中的第一张灰度图像。
*灰度化的方法:
as_gray=True
camp = gray/plt.cm.gray
color.rgb2gray(img)
Plt.cm.gray
运行结果:
18.4. 显示视频,并将视频中每10帧的图片读取出来放到集合中
import cv2
from skimage import io
import os
class AVILoader:
def __init__(self, video_file):
self.video_file = video_file
self.cap = cv2.VideoCapture(self.video_file)
def __call__(self, frame):
self.cap.set(cv2.CAP_PROP_POS_FRAMES, frame)
ret, frame = self.cap.read()
if ret:
return cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
else:
return None
#传入视频文件路径。
video_file = 'll.mp4'
av_loader = AVILoader(video_file)
frames = range(0, 100, 20)
output_folder = 'frames'
os.makedirs(output_folder, exist_ok=True)
# 保存每一帧为图像文件
for frame in frames:
img = av_loader(frame)
if img is not None:
filename = os.path.join(output_folder, f'frame_{frame}.jpg')
io.imsave(filename, img)
io.imshow(img) # 显示图像
io.show() # 显示图像窗口
# 创建图像集合
ic = io.ImageCollection(os.path.join(output_folder, '*.jpg'))
# 输出图像集合
注:cv2:OpenCV库,用于视频处理; io:skimage库的输入输出模块,用于图像的读写和显示; os:用于操作文件和目录。
运行结果:
18.5. jpg格式和png格式的转换和保存
from skimage import io,transform,color
import numpy as np
def as_gray(f):
rgb = io.imread(f)
gray=color.rgb2gray(rgb)
dst=transform.resize(gray,(256,256))
return dst
img1 = "C:/1/tupian"
str=img1 + '/*.jpg'
coll = io.ImageCollection(str,load_func=as_gray)
for i in range(len(coll)):
io.imsave(r'C:/1/tupian'+np.str(i)+'.png',coll[i])
注:
skimage.io(用于图像的输入输出)
skimage.transform(用于图像变换)
skimage.color(用于图像颜色空间转换)
numpy(用于数学运算和数组操作)
运行结果:
18.6. 图片的缩放
#1.改变图片的尺寸resize(200,200)
from skimage import transform
import matplotlib.pyplot as plt
img=io.imread('33.png')
plt.subplot(221)
plt.title('resize')
dst =transform.resize(img, (986,772))
plt.imshow(dst,plt.cm.gray)
plt.subplot(222)
plt.title('before resize')
dst =transform.resize(img, (450,350))
plt.imshow(dst,plt.cm.gray)
plt.subplot(223)
plt.title('before resize')
dst =transform.resize(img, (150,120))
plt.imshow(dst,plt.cm.gray)
plt.subplot(224)
plt.title('before resize')
dst =transform.resize(img, (25,60))
plt.imshow(dst,plt.cm.gray)
plt.show()
注:pyplot模块提供了创建和定制图表的函数。
运行结果:
#2.按比例缩放
from skimage import transform,data,io
import matplotlib.pyplot as plt
img=io.imread('lbxx.jpg')
plt.subplot(2,2,1)
plt.title('1')
plt.imshow(img)
plt.subplot(2,2,2)
plt.title('2')
dst=transform.rescale(img,0.1)
plt.imshow(dst)
plt.subplot(2,2,3)
plt.title('3')
dst=transform.rescale(img,0.5)
plt.imshow(dst)
plt.subplot(2,2,4)
plt.title('4')
dst=transform.resize(img,2)
plt.show(dst)
运行结果:
18.7. 将图片进行旋转
from skimage import transform
import matplotlib.pyplot as plt
img=io.imread('lbxx.jpg')
print(img.shape)
img1=transform.rotate(img, 60)
print(img1.shape)
img2=transform.rotate(img, 30,resize=True)
print(img2.shape)
plt.figure('1')
plt.subplot(121)
plt.title('60')
plt.imshow(img1,plt.cm.gray)
plt.subplot(122)
plt.title('30')
plt.imshow(img2,plt.cm.gray)
plt.show()
注:skimage.transform.rotate函数将img图像旋转60度。旋转后的图像被存储在变量img1。
运行结果:
18.8. 对图片的亮度和对比度进行调整
from skimage import io,exposure,img_as_float,data
import matplotlib.pyplot as plt
img=io.imread('lbxx.jpg')
gam1=exposure.adjust_gamma(img, 2)
gam2=exposure.adjust_gamma(img, 0.5)
plt.figure('adjust_gamma',figsize=(8,8))
plt.subplot(131)
plt.title('1')
plt.imshow(img,plt.cm.gray)
plt.axis('off')
plt.subplot(132)
plt.title('2')
plt.imshow(gam1,plt.cm.gray)
plt.axis('off')
plt.subplot(133)
plt.title('0.5')
plt.imshow(gam2,plt.cm.gray)
plt.axis('off')
plt.show()
注:exposure模块包含了一系列用于调整图像曝光度的函数,img_as_float函数用于将图像转。换为浮点数表示。
运行结果:
18.9. 使用对数函数(log)对亮度进行调整
from skimage import io,exposure,img_as_float,data
import matplotlib.pyplot as plt
img=io.imread('ww.jpg')
log1=exposure.adjust_log(img)
plt.figure('adjust_log',figsize=(8,8)) #log对数函数调整
plt.subplot(121)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)
plt.axis('off')
plt.subplot(122)
plt.title('log')
plt.imshow(log1,plt.cm.gray)
plt.axis('off')
plt.show()
io.imsave('D:\ww1.jpg',img)
注:使用skimage.exposure.adjust_log函数将img图像调整为对数形式。调整后的图像被存储在变量log1中。
运行结果:
18.10. 判断图像对比度
#判断图像对比度是否偏低
from skimage import io,exposure
img = io.imread("D:\ww1.jpg")
result=exposure.is_low_contrast(img)
print(result)
注:skimage.exposure.is_low_contrast函数来判断img图像的对比度是否偏低。函数返回一个布尔值,如果对比度偏低,则返回True;否则返回False。
运行结果: