记录一下课程学习过程(主要)以及个人对课程的评价,课程链接:
环境
另外,之前在学校上过数字图像处理的课程,并非零基础,因此过的比较快
当然,下面写的也比较粗略
从文件的名称可以大致地了解到第一章主要是介绍计算机视觉的相关概念。
1.1 概念(略)
1.2 环境配置
由于我自己的python版本是3.7和课程里面的不一样,因此在下载的文件方面不一样。打开anaconda 官网可以看到现在anaconda 支持的版本也是python3.7,刚开始是选择在官网下,但是网速确实一言难尽。于是想到了换个网站下,因此想到了清华的镜像源。清华镜像源的链接如下:
之后按照PDF里面说的继续往下走,在装anaconda的时候有一个是可以打钩选择将其加入path的,下面是我从网上找的图,说的就是第一项,我当时是打钩了的,后面就不用去配置环境变量。当然,众说纷纭,这个勾不勾自己看着办。比如截图中的这位就说不勾。
之后进到安装opencv 的步骤中,这里python版本不一样因此也要选择不同的opencv版本。比如我选的版本是:
之后按照PDF步骤走即可。在运行第一个程序的那一块,个人比较推荐下个IDE,可以是pycharm 或 vscode 。我win上面装的是vscode。vscode会比较小。
2.2 几种常见的颜色模型(RGB,CMYK,HSI/HSV)
2.3 传感器基本原理,数字图像的表示方式
2.4 实战演练(调用opencv 的相关函数)(略)
公式看不懂问题不大,主要是要把老师后面讲的例子理解。卷积在后面会经常用到,深度学习的CNN的意思就是卷积神经网络。
3.2 平滑滤波
3.3 数学形态学滤波
3.4 实战演练(opencv相关的滤波函数)(略)
4.2 canny算子
平滑图像
计算梯度(幅值和方向)
梯度幅值进行非极大值抑制(只保留幅值局部变化最大的点)
自动边缘连接
4.3 数学形态学变换扩展(黑帽、顶帽、HMT、梯度)
顶帽和黑帽的结合使用能用于增强对比度
做法:将img + 顶帽变换 -黑帽变换
enhanced=img+tophat-bottomhat
4.4 实战演练
# 图像边缘检测
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()
# 形态学滤波
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()