2月13日 CV导论+数字图像处理与opencv实践+边缘检测

为课程的笔记
课程地址:http://www.auto-mooc.com/chapter/study?class_id=337397AAE545AB50326C9F8A9AC8AD7D&item_id=B3BD74301BCF3D94380E0E2743912E45

资料库:待更新

导论:

第一部分介绍计算机视觉与自动驾驶,
第二部分介绍图像处理与视觉基础,
第三部分介绍车道线检测与识别,
第四部分介绍基于深度学习的车道线检测。

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

基本概念

模式识别 机器学习 计算机视觉 深度学习
通过计算机用数学技术方法来研究模式的自动处理和判读。 是模式识别的方法。 机器学习的应用场景/应用领域 一种机器学习的途径和方法(分支)

传统模式识别的基本框架:从低维感知,预处理,到特征提取和特征选择,最后到预测与感知识别。

CV 发展

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

2.0 正常场景中的:车道线检测与寻迹

车道线检测系统通过运用数字图像处理及模式识别技术,在道路图像中有效提取车道线的信息并拟合车道线,帮助自动驾驶过程中的道路线识别与纠偏。

在这里插入图片描述
在这里插入图片描述
不包括以下场景:例如高反差的
在这里插入图片描述

目标结果:
在这里插入图片描述

2.2 数字图像处理

灰度值:范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
在这里插入图片描述

基本步骤
在这里插入图片描述

本章节基本内容:
在这里插入图片描述

在这里插入图片描述
图片两种类型:
在这里插入图片描述

计算机-位图的表示方法:

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

数字图像处理的基本概念

什么是图像?

定义为二维函数f(x,y),其中,x,y是空间坐标,f(x,y)是点(x,y)的幅值。

灰度图像是一个二维灰度(或亮度)函数f(x,y)。

彩色图像由三个(如RGB,HSV)二维灰度(或亮度)函数f(x,y)组成。

什么是数字图像?

  1. 像素组成的二维排列,可以用矩阵表示。

  2. 对于单色(灰度)图像而言,每个像素的亮度用一个数值来表示,通常数值范围在0到255之间,0表示黑、255表示白,其它值表示处于黑白之间的灰度。

  3. 彩色图像可以用红、绿、蓝三元组的二维矩阵来表示。

通常,三元组的每个数值也是在0到255之间,0表示相应的基色在该像素中没有,而255则代表相应的基色在该像素中取得最大值。

数字图像的像素表示:

什么是像素?

数字图像由二维的元素组成,每一个元素具有一个特定的位置(x,y)和幅值f(x,y),这些元素就称为像素。

图像的取样和量化

大多数传感器的输出是连续电压波形,为了产生一幅数字图像,需要把连续的感知数据转化为数字形式。这包括两种处理:取样和量化。

取样:图像空间坐标的数字化

量化:图像函数值(灰度值)的数字化

图像采样

空间坐标(x,y)的数字化被称为图像采样,确定水平和垂直方向上的像素个数N、M。

图像的量化

函数取值的数字化被称为图像的量化,如量化到256个灰度级。

图像的采样和量化

非统一的图像的采样

在灰度级变化尖锐的区域,用细腻的采样,在灰度级比较平滑的区域,用粗糙的采样。

非统一的图像的量化

在边界附近使用较少的灰度级。剩余的灰度级可用于灰度级变化比较平滑的区域,避免或减少由于量化的太粗糙,在灰度级变化比较平滑的区域出现假轮廓的现象。

数字图像的表示

二维离散亮度函——f(x,y)

x,y说明图像像素的空间坐标,函数值f 代表了在点(x,y)处像素的灰度值

二维矩阵——A[m,n]

m , n说明图像的宽和高。矩阵元素a(i,j)的值,表示图像在第i行,第j 列的像素的灰度值;i,j表示几何位置

安装软件

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

采用notepad++ 然后运行bat尝试,做自建集成开发环境

