图像数据处理1-图像数据的表示与基本运算 1.1图像文件的读写与显示

一、图像数据的表示与基本运算

1.1图像文件的读写与显示

1.1.1OpenCV读写与显示图像文件

①彩色图像转为灰度图像

import cv2 as cv
import sys
import os

# 从当前工作目录下读入一幅彩色图像
img_path = 'E:\PyCharm Community Edition 2024.1.1\image\slpn.jpg'#此处为绝对路径
img = cv.imread(img_path, cv.IMREAD_COLOR)#读取指定路径下的图像文件,并以彩色模式将其加载到img变量中

# 若没有正确读取图像,显示出错信息并退出运行
if img is None:
    sys.exit("Could not find the image! ")

# 转换为灰度图像
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)#在 OpenCV 中,图像通常以 BGR(蓝、绿、红)格式存储,而不是常见的 RGB 格式

#调节输出图像尺寸
resize_width = 600 # 设定新的宽度
resize_height = 600 # 设定新的高度
img_resized = cv.resize(img, (resize_width, resize_height))
img_gray_resized = cv.resize(img_gray, (resize_width, resize_height))

# 显示原图,并使用调整尺寸后的图像
cv.imshow('Original Image', img_resized)

# 显示灰度图,并使用调整尺寸后的灰度图像
cv.imshow('Gray Image', img_gray_resized)

# 等待按键,之后关闭窗口
cv.waitKey(0)
cv.destroyAllWindows()

# 保存灰度图像路径,若路径不存在则创建该文件夹
save_dir = './image_save'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)
save_path = os.path.join(save_dir, 'slpn_gray.jpg')
cv.imwrite(save_path, img_gray)

尽管我们的路径正确,但运行该代码会显示我们提前设置的报错“Could not find the image!”,原因是opencv无法识别汉字,所以今后在使用opencv打开文件时,文件路径中一定不要存在汉字。我们将圣灵谱尼改为其首字母缩写slpn后便能成功得到其灰度图。

重点代码详解与记忆
1.img = cv.imread(img_path, cv.IMREAD_COLOR)#读取指定路径下的图像文件,并以彩色模式将其加载到img变量中

imread函数存在于多个库中,用于读取图像文件并返回一个表示图像的数组,在cv.omread后输入(文件路径,以彩色的形式读取)


2.img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)#在 OpenCV 中,图像通常以 BGR(蓝、绿、红)格式存储,而不是常见的 RGB 格式

cv.cvtColor用于实现图像色彩空间的转换,随后输入(加载图像信息的变量,要转换的形式)

除了转换为灰度图以外,还有以下几种形式:

  • cv2.COLOR_BGR2GRAY:将 BGR 图像转换为灰度图像。
  • cv2.COLOR_BGR2HSV:将 BGR 图像转换为 HSV 图像。HSV 色彩空间对于颜色分割和跟踪非常有用。
  • cv2.COLOR_HSV2BGR:将 HSV 图像转换回 BGR 图像。
  • cv2.COLOR_BGR2RGB:将 BGR 图像转换为 RGB 图像。注意 OpenCV 默认读取的图像是 BGR 格式。
  • cv2.COLOR_RGB2BGR:将 RGB 图像转换回 BGR 图像。
  • cv2.COLOR_BGR2YCrCbcv2.COLOR_BGR2Labcv2.COLOR_BGR2Luv 等:将 BGR 图像转换为其他色彩空间,这些色彩空间在特定的图像处理任务中有其独特的用途。

3.#调节输出图像尺寸
resize_width = 600 # 设定新的宽度
resize_height = 600 # 设定新的高度
img_resized = cv.resize(img, (resize_width, resize_height))
img_gray_resized = cv.resize(img_gray, (resize_width, resize_height))

通过cv.resize实现对图像的尺寸调节,在其后输入(加载图像信息的变量,(设置的尺寸变量))

此时修改尺寸后的图像变量名分别为img_resized,img_gray_resized

4.# 保存灰度图像路径,若路径不存在则创建该文件夹
save_dir = './image_save'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

首先设置图片要保存的文件夹路径,调用os模块检验路径是否存在
save_path = os.path.join(save_dir, 'slpn_gray.jpg')

设置储存图片文件的名称,并拼接路径。
cv.imwrite(save_path, img_gray)

将灰度图片储存到指定的路径下。

此处是先设置好路径的名称,再储存图片,进而实现图片名称的设置,而非先设置图片的名称再进行储存

运行代码效果如下

②OpenCV读取摄像机视频图像帧代码

通过执行该代码可以打开电脑的摄像头,随后把没一帧的图片保存到image2_save的文件夹下。

import cv2
import os

# 初始化VideoCapture对象,参数0代表调用默认摄像机
cap = cv2.VideoCapture(0)

# 检查摄像机是否顺利开启
if not cap.isOpened():
    print("摄像机无法开启")
    exit()

# 指定帧的保存路径,若目录不存在,则创建该目录
frames_folder = 'image2_save'
if not os.path.exists(frames_folder):
    os.makedirs(frames_folder)

# 帧编号初始化
frame_count = 0

