封面图片由PexelsPixabay上发布,本人添加了OpenCV的Logo融合而成

在完成毕业设计后我再也没有碰过图像处理相关的东西,进入公司后也是作为前端开发学习和工作(于是乎才有了Vue的学习笔记),但是当我再开始做图像处理相关的事情时,我发现自己全然忘却了怎么调用函数,于是乎决定整理一份。

本人习惯import cv2 as cv,所以下面的调用均以cv为准,格式中dst为目标图像的mat对象,src为原始图像的mat对象(就是用imread读进去的那个)

获取图片的尺寸

print一下src.shape,可以发现结果为(高度,宽度,通道数),那么获取图片的高度和宽度可以使用以下语句实现:src_height, src_width = src.shape[0:2]

图像缩放函数resize()

常用函数格式:

dst = cv.resize(src, dsize)

其中dsize为类似于(int(source_width / 2), int(source_height / 2))形式的元组,代表了图片的放缩倍率,例子中是保持长宽比放缩了一半,参数可调。

图像颜色转换函数cvtColor()

常用函数格式:

dst = cv.cvtColor(src, colorCode)

其中colorCode部分在库中有对应代码,例如cv.COLOR_RGB2GRAY这样子的。

该函数常用于灰度化等。

图像降噪常用方法高斯模糊GaussianBlur()

常用函数格式:

dst = cv.GaussianBlur(src, ksize, sigmaX)

ksize为卷积核的大小,只能为正奇数元组,例如(3, 3)、(5, 5)这样子,通俗来讲就是邻域大小,对某个像素点周围多少像素在内的区域做处理,ksize越大得到的越模糊。

sigmaX实际上是σX,指的是在图像X向的标准差,为必要参数,如果未指定σY,则根据X的来设定

图像二值化函数threshold()

常用函数格式:

dst = cv.threshold(src, thresh, maxval, type)

其中thresh为阈值,maxval为被设置的最大值,仅当type为cv.THRESH_BINARYcv.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()

常用函数格式:

dst = cv.Canny(src, thresh1, thresh2)

其中,像素值低于thresh1的会认为不是边缘,像素值高于thresh2的会认为是边缘,像素值为两个阈值之间的像素点若与被认为是边缘的像素点相邻,则也被认为是边缘。

轮廓检测findContours()与轮廓绘制drawContours()

常用函数格式:

contours, hierarchy = cv.findContours(src, mode, method)
dst = cv.drawContours(src, contours, contoursIdx, color, thickness)

在findContours中,mode为轮廓检索方式,例如cv.RETR_TREE可以完全建立轮廓层级关系,method为轮廓表示方式,例如cv.CHAIN_APPROX_SIMPLE就是以尽量少的像素点表示轮廓。

在drawContours中,contours就是上一步检测出的轮廓,contoursIdx指绘制的轮廓编号,若为-1则是绘制所有的轮廓,color指颜色,可以用类似(255, 0, 0)这样的格式表示一个RGB颜色,thickness指轮廓线的宽度,是一个非必须参数。

通常来讲对边缘检测之后的图进行轮廓检测,得到的轮廓效果一般很好。

霍夫变换HoughLines()

常用函数格式:

lines = cv.HoughLines(src, rho, theta,thresh)

输出为一组检测到的直线,rho为以像素为单位的距离精度,theta为以弧度为单位的角度精度,这里使用了极坐标来表示直线,thresh为阈值。在实际使用时若无特殊情况则一般为1, np.pi / 180, 0

该函数用于直线检测,应用场景为求角度进行旋正,例如以下代码用于旋转直线斜率对应的角度:

lines = cv.HoughLines(img_canny, 1, np.pi / 180, 0)
for rho, theta in lines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * a)
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * a)
    if x1 == x2 or y1 == y2:
        continue
    t = float(y2 - y1) / (x2 - x1)
    rotate_angle = math.degrees(math.atan(t))
    img_result = ndimage.rotate(img_resize, rotate_angle)

最后打个小广告:

我的博客即将同步在腾讯云+社区发布,邀请大家一同入驻:
https://cloud.tencent.com/developer/support-plan?invite_code=3hk8c1hl0bqcw

除另有声明外,本博客文章均采用 知识共享(Creative Commons) 署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可,转载请注明文章出处。