学习深度学习进行图像分类和目标检测时,要有一定的图像处理的基础。在学习深度学习之前,看了一本《图像处理技术基础》,现在也忘得差不多了,后悔当初没有整理记录下来。现在整理一下图像处理的常用方法,最后实现一个小项目——基于OpenCV的车牌号识别。
OpenCV自学记录(1)——图像处理基础(图像获取、图像变化)
1、图像获取
1.1获取图像数据
函数cv2.imread() 来实现
import cv2
gray_img = cv2.imread('02.jpg',0) # 读入图像
cv2.imshow('Image', gray_img) # 显示图像
cv2.imwrite('images/output.jpg', gray_img) # 保存图像
cv2.waitKey() #等待时间,毫秒级,0表示任意中止
cv2.imread() 的第二个参数主要包括以下三种写法:
cv2.IMREAD_COLOR : 默认使用该种标识。加载一张彩色图片,忽视它的透明度。
cv2.IMREAD_GRAYSCALE : 加载一张灰度图。
cv2.IMREAD_UNCHANGED : 加载图像,包括它的Alpha通道.。
也可以用1 ,0 ,-1代替表示。
1.2 获取摄像头图像数据
cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。如果是视频文件,直接指定好路径即可。
打开计算机的摄像头,将视频转换成灰度视频:
import cv2 # opencv的读取格式是BGR
#打开相机,电脑自带摄像头一般编号为0;外接摄像头编号为1,在设备管理器中可以查询
#也可将0改为视频名称,打开视频文件
vc = cv2.VideoCapture(0)
if vc.isOpened():
open, frame = vc.read()
else:
open = False
while open:
ret, frame = vc.read()
if frame is None:
break
if ret == True:
#cvtColor函数包括了很多颜色格式之间的转换
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('result', gray)
if cv2.waitKey(10) & 0XFF == 27:
break
vc.release()
cv2.destroyAllWindows()
2、图像变化
读取到图像之后。就可以鬼图像进行相关操作,仿射变换是图像变化的基础操作,在深度学习中常被用作数据扩增的手段。
2.1 移动(translation)
首先定义移动矩阵 M,表示移动(left,right,up,down) 多少像素
矩阵M是浮点型的数组:
[1, 0, x]:x表示左右移动多少像素;x值为正——像右移动,x值为负——向左移动
[0, 1, y]:y表示上下移动多少像素;y值为正——向下移动,y值为负——向上移动
利用 cv2.warpAffine() 进行变换
import cv2
import numpy as np
img = cv2.imread('02.jpg',0)
#获得图像的尺寸
num_rows, num_cols = img.shape[:2]
#向右移动10,向下移动10
translation_matrix = np.float32([ [1,0,10], [0,1,10] ])
#cv2.warpAffine(输入图像, 变换矩阵,输出图像的大小)
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
cv2.imshow('Translation', img_translation)
cv2.waitKey()
2.2 旋转(rotation)
首先确定中心位置center,确定旋转的中心位置。
定义矩阵M:利用cv2.getRotationMatrix2D,其中的参数分别为旋转的固定点、旋转角度、1.0代表大小不变(旋转后的尺寸与原图的对比)
接下来继续利用cv2.warpAffine()进行变换,代码如下:
import cv2
#读取图像
img = cv2.imread('02.jpg',0)
#获得图像的尺寸
num_rows, num_cols = img.shape[:2]
#定义图像的旋转中心
center = num_cols/2, num_rows/2
#定义旋转矩阵(训传中心,旋转角度,大小变化)
rotation_matrix = cv2.getRotationMatrix2D(center, 30, 0.8)
#cv2.warpAffine(输入图像, 变换矩阵,输出图像的大小)
img_rotation = cv2.warpAffine(img, rotation_matrix, (num_cols, num_rows))
cv2.imshow('Rotation', img_rotation)
cv2.waitKey()
2.3 改变大小(resizing)
**cv2.resize()实现对图片进行缩放。**首先来看一下函数各参数意义
cv2.resize(src,dsize,
dst=None,
fx=None,
fy=None,
interpolation=None
)
src:原图,输入是array形式
dsize:输出图尺寸
fx:x轴缩放比例
fy:y轴缩放比例
interpolation:插值方式,默认为 flags=cv2.INTER_LINEAR,表示线性插值;cv2.INTER_NEAREST(最近邻插值) cv2.INTER_AREA (区域插值) cv2.INTER_CUBIC(三次样条插值) cv2.INTER_LANCZOS4(Lanczos插值)
import cv2
image = cv2.imread('02.jpg',0)
#新的图像的宽度(width)150像素,利用比例关系确定高度(height)
r = 150.0 / image.shape[1]
dim = (150,int(image.shape[0]*r))
resized = cv2.resize(image,dim, interpolation = cv2.INTER_AREA)
cv2.imshow("Resized",resized)
cv2.waitKey()
2.4 翻转(flipping)
利用cv2.flip()函数可以实现。
import cv2
image = cv2.imread("02.jpg",0)
# 水平翻转
h_flip = cv2.flip(image, 1)
# 水平垂直翻转
hv_flip = cv2.flip(image, -1)
# 垂直翻转
v_flip = cv2.flip(image, 0)
# 保存图片
# cv2.imwrite("girl-hv.jpg", hv_flip)
# 显示图片
cv2.imshow("v_flip",v_flip)
cv2.waitKey()
2.5 剪裁(cropping)
裁剪的实现相对直接,图片裁剪使用img[y0:y1, x0:x1],其中参数分别代表y轴和x轴的起始坐标。
import cv2
image = cv2.imread("02.jpg",0)
# 裁剪坐标为[y0:y1, x0:x1]
cropped = image[50:160 ,60:180]
cv2.imshow("crop",cropped)
cv2.waitKey(0)
3、总结
本次主要介绍了数据的读取图像数据cv2.imread()、读取视频数据cv2.VideoCapture
图像的仿射变换代码:移动,旋转(cv2.warpAffine);改变大小(cv2.resize);翻转(cv2.flip);裁剪(image[50:160 ,60:180])。
下一篇博客将整理图像形态学变换和边缘检测的代码
最终的目的是实现一个基于OpenCV的车牌号识别的小项目。
参考
https://blog.csdn.net/weixin_42823848/article/details/86721765