1、img = cv.imread("图片路径","读取图片的标志")--读取图片,并存到变量img中
图片标志--cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可以直接写1
cv2.IMREAD_GRAYSCALE:读入灰度图片,可以直接写0
cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道,可以直接写-1
2、cv.imshow("窗口名字”,要打开的照片的变量名)
3、cv.waitKey(x)--在一个给定的时间内等待用户的按键触发。若X为0,则会无限等待用户的按键事件 注:if cv.waitKey(0) & 0xFF == ord('q'): break 表示按q推出窗口
4、cv.destroyAllwindows()--销毁所有窗口
5、cv.namedWindow("窗口名字",cv."窗口标志" ),可用来调整窗口大小
窗口标志↓↓↓
WINDOW_NORMAL | 显示图像后,允许用户随意调整窗口大小 |
WINDOW_AUTOSIZE | 根据图像大小显示窗口,不允许用户调整大小 |
WINDOW_FREERATIO | 窗口大小自适应比例 |
WINDOW_KEEPRATIO | 保持图像的比例 |
1、vc = cv.VideoCapture("x")--如果x是0,表示打开笔记本的内置摄像头。如果x是视频路径,则打开视频文件
2、cv.isOpen()--代表验证视频是否正常调用,正常就返回True,不正常就是返回False
3、x, y = cv.read()--按帧读取视频,若能正确读取,则返回的第一个参数x为布尔,返回的第二个参数y就是读取到的帧,是一个三位矩阵。另:读取到视频结尾后,就会自动返回x为Fales
4、color = cv.cvtcolor(读取到的当前帧, 帧标志)--转换当前帧的颜色
1、x = y[0:200, 0:50]--y为读取到的图片,从上到下0-200,左到右0-50截取图片
1、b, g, r = cv.split(读取到的图片变量名)--分离了图片的B、G、R三个颜色通道
2、img = cv.merge((b, g, r))--合并颜色三通道
3、#只保留R的值
img = img.copy()#复制图像
Img[:,:,2]代表R通道,也就是红色分量图像;
Img[:,:,1]代表G通道,也就是绿色分量图像;
Img[:,:,0]代表B通道,也就是蓝色分量图像。
1、cv.copyMakerBorder(图片变量名,上边界的填充值,下边界填充值, 左边界填充值,右边界填充值,borderType = 填充标志)
填充标志↓↓↓
cv.border_replicate()复制法,复制最边缘像素
cv.border_reflect反射法,对感兴趣图像中两边进行复制,如cba|abc|cba
cv.border_reflect_101,反射法,以边缘像素为轴,如cb|abc|ba
cv.border_constant,常量法,常数值填充
cv.border_wrap,外包装法,如abc|abc|ab
top_size, under_size, left_size, right_size = (50,50,50,50) #上下左右的填充赋值50
img1 = cv.copyMakeBorder(img, top_size, under_size, left_size, right_size, borderType = cv.BORDER_REPLICATE)#cv.border_replicate()复制法,复制最边缘像素
img2 = cv.copyMakeBorder(img, top_size, under_size, left_size, right_size, borderType = cv.BORDER_REFLECT)#cv.border_reflect反射法,对感兴趣图像中两边进行复制,如cba|abc|cba
img3 = cv.copyMakeBorder(img, top_size, under_size, left_size, right_size, borderType = cv.BORDER_REFLECT_101)#cv.border_reflect_101,反射法,以边缘像素为轴,如cb|abc|ba
img4 = cv.copyMakeBorder(img, top_size, under_size, left_size, right_size, borderType = cv.BORDER_CONSTANT, value = 0)#cv.border_constant,常量法,常数值填充
1、(图片1 + 图片2),这是numpy中的加法,前提是shape的值相同,当相加后超过255,就要用该值%256的结果来代替
2、cv.add(img, img1),这是cv中的加法,当相加后超越255直接用255代替
3、cv.resize(图片变量名, (宽,高))--修改图片中的shape值,每个图片都有(高,宽,通道数)
另:cv.resize(图片变量名,(0,0),fx = 1.5, fy = 1.5)--当宽高修改值都为0时,后面的参数为按倍数去修改
4、res = cv.addWeighted(图片变量名1, 阿尔法权重, 图片变量名2, 贝塔权重,提亮值)--可将两张图片进行融合
res = 图1 * 阿尔法权重 + 图2*贝塔权重 + 提亮值
ret, dst = cv2.threshold(src, thresh, maxval, type)
. src:输入图
. dst:输出图
. thresh:阈值(通常以127为界限)
. maxval:最大值
. type:二值化操作的类型,包含以下5种类型:
. cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取O--亮一点的全白,暗一点的全黑
. cv2.THRESH_BINARY_INV THRESH_BINARY的反转--暗一点的全反转为白,亮一点的全反转为黑
. cv2.THRESH_TRUNC大于阈值部分设为阈值,否则不变
. cv2.THRESH_TOZERO大于阈值部分不改变,否则设为0--暗一点的全黑
. cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转--亮一点的全黑
1、blur = cv.blur(img, (x, y))--滤波均值化,x、y为一个x*y的卷积核,通常都用奇数
2、box = cv.boxFilter(img, -1, (x, y), normalize = True)--normalize为True时,和均值的结果一样,但容易越界(卷积盒里的数相加容易大于255),但是会除以9,所以和均值一样。
另:normalize为False时,出现越界时直接以255显示
3、aussion = cv.GaussianBlur(img, (x, y), 1)--高斯滤波,第三个参数为标准差,相当于μ(一般选0或1),在高斯滤波的卷积核中,与中心点越近就越重视,权值越重。
4、median = cv.medianBlur(img, x)--中值滤波,第二个参数x必须是奇数,因为中值滤波先让核里的数排序,然后选中间的值来代替
5、res = np.hstack((blur, aussion, median))--np.hstack(())将参数元组的元素数组按水平方向进行叠加,即将三张图片按水平合并
#np.vstack(())按垂直方向合并
1、
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
img = cv.imread("D:/pic/face7.jpg")
cv.namedWindow('img', cv.WINDOW_NORMAL)
cv.imshow('img', img)
cv.waitKey(0)
原图 : 腐蚀后的图: 膨胀后的照片
numpy.ones()函数的语法为:
np.ones((x, y), type,order = 'c')--第一个参数为数组的大小,第二个参数为数组的类型(在图像中,数组的类型都是np.unit8),第三个参数为在内存中以行优先(C风格)还是列优先(Fortran风格)顺序存储多维数组。
cv.erode(图片变量名,卷积核的大小, 腐蚀的次数 = 1)--将图形边界的卷积核里面的数都统一化
img = cv.imread("D:/pic/face7.jpg")
number = np.ones((3, 3), np.uint8)
img1 = cv.erode(img, number, iterations = 1)
img2 = cv.dilate(img1, number, iterations = 1)
cv.imshow('img',img2)
cv.waitKey(0)
cv.dilate(图片变量名,卷积核大小,膨胀的次数 = 1)--结果图在目录九
1、cv.morphologyEx(输入图,cv.MORPH_OPEN,卷积核大小)--开运算(先腐蚀,后膨胀)
img = cv.imread("D:/pic/face7.jpg")
number = np.ones((5, 5), np.uint8)
opening = cv.morphologyEx(img, cv.MORPH_OPEN, number)
cv.imshow('img', opening)
cv.waitKey(0)
开运算: 闭运算:
2、cv.morphologyEx(输入图,cv.MORPH_CLOSE,卷积核大小)--闭运算(先膨胀,后腐蚀)
img = cv.imread("D:/pic/face7.jpg")
number = np.ones((5, 5), np.uint8)
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, number)
cv.imshow('img', closing)
cv.waitKey(0)
十二、梯度运算
cv.morphologyEx(输入图,cv.MORPH_GRADIENT,卷积核大小)--膨胀减去腐蚀得到边界的数据
img = cv.imread("D:/pic/face7.jpg")
number = np.ones((5, 5), np.uint8)
gradients = cv.morphologyEx(img, cv.MORPH_GRADIENT, number)
cv.imshow('img', gradients)
cv.waitKey(0)
1、cv.morphology(输入图,cv.MOPRH_TOPHAT,卷积核大小)--礼帽=原始输入-开运算结果(带刺原图-去刺图=刺)
img = cv.imread("D:/pic/face7.jpg")
number = np.ones((5, 5), np.uint8)
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, number)
cv.imshow('img', tophat)
cv.waitKey(0)
2、cv.morphologyEx(输入图,cv.MORPH_BLACKHAT,卷积核大小)--黑帽=闭运算结果-原始图(稍大的带刺图-原始带刺图=无刺图)
img = cv.imread("D:/pic/face7.jpg")
number = np.ones((5, 5), np.uint8)
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, number)
cv.imshow('img', tophat)
cv.waitKey(0)
礼帽: 黑帽:
大概的说就是--Gx = 像素点中卷积核的右边减去左边;Gy = 像素点中的卷积核的下边减去上边
dst = cv.Soble(输入图,图像的深度(cv.CV_64F),水平方向,竖直方向,Soble算子的大小)
img = cv.imread("D:/pic/face9.jpg")
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize = 3)
cv_show('img', sobelx)
Sobel x方向图: 原图:
由于在卷积核中,从白到黑进行相减必是正数,而从黑到白就必是负数,所有的负数会被截断为0,所以要取绝对值,才能取到图片的完整边框。
另:建议水平x方向核垂直y方向分开分别计算,不然会模糊不清.
水平方向的sobel:
img = cv.imread("D:/pic/face9.jpg")
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize = 3)
sobelx = cv.convertScaleAbs(sobelx)
cv_show('img', sobelx)
垂直方向的sobel:
img = cv.imread("D:/pic/face9.jpg")
sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize = 3)
sobely = cv.convertScaleAbs(sobely)
cv_show('img', sobely)
两方向融合:
img1 = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
cv_show('img', img1)
水平方向(右减左取绝对值) 垂直方向(下减上取绝对值) 两方向融合得到完整的边框图
1、cv.Scharr(输入图,cv.CV_64F,x, y)--scharr算子相比于Sobel算子更敏感,注重的细节更多
img = cv.imread("D:/pic/face9.jpg")
scharrx = cv.Scharr(img, cv.CV_64F, 1, 0)
scharrx = cv.convertScaleAbs(scharrx)
scharry = cv.Scharr(img, cv.CV_64F, 0, 1,)
scharry = cv.convertScaleAbs(scharry)
scharrxy = cv.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
cv_show('scharrxy', scharrxy)
2、cv.Laplacian(输入图, cv.CV_64F)--是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化的要求。
scharr算子: laplacian算子:
1、使用高斯滤波器,以平滑图像,滤除噪音。
2、计算图像中每个像素点的梯度强度和方向。(使用的是sobel算子进行计算)
3、应用非极大值抑制,以消除边缘带来的杂散响应。(把卷积核中小的梯度值抑制掉,大的梯度值进行保留)
注:这两种计算方法简单来说就是通过计算其中一点与两边点的梯度值进行比较,若这一点大于两边的点就保留下来
4、应用双阈值检测来确定真实的和潜在的边缘。
5、通过抑制孤立的弱边缘最终完成边缘检测
img = cv.imread("D:/pic/face3.jpg")
v1 = cv.Canny(img, 80, 150)
v2 = cv.Canny(img, 50, 100)
res = np.hstack((v1, v2))
cv_show('img', res)
cv.Canny(输入图,minVal, maxVal) --最小值越小时,检测出来的边界就越多,也可能不是一个完整的边界。最大值越大,检测出来的边界越少越。
最小值较大,最大值较大 最小值较小,最大值较小