1、opencv基础课程

1.1、读取图片与展示

1.1.1、图像读入

img = cv2.imread('yahboom.jpg', 0) 第一个参数是图片的路径,第二个参数是如何读取这幅图片。

cv2.IMREAD_UNCHANGED:保持原格式不变,-1;

cv2.IMREAD_GRAYSCALE:以灰度模式读入图片,可以用0表示;

cv2.IMREAD_COLOR:,读入一副彩色图片,可以用1表示;

cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道,可以用2表示。

1.1.2、图像展示

cv.imshow('frame', frame):打开一个窗口名为frame,并且显示frame帧数据(图像/视频数据)

参数含义:

第一个参数表示创建打开的窗口的名字;

第二个参数表示需要显示的图片。

1.1.3、代码与实际效果展示

运行程序,

image-20230425103403516

1.2、opencv图片写入

1.2.1、函数方法:cv2.imwrite('new_img_name', img)

参数含义:

第一个参数是保存的文件名,第二个参数是保存的图像。

1.2.2、代码与实际效果展示

运行程序,

image-20230425103817060

1.3、opencv摄像头读取与显示视频

1.3.1、摄像头读取

capture=cv.VideoCapture(0)

参数含义:

VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如cap =

cv2.VideoCapture(“../test.avi”)

1.3.2、显示摄像头视频

ret,img = frame.read()

返回值含义:

ret:ret是一个bool值,判断是否读回正确的帧

img:每一帧的图像数据

1.3.3、代码与实际效果展示

运行程序,

image-20230425104402303

1.4、openc像素操作

1.4.1、像素操作,我们可以给任意位置改成新的像素颜色。

首先,我们先要读取图像,然后修改bgr的数值,赋值一个区域为黑色。

1.4.2、代码与实际效果展示

运行程序

image-20230425104757385

红色框部分就是修改的色素值。

2.1、opencv图片缩放

2.1.1、cv2.resize(InputArray src,OutputArray dst, Size, fx, fy, interpolation)

参数含义:

InputArray src:输入图片

OutputArray ds:输出图片

Size:输出图片尺寸

fx,fy:沿x轴,y轴的缩放系数

interpolation:插入方式,可选择INTER_NEAREST(最近邻插值),INTER_LINEAR(双线性插值(默

认设置)),INTER_AREA(使用像素区域关系进行重采样),INTER_CUBIC(4x4像素邻域的双三次插

值),INTER_LANCZOS4(8x8像素邻域的Lanczos插值)

需要注意:

2.1.2、代码与实际效果展示

运行程序

image-20230425105559311

2.2、opencv图片剪裁

2.2.1、图片剪切

首先读取图像,然后再数组中获取像素点区域。下面代码中选取形区域X:300-500 Y:500-700,注意图像尺寸是800*800,所以选择的区域不要超过此分辨率。

2.2.2、代码与实际效果展示

运行程序

image-20230425110134190

2.3、opencv图片平移

2.3.1、cv2.warpAffine(src, M, dsize[,dst[, flags[, borderMode[, borderValue]]]])

参数含义:

上述参数中:M作为仿射变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3的变换矩阵。

在日常进行仿射变换是,只设置前三个参数的情况下,如cv2.warpAffine(img,M,(rows,cols))就可以实现

基本的仿射变换效果。

2.3.2、如何得到转换矩阵M?下列举个例子说明,

通过转换矩阵M实现将原始图像src转换为目标图像dst:

dst(x, y) = src(M11x + M12y+M13, M21x+M22y+M23)

将原始图像src向右侧移动200、向下移动100个像素,则其对应关系为:

dst(x, y) = src(x+200, y+100)

将上述表达式补充完整,即:

dst(x, y) = src(1·x + 0·y + 200, 0·x + 1·y + 100)

根据上述表达式,可以确定对应的转换矩阵M中各个元素的值为:

M11=1

M12=0

M13=200

M21=0

M22=1

M23=100

将上述值代入转换矩阵M,得到:

M = [ ]

2.3.3、代码与实际效果展示

image-20230425110914737

2.4、opencv图片镜像

2.4.1、图片镜像的原理

图像的镜像变换分为两种:水平镜像和垂直镜像。水平镜像以图像垂直中线为轴,将图像的像素进行对换,也就是将图像的左半部和右半部对调。垂直镜像则是以图像的水平中线为轴,将图像的上半部分和下半部分对调。

变换原理:

设图像的宽度为width,长度为height。(x,y)为变换后的坐标,(x0,y0)为原图像的坐标,

总结:在水平镜像变换时,遍历了整个图像,然后根据映射关系对每个像素都做了处理。实际上,水平镜像变换就是将图像坐标的列换到右边,右边的列换到左边,是可以以列为单位做变换的。同样垂直镜像变换也如此,可以以行为单位进行变换。

2.4.2、以垂直变换为例,看看Python如何实现

image-20230425111627555

3.1、opencv图像灰度化处理

3.1.1、图像灰度化

彩色图像转化为灰度图像的过程是图像的灰度化处理。彩色图像中的每个像素的颜色由R,G,B三个分量决定,而每个分量中可取值0-255,这样一个像素点可以有1600多万(256256256=1677256)的颜色的变化范围。而灰度图像是R,G,B三个分量相同的一种特殊的彩色图像,其中一个像素点的变化范围为256种,所以在数字图像处理中一般将各种格式的图像转化为灰度图像以使后续的图像的计算量少一些。灰度图像的描述与彩色图像一样仍然反映了整副图像的整体和局部的色度和高亮等级的分布和特征。