# 循环读取每一帧
while True:
    # 读取一帧画面
    ret, frame = cap.read()

    # 若帧读取失败,则退出循环
    if not ret:
        print("视频帧读取失败")
        break

        # 构造保存帧的文件名,包含编号以防重名
    frame_filename = os.path.join(frames_folder, f'photo_{frame_count:05d}.jpg')

    # 保存当前帧
    cv2.imwrite(frame_filename, frame)

    # 显示当前帧(可选操作)
    cv2.imshow('摄像机画面', frame)

    # 帧编号递增
    frame_count += 1

    # 等待1毫秒,若期间按下'q'键,则退出循环
    if cv2.waitKey(1) == ord('q'):
        break

# 释放VideoCapture资源
cap.release()
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

运行代码效果如下

重点代码详解与记忆

1.# 初始化VideoCapture对象,参数0代表调用默认摄像机
cap = cv2.VideoCapture(0)

摄像机用来捕获视频,英语翻译常常与汉语相反:VideoCapture

2.# 帧编号初始化
frame_count = 0

# 循环读取每一帧
while True:
    # 读取一帧画面
    ret, frame = cap.read()

    # 若帧读取失败,则退出循环
    if not ret:
        print("视频帧读取失败")
        break

ret:一个布尔值,如果成功读取帧,则为True;如果读取帧失败或已经到达视频的末尾,则为False

frame:一个NumPy数组,表示捕获到的视频帧。如果retTrue,则frame包含了有效的图像数据;如果retFalse,则frame可能是一个空数组或包含无效数据。

3 . # 构造保存帧的文件名,包含编号以防重名
    frame_filename = os.path.join(frames_folder, f'photo_{frame_count:05d}.jpg')

拼接出图像的保存路径,通过循环使frame_count的数值依次加1,避免了图片的重名,并为图片标号。

    # 保存当前帧
    cv2.imwrite(frame_filename, frame)

    # 显示当前帧(可选操作)
    cv2.imshow('摄像机画面', frame)

    # 帧编号递增
    frame_count += 1

    # 等待1毫秒,若期间按下'q'键,则退出循环
    if cv2.waitKey(1) == ord('q'):
        break

③OpenCV读取视频图像文件帧代码

通过执行该代码,可以将视频图像文件按帧读取,并把每一帧保存到指定文件夹下。

import cv2
import os

# 指定视频文件的路径
video_path = 'E:\PyCharm Community Edition 2024.1.1\image/2024-08-07 152918.mp4'
# 创建VideoCapture对象以读取视频
cap = cv2.VideoCapture(video_path)

# 检查VideoCapture对象是否成功打开视频文件
if not cap.isOpened():
    print("无法打开视频文件")
    exit()

# 定义保存帧的文件夹名称
frames_folder = 'image3_save'
# 若文件夹不存在,则创建它
if not os.path.exists(frames_folder):
    os.makedirs(frames_folder)

# 初始化帧计数器
frame_count = 0

# 循环读取视频的每一帧
while True:
    # 读取一帧
    ret, frame = cap.read()
    # 若帧读取失败,则退出循环
    if not ret:
        print("视频帧读取失败")
        break

        # 构造保存帧的文件名
    frame_filename = os.path.join(frames_folder, f'photo_{frame_count:05d}.jpg')
    # 保存帧到文件
    cv2.imwrite(frame_filename, frame)

    # 帧计数器递增
    frame_count += 1

# 释放VideoCapture对象资源
cap.release()
# 关闭所有OpenCV创建的窗口(本例中未使用imshow,但通常是个好习惯)
cv2.destroyAllWindows()

重点代码详解与记忆

该代码与OpenCV读取摄像机视频图像帧代码基本一致,只是用一个文件路径替换了其的实时录像功能。

再接下来的部分中,再整段代码中进行解释,这样更加直观,解释部分用其他颜色进行标注。

运行代码后视频帧被读取并成功保存到image3_save文件夹下

1.1.2Matplotlib读取图像文件的应用

①Matplotlib显示OpenCV读取的彩色图像,在Opencv中图像以BGR格式储存,通过Matplotlib来展示RGB格式储存的图像。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 从当前工作目录下的imagedata子目录中读入一幅彩色图像
image_path = 'E:\PyCharm Community Edition 2024.1.1\image\slpn.jpg'
img = cv.imread(image_path, cv.IMREAD_COLOR)

# 检查图像是否成功读取
if img is None:
    print(f"Error: Unable to read image at {image_path}")
else:
    # 将图像颜色通道顺序从BGR调整为RGB
    imgRGB = cv.cvtColor(img, cv.COLOR_BGR2RGB)

    # 创建一个显示窗口并显示原BGR色序图像
    plt.figure()
    plt.imshow(img)  # 注意这里我们仍然需要翻转通道以在matplotlib中正确显示
    plt.title('Color image in BGR')

    # 创建一个显示窗口并显示色序调整为RGB后的彩色图像
    plt.figure()
    plt.imshow(imgRGB)
    plt.title('Color image in RGB')

    # 显示所有图像窗口
    plt.show()

