首页 飞桨领航团 帖子详情
【AI达人养成营】飞桨领航团图像处理入门基础学习笔记
收藏
快速回复
飞桨领航团 文章学习资料AI达人创造营 555 0
【AI达人养成营】飞桨领航团图像处理入门基础学习笔记
收藏
快速回复
飞桨领航团 文章学习资料AI达人创造营 555 0

本次课程主要学习了图像处理的概念与基本操作,OpenCV库进阶操作。

一、基本概念:

像素:画面中最小的点。像素的大小是没有固定长度的,不同设备上一个单位像素色块的大小是不一样。

灰度值与光学三原色(RGB):红、绿、蓝(靛蓝)。光学三原色混合后,组成像素点的显示颜色,三原色同时相加为白色,白色属于无色系(黑白灰)中的一种。

分辨率=画面水平方向的像素值 * 画面垂直方向的像素值。

屏幕分辨率:纵横向上的像素点数,单位是px。

图像分辨率:图像单位英寸中所包含的像素数。

常见图片格式:jpg、png、gif、psd、tiff、bmp等。

OpenCV是计算机视觉中经典的专用库,其支持多语言、跨平台,功能强大。

二、使用OpenCV

加载图片,显示图片,保存图片

OpenCV函数:cv2.imread(), cv2.imshow(), cv2.imwrite()

加载图片:
使用cv2.imread()来读入一张图片

参数1:图片的文件名

参数2:读入方式,省略即采用默认值

cv2.IMREAD_COLOR:彩色图,默认值(1)
cv2.IMREAD_GRAYSCALE:灰度图(0)
cv2.IMREAD_UNCHANGED:包含透明通道的彩色图(-1)

注:路径中不能有中文,并且没有加载成功的话是不会报错的,print(img)的结果为None,后面处理才会报错。

ROI
ROI:Region of Interest,感兴趣区域。。

截取ROI非常简单,指定图片的范围即可

通道分割与合并
彩色图的BGR三个通道是可以分开单独访问的,也可以将单独的三个通道合并成一副图像。分别使用cv2.split()和cv2.merge():

颜色空间转换
最常用的颜色空间转换如下:

RGB或BGR到灰度(COLOR_RGB2GRAY,COLOR_BGR2GRAY)
RGB或BGR到YcrCb(或YCC)(COLOR_RGB2YCrCb,COLOR_BGR2YCrCb)
RGB或BGR到HSV(COLOR_RGB2HSV,COLOR_BGR2HSV)
RGB或BGR到Luv(COLOR_RGB2Luv,COLOR_BGR2Luv)
灰度到RGB或BGR(COLOR_GRAY2RGB,COLOR_GRAY2BGR)

颜色转换其实是数学运算,如灰度化最常用的是:gray=R*0.299+G*0.587+B*0.114。

特定颜色物体追踪:
HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色,转换模式用COLOR_BGR2HSV表示。

注:OpenCV中色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV中除以了2,某些软件可能使用不同的尺度表示,所以同其他软件混用时,记得归一化。

阈值分割
使用固定阈值、自适应阈值和Otsu阈值法"二值化"图像
OpenCV函数:cv2.threshold(), cv2.adaptiveThreshold()
固定阈值分割
固定阈值分割很直接,一句话说就是像素点值大于阈值变成一类值,小于阈值变成另一类值。

cv2.threshold()用来实现阈值分割,ret是return value缩写,代表当前的阈值。函数有4个参数:

参数1:要处理的原图,一般是灰度图
参数2:设定的阈值
参数3:最大阈值,一般为255
参数4:阈值的方式,主要有5种,详情:ThresholdTypes0: THRESH_BINARY  当前点值大于阈值时,取Maxval,也就是第四个参数,否则设置为0
1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
4:THRESH_TOZERO_INV  当前点值大于阈值时,设置为0,否则不改变

自适应阈值
固定阈值是在整幅图片上应用一个阈值进行分割,它并不适用于明暗分布不均的图片。 cv2.adaptiveThreshold()自适应阈值会每次取图片的一小部分计算阈值,这样图片不同区域的阈值就不尽相同。它有5个参数:

参数1:要处理的原图
参数2:最大阈值,一般为255
参数3:小区域阈值的计算方式ADAPTIVE_THRESH_MEAN_C:小区域内取均值
ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
参数4:阈值方式(跟前面讲的那5种相同)
参数5:小区域的面积,如11就是11*11的小块
参数6:最终阈值等于小区域计算出的阈值再减去此值

Otsu阈值:
在前面固定阈值中,会不断尝试阈值效果好不好,所以这种方法在很多文献中都被称为经验阈值。Otsu阈值法就提供了一种自动高效的二值化方法。

结:cv2.threshold()用来进行固定阈值分割。固定阈值不适用于光线不均匀的图片,所以用 cv2.adaptiveThreshold()进行自适应阈值分割。
二值化跟阈值分割并不等同。针对不同的图片,可以采用不同的阈值方法。

图像几何变换
实现旋转、平移和缩放图片
OpenCV函数:cv2.resize(), cv2.flip(), cv2.warpAffine()

缩放:调整图片的大小,使用cv2.resize()函数实现缩放。以按照比例缩放,也可以按照指定的大小缩放: 我们也可以指定缩放方法interpolation

缩放过程中有五种插值方式:

cv2.INTER_NEAREST 最近邻插值
cv2.INTER_LINEAR 线性插值
cv2.INTER_AREA 基于局部像素的重采样,区域插值
cv2.INTER_CUBIC 基于邻域4x4像素的三次插值
cv2.INTER_LANCZOS4 基于8x8像素邻域的Lanczos插值

