python使用opencv对图像的基本操作(3)

发布于:2024-05-02 ⋅ 阅读:(32) ⋅ 点赞:(0)

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。
运行结果:
在这里插入图片描述