(学习笔记)计算机视觉(上)

前言

记录一下课程学习过程(主要)以及个人对课程的评价,课程链接:

  • https://edu.csdn.net/course/detail/26281

环境

  • windows10 + python3.7

另外,之前在学校上过数字图像处理的课程,并非零基础,因此过的比较快
当然,下面写的也比较粗略

第一章

在这里插入图片描述
从文件的名称可以大致地了解到第一章主要是介绍计算机视觉的相关概念。
1.1 概念(略)
1.2 环境配置
由于我自己的python版本是3.7和课程里面的不一样,因此在下载的文件方面不一样。打开anaconda 官网可以看到现在anaconda 支持的版本也是python3.7,刚开始是选择在官网下,但是网速确实一言难尽。于是想到了换个网站下,因此想到了清华的镜像源。清华镜像源的链接如下:

  • https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=A

之后按照PDF里面说的继续往下走,在装anaconda的时候有一个是可以打钩选择将其加入path的,下面是我从网上找的图,说的就是第一项,我当时是打钩了的,后面就不用去配置环境变量。当然,众说纷纭,这个勾不勾自己看着办。比如截图中的这位就说不勾。
在这里插入图片描述
之后进到安装opencv 的步骤中,这里python版本不一样因此也要选择不同的opencv版本。比如我选的版本是:

  • opencv_python-4.1.2+contrib-cp37-cp37m-win_amd64

之后按照PDF步骤走即可。在运行第一个程序的那一块,个人比较推荐下个IDE,可以是pycharm 或 vscode 。我win上面装的是vscode。vscode会比较小。

在这里插入图片描述
在这里插入图片描述
1.3 课程体系结构概念(略)
1.4 视觉系统构成要素

  • 照明设备
  • 成像设备
  • 处理设备
  • 算法软件

第二章

在这里插入图片描述
2.1 照明模型(概念)

  • 光通量
    光通量是人眼能感受到的辐射功率,等于单位时间内某一波段的辐射能量和该波段的相对视见率的乘积。
  • 辐照度
    辐照度是投射到一平表面上的辐射通量密度。指到达一平表面上,单位时间,单位面积上的辐射能量

2.2 几种常见的颜色模型(RGB,CMYK,HSI/HSV)

  • 注意各个英文字母的含义,以及HSI/HSV的区别
    在这里插入图片描述
    在这里插入图片描述

2.3 传感器基本原理,数字图像的表示方式

  • 这一块建议看看《数字图像处理》课本

2.4 实战演练(调用opencv 的相关函数)(略)

第三章

在这里插入图片描述
3.1 卷积与滤波

  • 数字图像每个像素值都是离散值因此运用离散形式的卷积公式。

在这里插入图片描述
公式看不懂问题不大,主要是要把老师后面讲的例子理解。卷积在后面会经常用到,深度学习的CNN的意思就是卷积神经网络。

  • PDF里面的例子5x5的矩阵最后得到的结果是3x3的。注意观察可以发现其原因是未对边缘部分进行处理,一般情况下都是不对图像边缘进行处理的,若是要考虑图像边缘,则需要对图形进行边缘填充,常见的有在边缘进行补0,其余的有兴趣的可以搜下图像的padding。

3.2 平滑滤波

  • 本质其实还是卷积。用某些算子进行卷积可以得到平滑,用某些算子进行卷积可以得到锐化。核心还是要理解卷积。
  • 算子其实也就是滤波器,注意区分各种算子
  • 均值滤波,中值滤波(有效去除椒盐噪声),高斯滤波(实际用的比较多,前面两个考的比较多),双边滤波(少见)
  • 中值滤波取的窗口里面的元素个数为奇数,将其从小到大排列(反过来也行,一般从小到大),取其中位数作为当前的值

3.3 数学形态学滤波

  • 这里关于腐蚀膨胀的部分后面再写博客阐述,因为视频里讲的和我以前学的有点出入
  • 开运算:先腐蚀后膨胀(可以消除细小噪声)
  • 闭运算:先膨胀后腐蚀

3.4 实战演练(opencv相关的滤波函数)(略)

第四章

在这里插入图片描述
4.1 边缘检测基本思想和基本的边缘检测算子

  • 边缘处梯度较大,因此可以求梯度然后对其进行筛选得到边缘信息(后面可能还会根据这些边缘信息进行一些锐化操作)。在数字图像处理的过程中一般会用差分来代替梯度原来的计算公式。
  • 正如前面讲的,在这一块的计算过程有点类似于卷积。
  • 记住常见的算子

