函数


文章目录

  • 函数
  • 一、图像处理函数
  • 二、其他函数
  • 三、OCR


一、图像处理函数

图像基本处理

  • cv2.imshow(name,img)
name:窗口名称 ;img :窗口内容
  • cv2.waitkey(timeout)
显示图片时间timeout,单位为ms,0代表一直显示
 if cv2.waitKey(100) & 0xFF == 27:  # 27是esc键
     break
  • cv2.destoryAllWindows()
关闭窗口
  • cv2.imread(filepath,flags)
读取图片,默认是三通道(BGR)的彩色图,flags=0读入灰度图
  • cv2.imwrite(filename,img)
保存图像,filename:文件名;img:内容
  • b,g,r=cv2.split(img)
颜色通道提取,opencv提取格式为BGR(注意不是RBG)\
  • cv2.merge(b,g,r)
重新组合颜色通道
  • cv2.copyMakeBorder(img,top, bottom, left, right,borderType)
填充边界;img:内容;top, bottom, left, right:四区域的大小;borderType:填充种类
  • cv2.add(img1, img2)
img1和img2的rgb值相加,超过255取255
  • cv2.addWeighted(img1,α,img2,β,b)
为图片添加权重, 混合图像,img1=X1;img2=X2;αX1+βX2+b
  • cv2.resize(img, (width, height))
变换图像大小(注意img.shape的出来的是(height,width))
  • cv2.resize(img, (0, 0), fx=a, fy=b)
变换图像大小((height,width)为(0,0),a为x变为原来a倍,b为y变为原来b倍)
  • cv_show(‘name’, contents)
name:窗口名称;contents:内容
  • cv2.VideoCapture(‘test.mp4’)
cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。如果是视频文件,直接指定好路径即可。
  • vc.isOpened()
oepn, frame = vc.read() #open是个bool值,true和false;frame是图像数组,如:img。
 vc.read()是一帧一帧的取,直到结束
  • cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)  # 转为灰度
  • vc.isOpened()
oepn, frame = vc.read() #open是个bool值,true和false;frame是图像数组,如:img。
 vc.read()是一帧一帧的取,直到结束
  • cv2.split(img)
b,g,r=cv2.split(img)
切片b,g,r
  • cv2.merge((b,g,r))
img=cv2.merge((b,g,r))  # 组合 b ,g ,r
img.shape
  • cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
top_size,bottom_size,left_size,right_size = (50,50,50,50)
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充。
  • cv2.add(img_cat,img_cat2)[:5,:,0]
array([[255, 255, 255, ..., 255, 255, 255],
   [226, 234, 246, ..., 255, 255, 255],
   [226, 230, 246, ..., 255, 255, 255],
   [255, 255, 255, ..., 255, 255, 255],
   [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
  • cv2.resize(img_dog, (500, 414))
img_dog = cv2.resize(img_dog, (500, 414)) # w, h
img_dog.shape
(414, 500, 3)
res = cv2.resize(img, (0, 0), fx=4, fy=4) # 指定倍数
plt.imshow(res)
  • cv2.calcHist(images,channels,mask,histSize,ranges)
显示直方图:
images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。
histSize:BIN 的数目。也应用中括号括来
ranges: 像素值范围常为 [0-256]
BINS :上面的直方图显示了每个像素值的像素数,即从0到255。即您需要256个值才能显示上述直方图。但是请考虑一下,如果您不需要单独查找所有像素值的像素数,而是在像素值间隔内查找像素数,该怎么办?例如,您需要找到介于 0 到 15 之间的像素数,然后是 16 到 31、...、240 到 255。您只需要 16 个值来表示直方图。 因此,只需将整个直方图拆分为 16 个子部分,每个子部分的值就是其中所有像素计数的总和。这每个子部分都称为"BIN"。在第一种情况下,条柱数为256(每个像素一个),而在第二种情况下,它只有16。BINS 在 OpenCV 文档中由术语histSize表示。
plt.hist(img.ravel(),256);  # ravel()函数是把多维展开成一维
  • cv2.equalizeHist(img)
直方图均衡化
  • cv2.bitwise_and(img, img, mask=mask)
cv2.bitwise_and(img, img, mask=mask)#与操作
  • cv2.createCLAHE([, clipLimit[, tileGridSize]])
cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) 
clipLimit:颜色对比度的阈值,可选项,默认值 8
titleGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值 (8,8)
  • 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,越相关
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
       'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
  • cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None )
img:指定一张图片,在这张图片的基础上进行绘制;(img相当于一个画板)
pt1: 由(x_min,y_min)组成,为绘制的边框的左上角;
pt2: 由(x_max, y_max)坐标,为绘制的边框的右下角,示意如下:
color:指定边框的颜色,由(B,G,R)组成,当为(255,0,0)时为绿色,可以自由设定;
thinkness:线条的粗细值,为正值时代表线条的粗细(以像素为单位),为负值时边框实心;

阈值与平滑处理

  • ret,det = cv2.threshold(src, thresh, maxval, type)
ret:阈值;det:输出图
 src:原始图像;thresh:阈值,常见127(因为颜色为0-255);
 maxval:最大可能值(255);type:选择的功能或方法,即怎么判断阈值,二值化操作的类型
  • cv2.blur(img,ksize)
均值滤波( 矩形中间的值=矩形内的值相加取平均值)
 img:图像;ksize:矩阵大小
  • cv2.boxFilter(img, ddepth,ksize, normalize=True)
方框滤波: (normalize=True等同于均值滤波, normalize=false代表直接求和不取均值,越界后显示为255)**
 ddepth一般为-1表示得到的颜色通道和原图一致
  • cv2.GaussianBlur(img, ksize, sigmaX)
高斯滤波:(离得近的权重高,离得远的权重低)
 sigmaX为高斯函数在X轴上的标准差σ,调整σ实际是在调整周围像素对当前像素的影响程度,
 调大σ即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑
  • cv2.medianBlur(img,ksize)
中值滤波:(矩形内的值排序后取中间值)
 ksize为矩阵大小,即ksize×ksize

图像形态学处理

  • numpy.ones(shape, dtype=None, order=‘C’)
函数返回给定形状和数据类型的新数组,其中元素的值设置为1。
  • cv2.erode(img, kernel, iterations)
腐蚀操作,iterations	施加腐蚀的次数。
  • cv2.dilate(img1, kernel, iterations)
膨胀操作
  • 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)