重点代码详解与记忆

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 从当前工作目录下的imagedata子目录中读入一幅彩色图像
image_path = 'E:\PyCharm Community Edition 2024.1.1\image\slpn.jpg'
img = cv.imread(image_path, cv.IMREAD_COLOR)

# 检查图像是否成功读取
if img is None:
    print(f"Error: Unable to read image at {image_path}")
else:
   
# 将图像颜色通道顺序从BGR调整为RGB
    imgRGB = cv.cvtColor(img, cv.COLOR_BGR2RGB)

    通过cvtColo将RGB形式储存的图像改为RGB形式

    # 创建一个显示窗口并显示原BGR色序图像
    plt.figure()
    plt.imshow(img)  # 注意这里我们仍然需要翻转通道以在matplotlib中正确显示
    plt.title('Color image in BGR')

    # 创建一个显示窗口并显示色序调整为RGB后的彩色图像
    plt.figure()
    plt.imshow(imgRGB)
    plt.title('Color image in RGB')

    # 显示所有图像窗口
    plt.show()

运行代码结果如下

1.1.3Scikit-image读写图像文件

彩色图像转为灰度图像,操作与opencv类似

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from skimage import io, data, color, util
from pathlib import Path  # 用于处理文件路径

# 从指定路径读入一幅彩色图像
image_path = Path('E:\PyCharm Community Edition 2024.1.1\image\slpn.jpg')
img = io.imread(image_path)

# 使用skimage中的color模块将彩色图像转换为灰度图像
img_gray = color.rgb2gray(img)

# 将灰度图像的数据类型由浮点小数[0,1]转换为uint8型[0,255]
img_gray = util.img_as_ubyte(img_gray)

# 保存灰度图像到image1_save文件夹下
save_folder = Path('image1_save')
save_folder.mkdir(parents=True, exist_ok=True)  # 如果文件夹不存在,则创建它
save_path = save_folder / 'saved_image.jpg'
io.imsave(save_path, img_gray)

重点代码详解与记忆

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from skimage import io, data, color, util
from pathlib import Path  # 用于处理文件路径

# 从指定路径读入一幅彩色图像
image_path = Path('E:\PyCharm Community Edition 2024.1.1\image\slpn.jpg')

img = io.imread(image_path)

此处直接输入图片路径即可,无需输入图片的色彩形式

# 使用skimage中的color模块将彩色图像转换为灰度图像
img_gray = color.rgb2gray(img)

# 将灰度图像的数据类型由浮点小数[0,1]转换为uint8型[0,255]
img_gray = util.img_as_ubyte(img_gray)

该操作有利于避免数据不兼容问题、提高运算速率、提高图像清晰度

# 保存灰度图像到image1_save文件夹下
save_folder = Path('image1_save')
save_folder.mkdir(parents=True, exist_ok=True)  # 如果文件夹不存在,则创建它
save_path = save_folder / 'saved_image.jpg'
io.imsave(save_path, img_gray)

运行代码,图像被成功保存

1.1.4pillow读写图像文件

①利用pillow将图像转化为灰度图像与RGB格式储存的图像

from PIL import Image
import numpy as np
import os

# 从指定路径读入一幅彩色图像
im = Image.open('E:\PyCharm Community Edition 2024.1.1\image\slpn.jpg')

# 调用Image对象成员函数将其转换为灰度图像
imgray = im.convert('L')  # 结果仍为PIL图像类

# 调用Image对象成员函数将其转换为RGB真彩色图像,结果仍为PIL图像类
imrgb = im.convert('RGB')

# 显示图像的文件格式、宽、高尺寸以及图像类型
print(im.format, im.size, im.mode)


# 指定保存目录
save_dir = 'image1_save'

# 如果保存目录不存在,则创建它
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 构建完整的保存路径
save_path = os.path.join(save_dir, 'slpn.jpg')

# 将图像保存到指定路径
imgray.save(save_path)  # 保存RGB图像到指定文件夹

重点代码详解与记忆

from PIL import Image
import numpy as np
import os

# 从指定路径读入一幅彩色图像
im = Image.open('E:\PyCharm Community Edition 2024.1.1\image\slpn.jpg')

# 调用Image对象成员函数将其转换为灰度图像
imgray = im.convert('L')  # 结果仍为PIL图像类

转为灰度图像用“L“,而非"Grey"

# 调用Image对象成员函数将其转换为RGB真彩色图像,结果仍为PIL图像类
imrgb = im.convert('RGB')

# 显示图像的文件格式、宽、高尺寸以及图像类型
print(im.format, im.size, im.mode)

# 指定保存目录
save_dir = 'image1_save'

# 如果保存目录不存在,则创建它
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 构建完整的保存路径
save_path = os.path.join(save_dir, 'slpn.jpg')

# 将图像保存到指定路径
imgray.save(save_path)  # 保存RGB图像到指定文件夹

运行后图像被成功保存

注,本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。

“本文章中所使用的圣灵谱尼图片来源于网络,版权归属原作者所有。若您认为本文章/作品的使用侵犯了您的权益,请及时与我联系,我将尽快核实并删除相关内容。

本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值