在这里插入图片描述

  • sobel最常用
    在这里插入图片描述
    在这里插入图片描述
  • laplace of gaussian
    在这里插入图片描述

4.2 canny算子

  • 优点:边缘可以自动连接,检测准确、对噪声稳健,故应用广泛
  • 基本步骤
平滑图像
计算梯度(幅值和方向)
梯度幅值进行非极大值抑制(只保留幅值局部变化最大的点)
自动边缘连接

在这里插入图片描述

  • 通过查看弱边缘像素及其8个领域像素,只要其中一个为强边缘像素,则该弱边缘点就可以保留为真实的边缘。

4.3 数学形态学变换扩展(黑帽、顶帽、HMT、梯度)

  • 边缘梯度gradient:灰度膨胀图像和腐蚀图像的差值
  • 顶帽变换tophat:图像与其开运算的差值
  • 黑帽变换blackhat:图像闭运算与自身的差值
顶帽和黑帽的结合使用能用于增强对比度
做法:将img + 顶帽变换 -黑帽变换
	enhanced=img+tophat-bottomhat
  • 击中或击不中变换HMT:输出图像由所有在B1 中匹配的像素(击中)和未在B2中匹配的像素(击不中)组成

4.4 实战演练

  • 代码1
# 图像边缘检测
import cv2

img=cv2.imread("lena.png")
cv2.imshow("lena.png",img)
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# sobel 边缘检测算子
# dx dy参数是sobel 的x y 方向的选择
sobel=cv2.Sobel(img,cv2.CV_16S,1,0,ksize=3)
#laplacian
laplacian=cv2.Laplacian(img,cv2.CV_16S)
#canny
canny=cv2.Canny(img,50,120)

# 如果没有以下两行代码,sobel,laplacian没有显示
# 原因在于imshow显示8位uint,而sobel,laplcian 每个像素对应的是16位的int
sobel=cv2.convertScaleAbs(sobel)
laplacian=cv2.convertScaleAbs(laplacian)

cv2.imshow("sobel",sobel)
cv2.imshow("laplacian",laplacian)
cv2.imshow("canny",canny)

cv2.waitKey()
cv2.destroyAllWindows()
  • 代码2
# 形态学滤波
import cv2
import numpy as np

def gause_noise(image,mean=0,var=0.001):
    image=np.array(image/255,dtype=float)
    noise=np.random.normal(mean,var**0.5,image.shape)
    out=image+noise
    if out.min() < 0:
        low_clip = -1
    else:
        low_clip = 0

    out = np.clip(out,low_clip,1.0)
    out = np.uint8(out*255)
    return out

# 以灰度图形式打开lena图
img=cv2.imread("lena.png",0)
nimg=gause_noise(img)

# 生成形态学的结构化元素,形状十字形,大小3x3
kernel =cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
eroded =cv2.erode(img,kernel)#腐蚀
dilated =cv2.dilate(img,kernel)#膨胀

#开运算
opened = cv2.morphologyEx(nimg,cv2.MORPH_OPEN,kernel)
#在开运算的基础上再进行闭运算
closed= cv2.morphologyEx(opened,cv2.MORPH_CLOSE,kernel)


# cv2.imshow("noise img",nimg)
# cv2.imshow("erode",eroded)
# cv2.imshow("dilate",dilated)
# cv2.imshow("opened",opened)
# cv2.imshow("closed",closed)

gradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow("gradient",gradient)

# 顶帽黑帽变换
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
bottomhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow("tophat",tophat)
cv2.imshow("bottomhat",bottomhat)

enhanced=img+tophat-bottomhat
cv2.imshow("enhanced",enhanced)

# 击中,击不中变换结果
kernel1=np.array(([0,1,0],[1,-1,1],[0,1,0]),dtype='int')
hmt=cv2.morphologyEx(img,cv2.MORPH_HITMISS,kernel1)
cv2.imshow("hmt",hmt)

cv2.waitKey()
cv2.destroyAllWindows()

第五章之后的待续

发布了28 篇原创文章 · 获赞 12 · 访问量 4136

猜你喜欢

转载自blog.csdn.net/sf9898/article/details/104215801