写在前面:
这是我第一次进行python环境下的人工智能项目,采用OpenCV结合一些基础函数进行一些基础的图像处理。整个过程中我给了代码丰富的注释,希望能帮助到这方面,尤其是代码方面的初学者,我认为阅读注释和思考代码并产出自己的一些代码有助于任何一种编程语言的学习。
此外,我认为这项实验中比较有趣的并且我尝试解决的点是中文路径的读取和同一变化效果的不同实现,如果有需要的小伙伴和学习者可以尝试我的实验报告中提到的方式。
共勉!
一、实验目的及要求
1.实验目的
巩固图像处理基础;
了解OpenCV中用于图像处理的部分函数及其用法;
了解Python语法。
2.实验要求
使用OpenCV实现对一张图片的读取,并且在命令行窗口中输出其尺寸和数据类型;
使用for循环的方式,一次性读取指定路径下的多张图片,之后输出所有图片的平均像素值和像素值标准差;
理解二维图像自然缩放的原理,并且将一副未知大小的图像缩放到指定大小(区别于比例尺放缩);
分析给出的示例图像变换,选择合适的方式复现该变换。
二、实验方法步骤
1.图片读取与基本信息获取
解OpenCV中用于读取图像的函数(imread, imdecode等);
基于调试选择imdecode以解决中文路径对读取进程的影响,并且配套调整图像读取方式;
获取图像基本信息(shape, dtype等)。
2.多张图片的读取与信息获取、处理
·吸取第一次实验的教训,选择的目标文件夹路径为全英文;
·for循环的设计,基于不同文件名对文件夹内容进行遍历;
·遍历过程中使用链表存储像素值,遍历结束后将链表通过numpy中的函数实现转化为数组,并进行后续计算。
3.二维自然图像的放缩
·了解放缩函数resize的用法,包括了“放缩到指定尺寸”和“放缩到指定比例”两种放缩方式;
·resize函数不涉及图像通道数的改变,可以尝试其他放缩方式,观察其对图像通道数的影响。
4.示例图像变换的分析与复现
·分析图像变换,初步认为包括以下步骤:切分、部分变换、重组;
·理解和运用图像的切分,即将原图像的矩阵进行提取;
·部分变换的方式,认为可以通过中心对称或者直接旋转180°来实现;
·图像的重组,可以理解为矩阵的堆叠,了解vstack和hstack两中国堆叠函数的使用
三、实验代码
1.图片读取与基本信息获取
1)单独实现版本
import cv2
import numpy as np
# 使用cv2.imread()函数读取图片,图片路径根据你的实际路径来填写
# 确保图片路径正确,否则img变量将会是None
# 由于这里我的图片路径包含中文,所以不能直接使用imread读取
# 使用 cv2.imdecode() 和 numpy 可以解决问题,这通常是因为你通过 numpy.fromfile() 读取了文件的原始字节数据
# 并且这个过程中可能间接地处理了文件路径的编码问题
# 但更可能的原因是,当你使用 numpy.fromfile() 读取文件时,你实际上绕过了任何可能由 cv2.imread() 触发的路径解析或文件系统调用问题。
# 然而,这并不是 cv2.imdecode() 的功劳,而是因为你将文件内容作为字节流读取到内存中,并随后使用 cv2.imdecode() 来解码这些字节。
# 但是,请注意,numpy.fromfile() 并不适合直接用于读取图片文件,因为它只是简单地按字节读取文件,而不会考虑图片文件的格式或结构。
# 因此,你应该确保在调用 cv2.imdecode() 之前,文件内容确实是有效的图片数据,并且是以适当的格式存储的。
imgPATH ="D:\\file\\College\\大三\\第一学期\\人工智能理论与实践\\作业\\Week1\\作业要求与素材\\作业素材\\WhiteDog.jpg"
img = cv2.imdecode(np.fromfile(imgPATH, dtype=np.uint8), cv2.IMREAD_COLOR)
# 检查图片是否成功读取
if img is not None:
# 展示图片
cv2.imshow('Image', img)
# 输出图片尺寸
print("图片尺寸:", img.shape) # shape将返回一个元组:(高度, 宽度, 通道数)
# 输出数据类型
print("数据类型:", img.dtype) # 这将显示numpy.uint8或其他数据类型
# 指定目标尺寸(宽度和高度)
target_width = 512
target_height = 512
# 使用cv2.resize函数进行缩放,直接指定目标尺寸
resized_img = cv2.resize(img, (target_width, target_height), interpolation=cv2.INTER_LINEAR)
# 显示或保存缩放后的图像
cv2.imshow('Resized Image', re