3.1 不同色彩空间的转换
计算机视觉中三种常用的色彩空间:灰度、BGR、HSV
OpenCV 第三章 使用OpenCV3处理图像
3.2 傅里叶变换
3.2.1 高通滤波器(HPF)
高通滤波器(HPF)是检测图像的某个区域,然后根据像素与周围像素的亮度插值来提升该像素的亮度的滤波器
核:一组权重组合,滤波器中的所有值加起来为0

ndimage.convolve()实现图片与核的卷积操作
#(11, 11)表示高斯矩阵的长与宽都是11,标准差取0
blurred = cv2.GaussianBlur(img, (11, 11), 0) #高斯滤波

3.2.2 低通滤波器(LPF)
高通滤波器检测边缘时不仅会检测到噪声,而且还会强化它们,所以在高通滤波之前,需要先降噪。
低通滤器通常会取均值 不像高通过滤器取的是差值,因此低通过滤器的元素加起来应该为 1,这就能保留图像的亮度,确保图像不会变亮或变暗,但我们可以看到 这个核的元素加起来等于 9,所以我们需要进行归一化处理 也就是将核值总和除以 9
OpenCV 第三章 使用OpenCV3处理图像

3.4 边缘检测
OpenCV提供的边缘检测滤波函数:
Laplacian()使用Laplacian之前,需要将图像转为灰度图
Sobel()
Scharr()
这些滤波函数都会将非边缘区域转化为黑色,将边缘区域转为白色或者其他饱和颜色

使用滤波函数之前要进行模糊处理,防止噪声的影响
OpenCV提供的模糊函数:
blur() 算术均值滤波
medinBlur() 中值滤波,去除数字化的视频噪声非常非常有效
GaussianBlur() 表示进行高斯滤波
滤波核的宽和高为奇数
通道分离 B,G,R 单通道图像
channels = cv2.split(src)

3.5 用定制内核做卷积
OpenCV提供了filter2D( )函数, 使用自定义内核对图像进行卷积
filter2D( )函数会对图像的每个通道使用相同的核,若要对每个通道使用不同的核,就必须先使用split( )函数,将通道分开,分别卷积过后,在使用merge( )函数,将卷积过后的合并

3.6 Canny边缘检测
cv2.Canny(img,200,300)) #image:源图像,threshold1:阈值1,threshold2:阈值2
多步骤组成:
step1:高斯平滑滤波:去除噪声(效果较好)step2: 计算梯度强度和方向
step3:非极大值抑制: 抑制那些梯度不够大的像素点,只保留最大的梯度,从而达到瘦边的目的, 经过非极大值抑制可以看出来图片的边缘明显变细
step4:用双阈值算法检测和连接边缘: 梯度值超过T1的称为强边缘,梯度值小于T1大于T2的称为弱边缘,梯度小于T2的不是边缘。

3.7 轮廓检测
cv2.threshold()函数
cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
src:表示的是图片源
thresh:表示的是阈值(起始值)
maxval:表示的是最大值
type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)
ret,thresh = cv2.threshold(img,127,255,0)
该函数有两个返回值,第一个ret(得到的阈值值),第二个就是阈值化后的图像。
查找轮廓:
image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
三个输入参数:输入图像(二值图像),轮廓检索方式,轮廓近似方法,
两(三)个返回值:(图像),轮廓,轮廓的层析结构
cv2.findContours( )函数会“原地”修改输入的图像,建议使用时将源图像拷贝
OpenCV 第三章 使用OpenCV3处理图像
OpenCV 第三章 使用OpenCV3处理图像
绘制轮廓:
img = cv2.drawContours(color,contours,-1,(255,0,255),-1)
‘’’:arg
第一个参数是指明在哪幅图像上绘制轮廓;image为三通道才能显示轮廓
第二个参数是轮廓本身,在Python中是一个list;
第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。
第四个参数轮廓边缘线的颜色。
最后一个参数表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式
‘’’
3.9 边界框、最小矩形、最小闭圆的轮廓检测
cv2.pyrDown(src, dst=None, dstsize=None, borderType=None) 从一个高分辨率大尺寸的图像向上构建一个金字塔(尺寸变小,分辨率降低)
函数的作用:
对图像进行滤波然后进行下采样参数含义:
src:表示输入图像
dst:表示输出图像
dstsize:表示输出图像的大小
borderType:表示图像边界的处理方式

函数 cv2.pyrUp() 从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会)cv2.pyrUp(src, dst=None, dstsize=None, borderType=None)

cv2.boundingRect(img)这个函数很简单,img是一个二值图,也就是它的参数;返回四个值,分别是x,y,w,h;x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)画出矩行
第一个参数:img是原图
第二个参数:(x,y)是矩阵的左上点坐标
第三个参数:(x+w,y+h)是矩阵的右下点坐标
第四个参数:(0,255,0)是画线对应的rgb颜色
第五个参数:2是所画的线的宽度

rect = cv2.minAreaRect(Points):其中points是点集,数据类型为ndarray,array((x1,y1),(x2,y2),…,(xn,yn))而minAreaRect就是求出在上述点集下的最小面积矩形
rect:(最小外接矩形的中心(x,y),(宽度,高度),旋转角度),但是要绘制这个矩形,我们需要矩形的4个顶点坐标box, 通过函数 cv2.BoxPoints() 获得,返回形式[ [x0,y0], [x1,y1], [x2,y2], [x3,y3] ]。

(x,y),radius = cv2.minEnclosingCircle©
#(x,y)圆心坐标组成的元组,radius为圆的半径值

画圆:cv2.circle(img,(60,60),30,(0,0,213),-1) #参数:图像,圆心坐标,半径,圆的颜色, 最后一个表实如果是正数,表示组成圆的线条的粗细程度。否则,-1表示圆是否被填充

3.10 凸轮廓与Douglas-Peucher算法
approx = cv2.approxPolyDP(cnt, epsilon, True)
cv2.approxPolyDP(轮廓,与近似多边形的差值(周长),多边形是否闭合的不二标记)
cv2.contourArea(cnt, True) # 计算轮廓的面积
参数说明:cnt为输入的单个轮廓值
cv2.arcLength(cnt, True) # 计算轮廓的周长
参数说明:cnt为输入的单个轮廓值
#获取轮廓凸包信息
hull = cv2.convexHull(cnt)

3.11 直线和圆检测
直线检测:
cv2.HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0
theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
threshod: 累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试
lines:这个参数的意义未知,发现不同的lines对结果没影响,但是不要忽略了它的存在
minLineLength:线段以像素为单位的最小长度,根据应用场景设置
maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段

圆检测:

cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
参数解析:
image为输入图像,需要灰度图

method为检测方法,常用CV_HOUGH_GRADIENT
dp为检测内侧圆心的累加器图像的分辨率于输入图像之比的倒数,如dp=1,累加器和输入图像具有相同的分辨率,如果dp=2,累计器便有输入图像一半那么大的宽度和高度
minDist表示两个圆之间圆心的最小距离
param1有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半
param2有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了
minRadius有默认值0,圆半径的最小值
maxRadius有默认值0,圆半径的最大值

相关文章:

  • 2021-06-20
  • 2022-12-23
  • 2021-08-02
  • 2021-12-06
  • 2021-12-06
  • 2022-12-23
  • 2021-12-16
  • 2022-12-23
猜你喜欢
  • 2021-08-21
  • 2021-09-08
  • 2021-11-19
  • 2022-02-25
  • 2021-07-18
  • 2021-10-07
  • 2021-10-19
相关资源
相似解决方案