Python 图像 一样大小_哈工大图像工程学大作业

09247386709e23b05b8e6bc4992ab550.png

小学期选了一门图像处理相关的课程,还没来的及好好听课就上完了(当时在复习考试),作业算是把之前在C++里面写的东西在python里面又学了一遍,难度不是很大,后面感觉有点体力劳动。

有趣的一点是,这篇文章全部都是我在jupyter里面写的,之后一键导出md文件,在导入到知乎就不用再复制排版了,比较方便。

import cv2 as cv
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import copy

实验一、图像处理入门

实验目的:使用 Python + OpenCV,了解图像的基本显示方式,熟悉开发环境。
实验要求:
(1) 在开发环境下,显示 Lena 图像;
(2) 修改目录及文件名,显示磁盘中的指定图像;
(3) 将原有图像宽、高各缩小 1/2,显示原始图像及缩小后图像;
(4) 将原有图像转为灰度图像,任意指定 3 个位置,显示对应像素灰度值(在字符窗口中)。

关键算法:

  1. cv.imread() 读取图片
  2. cv.imshow() 显示图片
  3. cv.nameWindow() 创建窗口
  4. cv.cvtColor() 颜色空间转换
  5. cv.waitKey() 等待按键
  6. cv.destroyAllWindows() 关闭所有窗口
  7. cv.resize()改变图片大小

结果分析:

  1. 成功显示Lena图像
  2. 成功读取磁盘中指定图像
  3. 使用cv.resize()成功改变图片大小,为了直观起见,我是用pyplot进行图片绘制,横纵坐标为像素大小
  4. 使用cv.cvtColor()将图片转换为灰度图,并指定了(200,800), (500,500), (800,200)处显示其灰度值,其灰度值大小分别为216, 63, 75

运行结果:

lena 

5313603ba4b8ec2b49748eb244a69e29.png
season 

1ff6df202389ccf04e8be1200c822739.png
season_re 

c3319fb056206ce0e5ce10c626cb0439.png
season 

3950fe6c8c780cf91eb70ba4e55f0ddc.png

实验二、颜色空间变换

实验目的:使用 Python + OpenCV,完成不同颜色空间变换,熟悉颜色空间的基本概念,对各通道结果进行分析。
实验要求:
(1) 在开发环境下,自行选择有代表性的图像(给出的season与课程PPT中相同,可用于参照测试);
(2) 显示对应的 B、G、R 通道;
(3) 将原有图像转化为 HSV 空间表达,并显示对应分量;
(4) 分别对 RGB 和 HSV 分量显示图像进行分析;
(5) (可选)使用 matplotlib 的 pyplot, 并应用 plot 函数显示图像,看是否能正常显示。进一步使用该函数将图像分成2*4个子窗口,分别在不同子窗口中显示原始图像及不同分量

关键算法:

  1. cv.cvtColor() 颜色空间转换

结果分析:

  1. 成功显示season图像的BGR通道
  2. 成功将season图像转换为HSV通道,并显示其分量
  3. RGB是我们最常见的颜色模型,三个数值代表R、G、B分量,取值均为[0,255]。HSV用来描述颜色相对于RGB等模型显得更加自然。其中H表示色相(Hue)。通常该值取值范围是[0,360],对应红橙黄绿青蓝紫红这样顺序的颜色,构成一个首尾相接的色相环。色相的物理意义就是光的波长,不同波长的光呈现了不同的色相。S都表示饱和度(Saturation)(有时也称为色度、彩度)即色彩的纯净程度。V表示明度(Value/Brightness)。
  4. matplotlib中的pyplot并不能直接显示opencv导入的图像,这是因为opencv采用的是BGR通道,matplotlib采用的是RGB通道,如果需要正常显示,只需要将opencv导入的图像中的R和B通道交换位置。

运行结果:

season 

064ba7a9da5d6cc98665210494b9895b.png
season 

0f575dc005f7d71ebd281937815f68f1.png
season 

a4fedaca0c258898f460ea4ef3b62cdf.png

3260602eb31da2f14cb07e99690a766d.png

实验三、图像去噪与边缘检测

实验目的:使用 Python + OpenCV,完成图像平滑去噪以及边缘检测,熟悉各类滤波器及 Canny 算子的使用,并对结果进行比较分析。
实验要求:
(1) 在开发环境下,对给定图像使用平均滤波、高斯滤波、中值滤波和双边滤波进行平滑去噪;
(2) 观察平滑去噪结果,并进行比较分析;
(3) 在开发环境下,对给定图像使用 Sobel 算子、Laplace 算子和 Canny 算子进行边缘检测;
(4) 观察不同方法结果(包括 Canny 算子使用不同参数的结果),并进行比较分析;
(5) (可选)计算执行每个方法需要的时间,并进行对比分析。注:实验图像包括:orange, pic2, right03, starry_night

关键算法:

  1. cv.blur() 均值滤波
  2. cv.medianBlur() 中值滤波
  3. cv.bilateralFilter() 双边滤波
  4. cv.GaussianBlur() 高斯滤波