翻转图片:
镜像翻转图片,可以用cv2.flip()函数

平移图片:
要平移图片,我们需要定义下面这样一个矩阵,tx,ty是向x和y方向平移的距离:

M=[10tx01ty] M = \left[ \begin{matrix} 1 & 0 & t_x \newline 0 & 1 & t_y \end{matrix} \right]M=[1​0​tx​0​1​ty​​]

平移是用仿射变换函数cv2.warpAffine()实现的。

绘图功能
绘制各种几何形状、添加文字
OpenCV函数:cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.putText()
绘制形状的函数有一些共同的参数。

img:要绘制形状的图片
color:绘制的颜色彩色图就传入BGR的一组值,如蓝色就是(255,0,0)
灰度图,传入一个灰度值就行
thickness:线宽,默认为1;对于矩形/圆之类的封闭形状而言,传入-1表示填充形状
lineType:线的类型。默认情况下,它是8连接的。cv2.LINE_AA 是适合曲线的抗锯齿线。

画线
画直线只需指定起点和终点的坐标就行。

添加文字
使用cv2.putText()添加文字,它的参数也比较多,同样请对照后面的代码理解这几个参数:

参数2:要添加的文本
参数3:文字的起始坐标(左下角为起点)
参数4:字体
参数5:文字大小(缩放比例)

结:cv2.line()画直线,

       cv2.circle()画圆,

       cv2.rectangle()画矩形,

       cv2.ellipse()画椭圆,

       cv2.polylines()画多边形,

       cv2.putText()添加文字。
画多条直线时,cv2.polylines()要比cv2.line()高效很多。
要在图像中打上中文,可以用PIL库结合OpenCV实现。

图像间数学运算
图片间的数学运算,如相加、按位运算等
OpenCV函数:cv2.add(), cv2.addWeighted(), cv2.bitwise_and()
图片相加
要叠加两张图片,可以用cv2.add()函数,相加两幅图片的形状(高度/宽度/通道数)必须相同。numpy中可以直接用res = img + img1相加,但这两者的结果并不相同。

图像混合
图像混合cv2.addWeighted()也是一种图片相加的操作,只不过两幅图片的权重不一样,γ相当于一个修正值:

dst=α×img1+β×img2+γdst = \alpha\times img1+\beta\times img2 + \gammadst=α×img1+β×img2+γ

平滑图像
模糊/平滑图片来消除图片噪声
OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter()

均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波、图像锐化。

边缘检测:
OpenCV函数:cv2.Canny()

Canny边缘检测方法常被誉为边缘检测的最优方法:cv2.Canny()。

注:用低通滤波的方式模糊了图片,那反过来,想得到物体的边缘,就需要用到高通滤波。

腐蚀与膨胀:OpenCV函数:cv2.erode(), cv2.dilate(), cv2.morphologyEx()

形态学操作其实就是改变物体的形状,比如腐蚀就是"变瘦",膨胀就是"变胖"。

注:形态学操作一般作用于二值化图,来连接相邻的元素或分离成独立的元素。腐蚀和膨胀是针对图片中的白色部分!
腐蚀。

开/闭运算:
先腐蚀后膨胀叫开运算,其作用是:分离物体,消除小区域。这类形态学操作用cv2.morphologyEx()函数实现

使用OpenCV摄像头与加载视频:

OpenCV函数:cv2.VideoCapture(), cv2.VideoWriter()

使用cv2.VideoCapture()创建视频对象,然后在循环中一帧帧显示图像。参数传入数字时,代表打开摄像头,传入本地视频路径时,表示播放本地视频。
cap.get(propId)获取视频属性,cap.set(propId,value)设置视频属性。
cv2.VideoWriter()创建视频写入对象,用来录制/保存视频。

三、图像分类:

Image Classification: 图像分类,用于识别图像中物体的类别。
Object Localization: 目标检测,用于检测图像中每个物体的类别,并准确标出它们的位置。
Semantic Segmentation: 图像语义分割,用于标出图像中每个像素点所属的类别,属于同一类别的像素点用一个颜色标识。
Instance Segmentation: 实例分割,值得注意的是,目标检测任务只需要标注出物体位置,实例分割任务不仅要标注出物体位置,还需要标注出物体的外形轮廓。

经典数据集:ImageNet数据集、Cifar数据集、MNIST手写数字识别

例题:

1、图像翻转
按照以下条件翻转图像
水平翻转
竖直翻转

保存的文件名为1-1.png和1-2.png(也可以输出图片)

代码:

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

path = "baidu_bear.png" # 图片路径
image = Image.open(path)
image = np.array(image)
#在下面补充相关代码
import cv2
p1=cv2.flip(image,1)
plt.imshow(p1)
p2=cv2.flip(image,0)
plt.imshow(p2)

2、图像裁剪
按照以下条件裁剪图像
长度方向
宽度方向
俩个方向同时裁剪
随机裁剪的图片(大小设定随意)

保存的文件名为2-1.png、2-2.png、2-3.png、2-4.png(也可以输出图片)

代码:

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

path = "baidu_bear.png" # 图片路径
image = Image.open(path) #读取图片
image = np.array(image)
#在下面补充相关代码
import cv2
#image.shape (435, 580, 3)
p1= image[0:435, 0:400]
plt.imshow(p1)
p2= image[0:300, 0:580]
plt.imshow(p2)
p3= image[0:300, 0:400]
plt.imshow(p3)
p3= image[0:300, 0:400]
plt.imshow(p3)
import random
x1=random.randint(0,580)
x2=random.randint(x1,580)
y1=random.randint(0,435)
y2=random.randint(y1,435)
p4=image[y1:y2, x1:x2]
plt.imshow(p4)

0
收藏
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户