资讯详情

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

前言

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

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

环境

  • windows10 python3.7

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

第一章

在这里插入图片描述 从文件名称可以大致了解到,第一章主要介绍计算机视觉的相关概念。 因为我自己的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会比较小。

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

第二章

  • 光通量 人眼能感受到的光通量,等于内某波段和该波段的的乘积。
  • 辐照度 辐照度投射在平面上。指到达一平,上的

  • 注意每个英文字母的含义,以及HSI/HSV的区别

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

  • 建议阅读数字图像处理教科书

第三章

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

不懂公式不是什么大问题,主要是理解老师后面讲的例子。卷积经常用在后面,深入学习CNN意思是卷积神经网络。

  • PDF里面的例子5x5矩阵的最终结果是3x3.注意观察,可以发现其原因是边缘部分没有处理。一般来说,图像边缘没有处理。如果要考虑图像边缘,则需要填充图形边缘。常见的是在边缘补充0。其余感兴趣的人可以搜索图像padding。

  • 以下是关于腐蚀膨胀部分的博客描述,因为视频与我以前学到的有点不同
  • 开操作:先腐蚀后膨胀(可消除小噪音)
  • 关闭操作:先膨胀后腐蚀

第四章

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

  • sobel最常用
  • laplace of gaussian

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

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

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

  • 代码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()

第五章之后的待续

标签: 传感器hmt360

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台