基本操作
每个像素点值在0-255之间,值越小越黑,越大越白 opencv读取格式是BGR
cv2.IMREAD_COLOR 彩色图像
cv2.IMREAD_GRAYSCALE 灰色图像
图片读取
cv2.imread(‘cat.png’,cv2.IMREAD_COLOR) 读取数据,彩色数据
cv2.imread(‘cat.png’,cv2.IMREAD_GRAYSCALE) 读取数据并转换成灰度图
视频读取
cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
如果是视频文件,直接指定好路径即可。
vc=cv2.VideoCapture(path)
open,frame = vc.read()
gray =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
open布尔值,表示是否读取了
frame表示一帧图像
颜色通道提取
b,g,r = cv2.split(img) 拆分成三个通道 img = cv2.merge((b,g,r))合并,合并成原来的BGR格式图片
边界填充
cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType)
- BORDER_REPLICATE 复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称
- BORDER_WRAP:外包装法
- BORDER_CONSTANT:常量法,常数值填充。需要指定 value=
数值计算
读取数据得到的是numpy数组,所以图像之间可以进行相关的数值计算,当数据相加时数组的大小应该是相同的。 cv2.resize(path,(100,100))改变图像大小 cv2.addWeighted(path,weight1,path2,weight2,bias)实现图像融合 R=pathweight1+path2weight2+bias
图像处理
图像阈值
ret, dst = cv2.threshold(src, thresh, maxval, type)
-
src: 输入图,只能输入单通道图像,通常来说为灰度图 -
dst: 输出图 -
ret: 返回阈值 -
thresh: 阈值 -
maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值 -
type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
- cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
- cv2.THRESH_BINARY_INV THRESH_BINARY的反转
- cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
- cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
- cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
图像平滑
均值滤波 | cv2.blur(path,(3,3)) |
---|
方框滤波 | cv2.boxFilter(path,(3,3),normalize=True)可以指定是否归一化,若归一化则和均值滤波相同,若不指定这容易产生越界 | 高斯滤波 | cv2.GaussianBlur(path,(3,3),1),高斯卷积核中的数值是满足高斯分布的,相当于更重视中间的 | 中值滤波 | cv2.medianBlur(path,5) |
腐蚀操作
腐蚀操作原理:存在一个kernel,比如(3,3),在图像中不断平移,在这个方框中,哪个颜色占比最多,就将该颜色覆盖到整个方框中。 cv2.erode(img,kernel,iterations) iterations迭代次数
膨胀操作
膨胀操作原理:存在一个kernel,在图像上进行平移,如果方框中存在白色,那么这个方框内所有颜色都是白色。 cv2.dilate(img,kernel,iterations)
开运算与闭运算
morphology:形态学
- 开运算:先腐蚀,在膨胀
- cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
- 闭运算:先膨胀,再腐蚀
- cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
梯度运算
梯度=膨胀-腐蚀 可以用来查看边缘信息 cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
礼貌与黑帽
- 礼帽 = 原始输入-开运算结果 = 原始输入-(先腐蚀,再膨胀)
- cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
- 黑帽 = 闭运算-原始输入 = (先膨胀,再腐蚀)-原始输入
- cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
梯度
sobel算子
cv2.Sobel(src, ddepth, dx, dy, ksize)
- ddepth:图像的深度,一般为-1
- dx和dy分别表示水平和竖直方向,判断是计算x方向还是y方向,通过指定0or1
- ksize是Sobel算子的大小
在sobel进行梯度计算时,可能得到的梯度并不是一个正值,当得到负值时默认会被截断为0,在实际应用中我们关心的是相对梯度大小,也就是无论正负值都显示出来。 关于opencv中的数据类型可以参考:opencv数据类型 1 0表示DX 0 1表示DY cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3) cv2.convertScaleAbs(sobelx)
Scharr算子
Scharr算子的使用类似与sobel算子 cv2.Scharr(img,cv2.CV_64F,1,0) cv2.convertScaleAbs(scharrx)
拉普拉斯算子
cv2.Laplacian(img,cv2.CV_64F) cv2.convertScaleAbs(laplacian)
Canny边缘检测
-
使用高斯滤波器,以平滑图像,滤除噪声。 -
计算图像中每个像素点的梯度强度和方向。 -
应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应(如人脸检测的框的确定)。 -
应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。 -
通过抑制孤立的弱边缘最终完成边缘检测。 Canny边缘检测使用 cv2.imread(path,cv2.IMREAD_GRAYSCALE) cv2.Canny(img,minval,maxval)
图像轮廓
寻找轮廓 binary, contours, hierarchy =cv2.findContours(img,mode,method)
- binary:就是刚才输入的二值图像
- contours:list结构,保存的是轮廓点
- hierarchy:保存的层级信息
mode:轮廓检索模式 - RETR_EXTERNAL :只检索最外面的轮廓;
- RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
- RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
- RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;(一般最常使用)
method:轮廓逼近方法 - CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
- CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
绘制轮廓 cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2) - cv2.drawContours()绘制轮廓函数
- draw_img:在原图像上绘制轮廓
- contours:轮廓
- -1:画所有轮廓,如果是2,表示画第2个轮廓
- (0, 0, 255):BGR的颜色通道,自己选定绘制轮廓的颜色
- 2:绘制线条的宽度
轮廓特征 面积: cnt = contours[0] cv2.contourArea(cnt) 周长: cv2.arcLength(cnt,True) True表示曲线是闭合的 外接矩形 x,y,w,h = cv2.boundingRect(cnt) img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) 外接圆 (x,y),radius = cv2.minEnclosingCircle(cnt) img = cv2.circle(img,center,radius,(0,255,0),2)
模板匹配
cv2.matchTemplate(img, template, cv2.TM_SQDIFF) 不同匹配方法介绍
- TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
- TM_CCORR:计算相关性,计算出来的值越大,越相关
- TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
- TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
- TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
- TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关
- 最好使用带归一化的结果
进行模板匹配 返回每个窗口左上角的值和损失大小
直方图
统计图像中相同像素点值的个数 cv2.calcHist(images,channels,mask,histSize,ranges)
- images: 原图像图像格式为 uint8 或 ?oat32。当传入函数时应 用中括号 [] 括来例如[img]
- channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
- mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。
- histSize:BIN 的数目(直方图中的横坐标的数目)。也应用中括号括来
- ranges: 像素值范围常为 [0-256]
使用方法 cv2.calcHist([img],[0],None,[256],[0,256])
直方图均衡化
cv2.equalizeHist(img) 自适应直方图均衡化 分块做均衡化 但是更可能会受到噪声点的影响 cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
频域
- 高频:变化剧烈的灰度分量
- 低频:变化缓慢的灰度分量
- opencv中主要就是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32 格式。
- 得到的结果中频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现。
- cv2.dft()返回的结果是双通道的(实部,虚部),通常还需要转换成图像格式才能展示(0,255)。
1、dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT) 2、dft_shift = np.fft.fftshift(dft) 3、magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
|