图像数据处理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_BGR2YCrCb
、cv2.COLOR_BGR2Lab
、cv2.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数组,表示捕获到的视频帧。如果ret
为True
,则frame
包含了有效的图像数据;如果ret
为False
,则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图像到指定文件夹
运行后图像被成功保存
注,本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。
“本文章中所使用的圣灵谱尼图片来源于网络,版权归属原作者所有。若您认为本文章/作品的使用侵犯了您的权益,请及时与我联系,我将尽快核实并删除相关内容。
本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。