图像数据处理1

逸缘 2024-08-19 16:01:02 阅读 70

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

1.1图像文件的读写与显示

1.1.1OpenCV读写与显示图像文件

①彩色图像转为灰度图像

<code>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的文件夹下。

<code>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

<code>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格式储存的图像。

<code>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类似

<code>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格式储存的图像

<code>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图像到指定文件夹

运行后图像被成功保存

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

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

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。