一、实验目的

 编程环境配置:在Python编程环境下,安装常见图像处理库(OpenCV)
 了解图像不同的文件存储格式;
 理解并掌握数字图像的基本操作;
 熟练掌握查看图像信息,图像灰度化的方法;
 熟练掌握帧差法的使用

二、实验内容

car.jpg
car.jpg
park01.jpg
在这里插入图片描述
park02.jpg
在这里插入图片描述

  1. 编程环境配置:在Python编程环境下,安装图像处理库(OpenCV)模块。
  2. 在计算机的图画软件中创建一幅图像,分别存储为BMP、GIF、JPEG和TIFF格式的图像文件,并显示其大小。
  3. 实现对内容2中图像文件的读取,获取并显示图像的尺寸信息。
  4. 对图像car.jpg做基本操作,包括图像的读取、显示、保存、处理感兴趣区域。
    (1) 图像读取和显示;
    (2) 彩色图像转换为灰度图像,显示后,将其保存为car_re.jpg文件;
    (3) 显示车牌感兴趣区域子图;选取车牌区域坐标(x1,y1,x2,y2)=(450,470,540,495)
    (4) 在原图中用红色矩形框标记出车牌区域。
  5. 使用帧差法对两幅图像park01和park02进行操作,检测停车位是否被占用。
    (1) 对图像进行读取,查看图像的宽、高、通道等属性信息。
    (2) 将其转成灰度图,显示灰度图像。
    (3) 采用最简单的图像减法(帧差法)获得差值图像,并对其进行二值化操作,判断停车位是否被占用检测。

三、完整实验程序、结果与分析

  1. 代码: 实现图像文件的读取;
    在这里插入图片描述

  2. 对图像car.jpg做基本操作,包括图像的读取、显示、保存、处理感兴趣区域。
    在这里插入图片描述

  3. 使用帧差法对两幅图像park01和park02进行操作,检测停车位是否被占用。
    在这里插入图片描述

输出显示:
1.
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、本次作业实验结果分析及心得

实验结果分析:
通过保存BMP、GIF、JPEG、TIFF四种格式的图像发现,BMP文件体积最大(无压缩),JPEG体积最小(有损压缩),GIF和TIFF体积居中。这表明不同压缩算法对存储效率的影响显著。需要注意的是,OpenCV在读取GIF时可能仅加载第一帧,这反映了其对动态GIF支持的局限性。
在车牌提取实验中,通过手动设定坐标截取感兴趣区域(ROI),成功提取了车牌子图。但实际操作中发现,若坐标误差超过车牌边界,会导致截取失败或包含冗余背景。此外,绘制红色矩形框时需注意BGR色彩通道顺序(红色对应(0, 0, 255)),否则颜色显示异常。
对park01和park02进行灰度转换后,通过绝对差值计算和二值化处理,有效提取了两幅图像的差异区域。实验中发现,若两图光照条件不一致或存在微小抖动,差值图像会产生噪声,需通过调整阈值(如从30增至50)或形态学操作(如开闭运算)优化。最终通过统计非零像素数量判断停车位状态,验证了帧差法在静态场景中的可行性。
心得:
掌握了OpenCV的基本操作,包括图像读写、格式转换、ROI提取及图形标注。
理解了图像压缩格式的特性,如JPEG适合存储自然图像,而BMP适合保留原始数据。
实践了帧差法的核心思想,认识到其在运动检测中的简单高效,但也存在对光照敏感的局限性。
本次实验不仅巩固了理论知识,更让我体会到“调参”和“问题定位”在工程实践中的重要性。未来将深入探索图像处理与深度学习的融合应用,以解决更复杂的实际问题。

完整代码

import cv2
import os
#读取图像
image01 = cv2.imread("D:/tuxiang/park01.jpg")
shape = image01.shape
height = shape[0]
width = shape[1]
print('图像尺寸: {},高: {},宽: {},'.format(shape, height, width))


"""
4.	对图像car.jpg做基本操作,包括图像的读取、显示、保存、处理感兴趣区域。
(1)	图像读取和显示;
(2)	彩色图像转换为灰度图像,显示后,将其保存为car_re.jpg文件;
(3)	显示车牌感兴趣区域子图;选取车牌区域坐标(x1,y1,x2,y2)=(450,470,540,495)
(4)	在原图中用红色矩形框标记出车牌区域。

"""

# 读取和显示图像
img = cv2.imread("D:/tuxiang/car.jpg")
cv2.imshow('Original', img)
cv2.waitKey(0)

# 转换为灰度并保存
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray', gray)
cv2.waitKey(0)
cv2.imwrite('car_re.jpg', gray)

# 提取车牌区域并显示
x1, y1, x2, y2 = 450, 470, 540, 495
roi = img[y1:y2, x1:x2]
cv2.imshow('License Plate ROI', roi)
cv2.waitKey(0)

# 在原图标记车牌区域
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow('Marked', img)
cv2.waitKey(0)
cv2.destroyAllWindows()


"""
5.	使用帧差法对两幅图像park01和park02进行操作,检测停车位是否被占用。
(1)	对图像进行读取,查看图像的宽、高、通道等属性信息。
(2)	将其转成灰度图,显示灰度图像。
(3)	采用最简单的图像减法(帧差法)获得差值图像,并对其进行二值化操作,判断停车位是否被占用检测。

"""

# 读取图像
img1 = cv2.imread("D:/tuxiang/park01.jpg")
img2 = cv2.imread("D:/tuxiang/park02.jpg")

# 检查尺寸是否一致
if img1.shape != img2.shape:
    img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))

# 转换为灰度图
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 计算差值并二值化
diff = cv2.absdiff(gray1, gray2)
_, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

# 检测白色像素数量
pixel_count = cv2.countNonZero(thresh)
threshold = 1000  # 根据实际情况调整

# 判断停车位状态
if pixel_count > threshold:
    print("停车位被占用")
else:
    print("停车位空闲")

# 显示结果
cv2.imshow('Difference', diff)
cv2.imshow('Thresholded', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