2.2 Opencv操作

读取图片:

import cv2

image = cv2.imread('E:\\linedetect\\Python baby.jpg') 
#print image.size.width
#print image.size.height
h,w = image.shape[:2]
print(h,w)

cv2.namedWindow("Image") 
cv2.imshow("Image", image) 
cv2.waitKey(0) 

cv2.destroyAllWindows() 

在这里插入图片描述

视频读取

import cv2  

cap = cv2.VideoCapture('E:\\linedetect\\input-video_3.mp4')

ret = True  

#while(cap.isOpened()):  
while(ret):  
    ret,frame = cap.read()  
    if ret == True:
        cv2.imshow('image', frame)  
    k = cv2.waitKey(20)  
    #q键退出
    if (k & 0xff == ord('q')):  
        cap.release()  
        cv2.destroyAllWindows()
        break  
    
cap.release()  
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

画图

import cv2 
import numpy as np 
# Create a black image 
#img = np.zeros((512,512,3), np.uint8)
img=cv2.imread('E:\\linedetect\\test1.png')

 # Draw a diagonal blue line with thickness of 5 px
img = cv2.line(img,(0,0),(511,511),(0,0,255),5)

cv2.namedWindow('Image')
cv2.imshow('Image', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
img = np.zeros((512,512,3), np.uint8) 语句中(512,512,3)分别指像素高,像素宽,3种RGB颜色
在这里插入图片描述

在这里插入图片描述

灰度化的几种方法

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


import cv2 
import numpy as np

image = cv2.imread('E:\\linedetect\\test1.png')
sp = image.shape
height = sp[0]
width = sp[1]
#在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值。
new = np.zeros((height,width,3), np.uint8)
for i in range(height): 
	for j in range(width): 
		new[i,j] = 0.3 * image[i,j][0] + 0.59 * image[i,j][1] + 0.11 * image[i,j][2] 

cv2.namedWindow('Image')
cv2.imshow('Image', new)

cv2.imwrite("E:\\linedetect\\test1-gray.jpg", new)

cv2.waitKey(0)
cv2.destroyAllWindows()

二值化

在这里插入图片描述

3.0 车道检测

在这里插入图片描述

数据集

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

距离处理:

在这里插入图片描述

平滑处理

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

高斯滤波是一种低通滤波,去除高频部分。

在这里插入图片描述

在这里插入图片描述
通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

Canny边缘检测

Canny边缘检测是基于求梯度变化最大值的方法来实现边缘检测,其基本原理就是对图像中各个点求梯度,梯度最大的地方就是边缘。

注意:利用CNN的卷积核也可做边缘检测

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

Canny最优准则:

在这里插入图片描述

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

再Opencv上实现canny边缘检测
在这里插入图片描述

思考:Canny算子的取值方法??

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

思考:ROI区域的确定??

在这里插入图片描述
按位操作-bitwise operations:利用掩膜(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除,其余按位操作原理类似只是效果不同而已。

cv2.fillPoly()函数可以用来填充任意形状的图型.可以用来绘制多边形,工作中也经常使用非常多个边来近似的画一条曲线.cv2.fillPoly()函数可以一次填充多个图型.

img = np.zeros((1080, 1920, 3), np.uint8)
area1 = np.array([[250, 200], [300, 100], [750, 800], [100, 1000]])
area2 = np.array([[1000, 200], [1500, 200], [1500, 400], [1000, 400]])

cv2.fillPoly(img, [area1, area2], (255, 255, 255))

plt.imshow(img)
plt.show()

在这里插入图片描述

哈夫变换

在这里插入图片描述
在完成边缘检测、提取兴趣区域之后,我们得到了区域散点的集合,不仅有多条线,还有一些点状和块状区域,哈夫变换的目的就是找到途中的线,并与原图进行叠加。

明天继续。。。。

发布了30 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/djfjkj52/article/details/104300863
今日推荐