由一次图像处理作业记录OpenCV常用方法。
在完成毕业设计后我再也没有碰过图像处理相关的东西,进入公司后也是作为前端开发学习和工作(于是乎才有了Vue的学习笔记),但是当我再开始做图像处理相关的事情时,我发现自己全然忘却了怎么调用函数,于是乎决定整理一份。
本人习惯import cv2 as cv
,所以下面的调用均以cv为准,格式中dst为目标图像的mat对象,src为原始图像的mat对象(就是用imread读进去的那个)
获取图片的尺寸
print一下src.shape,可以发现结果为(高度,宽度,通道数)
,那么获取图片的高度和宽度可以使用以下语句实现:
1 | src_height, src_width = src.shape[0:2] |
图像缩放函数resize()
常用函数格式:
1 | dst = cv.resize(src, dsize) |
其中dsize为类似于(int(source_width / 2), int(source_height / 2))
形式的元组,代表了图片的放缩倍率,例子中是保持长宽比放缩了一半,参数可调。
图像颜色转换函数cvtColor()
常用函数格式:
1 | dst = cv.cvtColor(src, colorCode) |
其中colorCode部分在库中有对应代码,例如cv.COLOR_RGB2GRAY
这样子的。
该函数常用于灰度化等。
图像降噪常用方法高斯模糊GaussianBlur()
常用函数格式:
1 | dst = cv.GaussianBlur(src, ksize, sigmaX) |
ksize为卷积核的大小,只能为正奇数元组,例如(3, 3)、(5, 5)这样子,通俗来讲就是邻域大小,对某个像素点周围多少像素在内的区域做处理,ksize越大得到的越模糊。
sigmaX实际上是σX
,指的是在图像X向的标准差,为必要参数,如果未指定σY
,则根据X的来设定
图像二值化函数threshold()
常用函数格式:
1 | dst = cv.threshold(src, thresh, maxval, type) |
其中thresh为阈值,maxval为被设置的最大值,仅当type为cv.THRESH_BINARY
或cv.THRESH_BINARY_INV
时生效
type为二值化方法,在库中有对应值,如下所示:
cv.THRESH_BINARY
:当前点大于thresh时设置为maxval的值,否则为0。
cv.THRESH_BINARY_INV
:当前点值大于阈值时,设置为0,否则设置为Maxval
THRESH_TRUNC
:当前点值大于阈值时,设置为阈值,否则不改变
THRESH_TOZERO
:当前点值大于阈值时,不改变,否则设置为0
THRESH_TOZERO_INV
:当前点值大于阈值时,设置为0,否则不改变
Canny算子边缘检测Canny()
常用函数格式:
1 | dst = cv.Canny(src, thresh1, thresh2) |
其中,像素值低于thresh1的会认为不是边缘,像素值高于thresh2的会认为是边缘,像素值为两个阈值之间的像素点若与被认为是边缘的像素点相邻,则也被认为是边缘。
轮廓检测findContours()与轮廓绘制drawContours()
常用函数格式:
1 | contours, hierarchy = cv.findContours(src, mode, method) |
在findContours中,mode为轮廓检索方式,例如cv.RETR_TREE
可以完全建立轮廓层级关系,method为轮廓表示方式,例如cv.CHAIN_APPROX_SIMPLE
就是以尽量少的像素点表示轮廓。
在drawContours中,contours就是上一步检测出的轮廓,contoursIdx指绘制的轮廓编号,若为-1则是绘制所有的轮廓,color指颜色,可以用类似(255, 0, 0)这样的格式表示一个RGB颜色,thickness指轮廓线的宽度,是一个非必须参数。
通常来讲对边缘检测之后的图进行轮廓检测,得到的轮廓效果一般很好。
霍夫变换HoughLines()
常用函数格式:
1 | lines = cv.HoughLines(src, rho, theta,thresh) |
输出为一组检测到的直线,rho为以像素为单位的距离精度,theta为以弧度为单位的角度精度,这里使用了极坐标来表示直线,thresh为阈值。在实际使用时若无特殊情况则一般为1, np.pi / 180, 0
该函数用于直线检测,应用场景为求角度进行旋正,例如以下代码用于旋转直线斜率对应的角度:
1 | lines = cv.HoughLines(img_canny, 1, np.pi / 180, 0) |