结果分析:

  1. 成功对给定图像使用平均滤波、高斯滤波、中值滤波和双边滤波进行平滑去噪
  2. 根据滤波结果,我们可以分析出以下结论
  • 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素,再用模板中的全体像素的平均值来代替原来像素值。
  • 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
  • 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
  • 双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波的好处是可以做边缘保存,一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。
  1. 成功对给定图像使用 Sobel 算子、Laplace 算子和 Canny 算子进行边缘检测
  2. 根据观察不同边缘检测方法的结果,我们可以得到以下结论
  • Sobel算子是一种离散的微分算子,该算子结合了高斯平滑和微分求导运算。该算子利用局部差分寻找边缘,计算所得的是一个梯度的近似值
  • Laplacian算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化的要求。通常情况下,其算子的系数之和需要为零。
  • Canny算法具有良好的边缘检测效果,一般有以下四个步骤:
  1. 去噪
  2. 计算梯度幅值与方向
  3. 非极大值抑制
  4. 确定边缘
  • 当Canny算法设置不同的阈值时,会有不同的效果,第一个阈值时低阈值,当边缘像素低于其时,抑制当前边缘像素。第二个阈值为高阈值,当边缘像素高于高阈值时,将其标记为强边缘。当边缘像素处于两者之间时,将该边缘视为虚边缘,视情况保留。
使用%time魔法函数测量语句执行时间,我们可以得到以下结论
  • 均值滤波、中值滤波以及高斯滤波所用的时间远小于双边滤波所用的时间
  • Canny效果良好,且速度较快

运行结果:

star 

80b6c609253490aace1638555503c06f.png
fig 

065a910c2ad25e9c212d8bdb265436eb.png
fig 

9dc5155c7336aa4e7aa2c8fb677fc93f.png
fig 

26468e3ff344a0197dc674fe652f793c.png
#只能处理灰度图,重新读取灰度图

b0703c5098633b90a94df73d3287da30.png
fig 

a54098c16adc3fcdd3577585db365cde.png
fig 

6bf1788de9407094b2c67ca0daaedd25.png
fig 

73a7549067dbd64dd47ee21a8a86dcf0.png
fig 

6f0c0f8eff46b89b31c05fe791e4790f.png
fig 

6f94b760f7063ba1eba7b5b57d8db594.png
fig 

a1f34d199865d91e3d731a41fdfa8636.png
fig 

3c762434a244561bf18e8a19399bc556.png

实验四、直方图与图像分割

实验目的:使用 Python + OpenCV,完成原始米粒图像的灰度直方图变换与显示, 进一步对米粒图像进行分割,显示分割以后的结果,同时计算米粒的直径(最小包围矩形队形的长边)的方差与落在 2.5σ范围内的米粒数量,并对结果进行分析。
实验要求:
(1) 在开发环境下,显示米粒图像的灰度直方图;
(2) 使用大津或其它方法进行阈值分割,得到分割后的二值化结果;
(3) 对结果应用 findContours 函数,得到所有米粒对应的轮廓;
(4) 画出每一米粒对应的最小包围矩形,进一步计算方差并进行统计;
(5) 对分割及统计结果进行分析。

关键算法:

  1. cv.threshold() 阈值分割,二值化
  2. cv.findContours() 轮廓提取,返回值为轮廓本身和其对应属性
  3. cv.morphologyEx() 进行开运算等图形学操作
  4. cv.rectangle() 绘制矩形
  5. cv.putText() 添加文本

结果分析:

  1. 成功显示米粒图像的灰度直方图
  2. 使用大津法进行阈值分割,得到的阈值是129
  3. 成功得到米粒轮廓,结果有些不准确,因为过近可能将两粒米识别成一个。若继续处理可考虑从面积异常或者纵横比入手。
  4. 成功画出每一米粒对应的最小包围矩形,进一步计算方差为35.67
  5. 落在 2.5σ范围内的米粒数量为30个

运行结果:

rice_gray 

b09a02f6ccb9d3ff85d340af142f91c6.png
#大津算法分割

1bef93f4b854a277ec4f685e6ae877c5.png
# 尝试使用canny的图片寻找轮廓

9bee7c4ad5ded542bdaeb377f5a38b6a.png
#先对图像进行锐化操作,再二值化,最后提取边缘

1d3b26303adb7865d6761b7c08fc8315.png
#统计方差时,采用老师给例程的分割方法

实验五(综合实验)、目标检测与跟踪

实验简述:跟踪是视觉感知的核心任务之一,在安防、监控等领域具有广泛应 。应用 Python 及 OpenCV 提供的相关功能,实现一个可以对输入视频中运动 目标进行检测、跟踪的系统。
实验需求:
(1) 系统输入:给定视频(含有相关目标); 系统输出:检测的目标框及目标运动轨迹;
(2) 首先在“viplane”视频上进行实验;进一步在“Cap02t3”、“999”和 “video1”视频上进行实验。
提示:
(1) 运动目标检测可利用 OpenCV 提供的背景提取算法;
(2) 运动目标跟踪可利用 OpenCV 提供的多目标跟踪方法,如 KCF 等;
(3) (可选)为得到更好效果,可尝试利用深度学习进行目标检测;
(4) (可选)为得到更好的多目标跟踪效果,可尝试利用 SORT、DEEPSORT 等方法。

关键算法:

  1. cv.VideoCapture()打开视频
  2. cv.createBackgroundSubtractorMOG2(),初始化高斯背景建模法用于背景分离
  3. Yolov4的Tensorflow实现

结果分析:

  1. 成功使用opencv自带的高斯背景建模法完成运动物体的识别与检测
  2. 成功使用Yolov4的Tensorflow实现完成运动物体的跟踪与检测

运行结果:

videoFileName 

0f386e336553118a070add7c5999042b.png
videoFileName 

72567696135865eb58776fea520c8307.png
videoFileName 

ff2546e9620fe4e3c2a4d0ee0f9f1a4f.png
videoFileName 

bd6cb1e6fd9eee6a9a731820070396b9.png

使用最新的Yolov4对视频进行分析
因为jupyter中不能显示视频,截取部分视频中的部分图片进行效果展示

cap 

a0addf16899f2d3c42b121295608b929.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值