3.1.2、图像灰度化处理

灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程。灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素最下为0,为黑色)。图像灰度化核心思想是 R = G = B ,这个值也叫灰度值。

1)最大值法:使转化后的R,G,B得值等于转化前3个值中最大的一个,即:R=G=B=max(R,G,B)。这种方法转换的灰度图亮度很高。

2)平均值法:是转化后R,G,B的值为转化前R,G,B的平均值。即:R=G=B=(R+G+B)/3。这种方法产生的灰度图像比较柔和。

在OpenCV中,用cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)来实现对图像进行灰度化处理

3.1.3、代码与实际效果展示

运行程序,

image-20230425112455878

3.2、opencv图像二值化处理

3.2.1、二值化核心思想

设阈值,大于阈值的为0(黑色)或 255(白色),使图像称为黑白图。阈值可固定,也可以自适应阈值。自适应阈值一般为一点像素与这点为中序的区域像素平均值或者高斯分布加权和的比较,其中可以设置一个差值也可以不设置。

3.2.2、cv2.threshold(src, threshold, maxValue,thresholdType)

参数含义:

注意:在进行二值化之前,我们需要把彩色图进行灰度化处理,得到灰度图。

3.2.3、代码与实际效果展示

运行程序

image-20230425113650511

3.3、opencv图像边缘检测

3.3.1、图像边缘检测的目的

在保留原有图像属性的情况下,显著减少图像的数据规模。目前有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法,而且仍在研究中广泛使用。

3.3.2、Canny边缘检测算法

在目前常用的边缘检测方法中,Canny边缘检测算法是具有严格定义的,可以提供良好可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势,成为边缘检测最流行的算法之一。

Canny边缘检测算法可以分为以下5个步骤:

3.3.3、opencv实现步骤

3.3.4、代码和实际效果展示

运行程序,

image-20230425114515047

3.4、opencv线段绘制

3.4.1、cv2.line(dst,pt1,pt2,color,thickness=None,lineType=None,shift=None)

参数含义:

3.4.2、代码与实际效果展示

运行程序,

image-20230425114940700

3.5、opencv绘制矩形

3.5.1、cv2.rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)

参数含义:

3.5.2、代码和效果展示

运行程序,

image-20230425115426818

3.6、opencv绘制圆形

3.6.1、cv2.circle(img, center, radius, color[,thickness[,lineType]])

参数含义:

image-20230425115705876

3.6.2、代码和实际效果展示

运行程序,

image-20230425115852912

3.7、opencv绘制椭圆

3.7.1、cv2.ellipse(img, center, axes, angle, StartAngle, endAngle, color[,thickness[,lineType])

参数含义:

3.7.2、代码和实际效果展示

运行程序,

image-20230425120536291

3.8、opencv绘制多边形

3.8.1、cv2.polylines(img,[pts],isClosed, color[,thickness[,lineType]])

参数含义:

3.8.2、代码与实际效果展示

运行程序

image-20230425120919591

3.9、opencv绘制文字

3.9.1、cv2.putText(img, str, origin, font, size,color,thickness)

参数含义:

3.9.2、代码与实际效果展示

运行程序

image-20230425121345553

4.1、opencv修复图片

图像修复是计算机视觉中的一类算法,其目标是填充图像或视频内的区域。该区域使用二进制掩模进行标识,填充通常根据需要填充的区域边界信息来完成。图像修复的最常见应用是恢复旧的扫描照片。它还用于删除图像中的小的不需要的对象。

4.1.1、dst = cv2.inpaint(src, inpaintMask, inpaintRadius, flags)

参数含义:

基于Navier-Stokes的修复应该更慢,并且倾向于产生比fast marching method的方法更模糊的结果。在实践中,我们没有发现这种情况。INPAINT_NS在我们的测试中产生了更好的结果,速度也略高于INPAINT_TELEA。

4.1.2、代码与实际效果展示

(1)、首先,我们先根据完好的图片,对其增加破损,可以理解成是修改其特定部分的像素值,

运行程序,

运行后会生成一张图片,这张图片看成是原图的破损图片,

image-20230425122214505

(2)、修复刚才创建的照片,首先先读取,然后创建掩码,最后使用函数修复它

运行程序

image-20230425122435840

如图所示,左边为修复前,中间的是掩码图片,右边是修复后的原图。

4.2、opencv图片亮度增强

实现过程:对每个像素点的三通道值进行同步放大,同时保持通道值在0-255之间,实际上就是遍历每个像素点,给他们加减数值,然后再判断三个通道rgb是否在0-255区间,大于或者小于则取值255或者0。

4.2.1、代码和实际效果展示

运行程序,

左边图片是原图,后边图片是增加亮度后的照片。

4.3、opencv图片磨皮美白

OpenCV实现对图片磨皮美白的功能,实现的原理和“1.20 OpenCV图片亮度增强”的原理基本上是一样的,只不过这里我们不需要对r值做处理,只需要按照这个公式,p = p(x)*1.4+ y,其中p(x)表示b通道或者g通道,y表示需要增减的数值,同样的,加了数值后,我们需要对数值做判断。

4.3.1、代码与实际效果展示

运行程序

image-20230425123116830