底帽运算(闭运算-原始值)

图像梯度处理

  • cv2.Sobel(img, ddepth, dx, dy,ksize)
Sobel算子
 img:当前的图像;ddepth:图像的深度(一般为-1);dx和dy分别表示水平和竖直方向;ksize:Soble算子的大小
  • cv2.Scharr(img, ddepth, dx, dy)
Scharr算子(能捕捉到更多的细节)
  • cv2.Laplacian(img, ddepth)
Laplacian算子(噪点影响很大)
  • cv2.convertScaleAbs(sobelx)
变为绝对值

边缘检测

  • cv2.Canny(img, threshold1, threshold2)
边缘检测(threshold<value<threshold2,范围越大,边缘检测细节越多

图像金字塔与轮廓检测

  • cv2.pyrUp(img)
高斯金字塔:向上采样(放大图像)
  • cv2.pyrDown(img)
高斯金字塔:向下采样(缩小图像)
  • img-cv2.pyrUp(cv2.pyrDown(img))
拉普拉斯金字塔(原图-(先缩小后放大))
  • cv2.findContours(img, mode, method)
找出轮廓
 img:待测图像
 mode:轮廓检索模式
 method:轮廓逼近方法
  • cv2.drawContours(img, contours, contourIdx, color,width)
画出轮廓
 contours:轮廓
 contourIdx:轮廓数量,画第几个轮廓;默认-1,即所有轮廓
 color:颜色(B,G,R)
 width:线条的宽度
  • cv2.contourArea(cnt)
计算轮廓面积
  • cv2.arcLength(cnt, True)
计算轮廓周长,True表示闭合
  • cv2.approxPolyDP(cnt, epsilon, True)
轮廓近似(普朗克算法)
 cnt:具体哪个轮廓
 epsilon:给字节指定一个值来比较,一般按照周长的百分比设置
 True:闭合
  • x, y, w, h = cv2.boundingRect(cnt)
(x, y)为坐标点,w, h为矩形长宽
  • cv2.rectangle(img, pt1, pt2, color,width)
画矩形
 pt1:坐标点1
 pt2:坐标点2
 width:线宽
  • (x, y), radius = cv2.minEnclosingCircle(cnt)
外接圆近似
  • cv2.circle(img, center, radius,color, width)
画圆
  • res = cv2.matchTemplate(img, template, method)
模板匹配
 method:匹配方法
  • min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
min_val:算法算出的最小值
 max_val:算法算出的最大值
 min_loc:最小值所在的坐标(因为得到了h,w,所以可得到矩形)
 max_loc :最大值所在的坐标

直方图与傅里叶变换

  • cv2.calcHist(img, channels, mask, histSize, ranges)
像素直方图统计:
 img:原图像格式为uint8或floart32。当传入函数时应用中括号[]来,例如[img]
 channels:同样用中括号,他会告诉我们统幅图像的直方图。如果入图像是灰度图它的值就是[0],如果是彩色图像
 		的传入的参数可以是[0][1][2],他们分别对应着BGR。
 mask:掩码图像。统整幅图像的直方图就把它为None。但是如果你想统图像某一分的直方图的,就制作一个掩码图
 		像并使用它。
 histSize:BIN的数目。也应用中括号括来
 ranges:像素值范围常为[0256]
  • cv2.bitwise_and(img, img, mask=mask)
与操作
  • cv2.equalizeHist(img)
直方图均衡化
  • cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
自适应直方图均衡化
 clipLimit:颜色对比度的阈值
  titleGridSize:进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
  • cv2.dft(img, flags)
执行傅里叶变换,flags:转换标识,通常为cv2.DFT_COMPLEX_OUTPUT,其他值如下
  • cv2.idft()
傅里叶逆变换

二、其他函数

  • cv2.getStructuringElement(shape, size)
shape:表示核的形状。可以选择三种
 	(1)矩形:MORPH_RECT
 	(2)交叉形:MORPH_CROSS;
 	(3)椭圆形:MORPH_ELLIPSE;
 size:表示核的尺寸。

三、OCR

(1)边缘检测
(2)获取轮廓
(3)变换
(4)OCR