Opencv基础API总结 - 详解

opencv基础的图像操作

1.读取图像

import numpy as np

import cv2

img = cv2.imread('1.jpg')

2.显现图像

cv2.imshow('1,jpg')

3.保存图像

cv2.imwrite('2.png',img) #可以用来图像格式转化

cv2.waitKey(0)

绘制几何图形

1.绘制直线

cv2.line(img,(100,100),(200,200),(255,0,0),2)

2.绘制圆形

cv2.circle(img,centerpoint,r,color,thickness)

3.绘制矩形

cv2.rectangle(img,leftupp er,rightdown,color,thickness)

4.向图片中添加文字

cv2.putText(img,text,station,font,Fontscale,color,thickness,cv2.LINE_AA)

station位置,font文字样式,Fontscale字体大小

5.获取并修改图像中的像素点

img[100,100]=[0,0,255]

6.捕获摄像头的实时视频流

cap = cv2.VideoCapture(path) # path 为第几个摄影头,默认为0

ret,frame = cap.read()

灰度实验

1.最大值法

2.平均值法

3.加权均值法

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

4.两个极端的灰度值

二值化实验

1.阈值法

_,binary = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

2.反阈值法

_,binary = cv2.threshold(img,127,255,cv2.THRESH_BINAR_INT)

3.截断阈值法

_,binary = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)

4.低阈值零处理

_,binary = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)

5.超阈值零处理

_,binary = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INT)

6.OTSU阈值法

_,binary = cv2.threshold(img,0,255,cv2.THRESH_OTSU)

7.自适应二值化

binary = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,7,10) # 求均值

binary = >cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,7,10)# 加权求和

形态学变换

1.核

kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(7,7))#矩形核

kernel = np.ones((3,3),np.uint8)

2.腐蚀

  1. 去除小噪点

  2. 分离粘连的物体

  3. 边缘细化

  4. 消除细小结构

eroded = cv2.erode(img_binary,kernel)

3.膨胀

  1. 填补空洞

  2. 边缘扩展

  3. 连接断裂部分

  4. 去除黑噪点

dilated = cv2.dilate(img_binary,kernel)

4.开运算

作用:分离物体,消除小区域

特点:消除噪点,去除小的干扰块,而不影响原来的图像

opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

morph:变形

morphology:形态学

5.闭运算

作用:消除/“闭合”物体里面的孔洞

特点:可以填充闭合区域

closing = cv2.morphologyEx(img,cv2.MORPH_COLSE,kernel)

6.礼帽运算

礼帽运算用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以运用礼帽运算进行背景提取

tophat = cv2.morpholgoyEx(img,cv2.MORPH_TOPHAT,kernel)

tophat:礼帽

7.黑帽运算

blackphat = cv2.morpholgoyEx(img,cv2.MORPH_BLACKPHAT,kernel)

8.形态学梯度

gradient = cv2.morpholoyEx(img,cv2.MORPH_GRADIENT,kernel)

图片颜色识别

1.HSV颜色空间

hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

2.颜色加法

print( cv.add(x,y) ) # 250+10 = 260 => 255[[255]]print( x+y ) # 250+10 = 260 % 256 = 4[4]

img_add = cv2.add(img1,img2)

3.颜色加权加法

img_weightadd = cv2.addweight(img1,0.6,img2.0.4,0)

# 0是伽马值gamma

4.制作掩膜

mask = cv2.inRange(hsv_img,color_low,color_high)

#cv2.inRange用于进行多通道图像(尤其是彩色图像)的阈值操控。它将图像中的每个像素值与指定的颜色范围进行比较,并根据比较结果生成一个二值图像(通常称为掩模或标记图像),其中白色像素代表原图中对应位置的像素颜色在设定范围内,而黑色像素则表示不在该范围内。

5.与运算

mask_color_img = cv2.bitwise_and(img,img,mask=mask)

注意: 参数一image_np和参数二image_np 的每一位像素进行按位与操作 由于是同一张图片 因此相同像素按位与后还是当前像素

6.roi切割

图片旋转

1.图片旋转

1.1获得二维旋转矩阵(旋转中心点,旋转角度,缩放比例)

M = cv2.getRotationMatrix2D((img[0]/2,img[1]/2),45,0.5)

1.2warpAffine

rotation_img = cv2.warpAfiine(img,M,(shape[1],shape[0]))

# image_np处理的图像 M变换矩阵 (img_shape[0], img_shape[1]) 变换后的图像宽高 flags插值方式 borderMode填充方式

2.插值方式

1.最近邻插值: cv2.INTER_NEAREST

2.双线性插值: cv2.INTER_LINEAR

3.像素区域插值: cv2.INTER_AREA

3.双三次插值: cv2.INTER_CUBIC

4.Lanczos插值: cv2.INTER_LANCZOS4

3.边缘填充方式

1.边界复制(BORDER_REPLICATE)

2.边界反射(BORDER_REFLECT

3.边界反射101(BORDER_REFLECT_101)

4.边界常数(BORDER_CONSTANT)

5.边界包裹(BORDER_WRAP)

图片镜像旋转

mirroring_image = cv2.flip(image_np, 0)

  • 0:垂直翻转

  • 大于0:水平翻转

  • 小于0:水平垂直翻转

图像矫正

pts = cv2.getPerspectiveTransform(pts1,pts2) # 生成透视变换矩阵

pt1 :原图像上应该进行透视变化的四个点的坐标,这四个点用于定义一个原图中的四边形区域。

pt2:透视变换后,src的四个点在新目标图像的四个新坐标。

correct_img = cv2.warpPerspective(img,pts,(img[1],img[0]),flags = cv2.INTER_LINEAR,borderMode = cv2.BORDER_REFLECT_101)

图像添加水印

详见up主页 添加水印实验

图像噪点消除

1.均值滤波 cv2.blur(img,(3,3))

2.方框滤波 cv2.boxFilter(img,-1,(3,3),normalize=True)

#ddepth:输出图像的深度,-1代表使用原图像的深度。

# normalize:当normalize为True的时候,方框滤波就是均值滤波,上式中的a就#等于1/9;normalize为False的时候,a=1,相当于求区域内的像素和。

3.高斯滤波 cv2.GaussianBlur(img,(3,3),1)

sigmaX:就是高斯函数里的值,σx值越大,模糊效果越明显。

4.中值滤波 cv2.medianBlur(img,3)

5.双边滤波 cv2.bilateralFilter(img,9,75,75)

  • ksize:卷积核的大小

  • d:过滤时周围每个像素领域的直径

  • sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。

  • sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。

图像梯度处理

1.垂直水平方向梯度提取

kernel = np.array([[-1,0,1],[-2,0,2],[-1,0,1]], dtype=np.float32)

dst_image = cv2.filter2D(image_np, -1, kernel) # 垂直边缘提取

dst_image = cv2.filter2D(image_np, -1, kernel.T) #水平边缘提取

2.Sobel算子

sobel_img = cv2.Sobel(src,ddepth,dx,dy,ksize)

3.Laplacian算子

laplacian = cv2.Lapalcian(src,ddepth)

图像边缘检测

1.高斯滤波

2.计算图像梯度与方向

3.非极大值抑制

非极大值抑制的目的是在已经计算出图像梯度幅度图像的基础上,进一步细化边缘位置,减少假响应并确保边缘轮廓的一致性和单像素宽度。

非极大值抑制会沿着梯度方向检查像素点的梯度幅值是否是其邻域内(包括梯度方向指向的临近像素点)的最大值。

4.双阈值筛选

双阈值检测的目的是基于非极大值抑制后的梯度幅值图像,通过设定高低两个阈值来区分强边和弱边,并有效连接这些边缘点构成完整的边缘线。

edges = cv2.Canny(image, threshold1, threshold2)

绘制图像轮廓

findContours

contours,hierarchy = cv2.findContours(img,mode,method)

  • contours:表示获取到的轮廓点的列表。检测到有多少个轮廓,该列表就有多少子列表,每一个子列表都代表了一个轮廓中所有点的坐标。

  • hierarchy:表示轮廓之间的关系。对于第i条轮廓,hierarchyi, hierarchyi, hierarchyi, hierarchyi分别表示其后一条轮廓、前一条轮廓、(同层次的第一个)子轮廓、父轮廓的索引(如果没有对应的索引,则为负数)。该参数的使用情况会比较少。

mode参数

RETR_LIST

表示列出所有的轮廓。并且在hierarchy里的轮廓关系中,每一个轮廓只有前一条轮廓与后一条轮廓的索引,而没有父轮廓与子轮廓的索引。

RETR_EXTERNAL **(常用)**

表示只列出最外层的轮廓。并且在hierarchy里的轮廓关系中,每一个轮廓只有前一条轮廓与后一条轮廓的索引,而没有父轮廓与子轮廓的索引。

RETR_CCOMP

表示列出所有的轮廓。并且在hierarchy里的轮廓关系中,轮廓会按照成对的方式显示。

RETR_TREE

表示列出所有的轮廓。并且在hierarchy里的轮廓关系中,轮廓会按照树的方式显示,其中最外层的轮廓作为树根,其子轮廓是一个个的树枝。

method参数

CHAIN_APPROX_NONE表示将所有的轮廓点都进行存储;

CHAIN_APPROX_SIMPLE(常用)

一种边缘检测算法,可以对轮廓进行逼近,减少轮廓中的冗余点,从而更加准确地表示轮廓的形状。就是表示只存储有用的点,比如直线只存储起点和终点,四边形只存储四个顶点,默认启用这个方法;CHAIN_APPROX_TC89_L1表示使用Teh-Chin链逼近算法进行轮廓逼近。这种方法应用的是Teh-Chin链码,它

CHAIN_APPROX_TC89_L1是一种较为精确的轮廓逼近方法,适用于需要较高精度的轮廓表示的情况。

drawcontours

cv2.drawContours(contour_image, contours, -1, (0, 0, 255), 2)

  • image:原始图像,一般为单通道或三通道的 numpy 数组。

  • contours:包含多个轮廓的列表,每个轮廓本身也是一个由点坐标构成的二维数组(numpy数组)。

  • contourIdx:要绘制的轮廓索引。如果设为 -1,则会绘制所有轮廓。

  • color:绘制轮廓的颜色,可以是 BGR 值或者是灰度值(对于灰度图像)。

  • thickness负数,则填充轮廓内的区域。就是:轮廓线的宽度,如果是正数,则画实线;若是

凸包点检测

cv2.convexHull(points,hull=None,clockwise=False,returnPoints=True)

  • points:输入参数,图像的轮廓

  • hull(可选):输出参数,用于存储计算得到的凸包顶点序列,如果不指定,则会创建一个新的数组。

  • clockwise(可选):布尔值,如果为True,则计算顺时针方向的凸包,否则默认计算逆时针方向的凸包。

  • returnPoints(可选):布尔值,如果为True(默认),则函数返回的是原始点集中的点构成的凸包顶点序列;如果为False,则返回的是凸包顶点对应的边界框内的索引。

cv2.polylines(img,pts,isClosed,color,thickness=1)

  • image:要绘制线条的目标图像,它应该是一个OpenCV格式的二维图像数组(如numpy数组)。

  • pts:一个二维 numpy 数组,每个元素是一维数组,代表一个多边形的一系列顶点坐标。

  • isClosed:布尔值,表示是否闭合多边形,如果为 True,会在最后一个顶点和第一个顶点间自动添加一条线段,形成封闭的多边形。

  • color:线条颜色,可以是一个三元组或四元组,分别对应BGR或BGRA通道的颜色值,或者是灰度图像的一个整数值。

  • thickness(可选):线条宽度,默认值为1。

图像轮廓特征查找

1.外接矩形

cv2.boundingRect(cnt)

cnt:for cnt in contours 遍历轮廓找最大的x,y

2.最小外接矩形

找到最小

contours, hierarchy = cv2.findContours(image_np_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)**

rect = cv2.minAreaRect(cnt)

box = np.int0(cv2.boxPoints(rect))

cv2.boxPoints(rect)返回 是一个形状为 4行2列的数组,每一行代表一个点的坐标(x, y),顺序按照逆时针或顺时针方向排列

将最小外接矩形转换为边界框的四个角点,并转换为整数坐标

绘制最小

cv2.drawContours(image, contours, contourIdx, color, thickness)

cv2.drawContours(circumscribed_contour_image, [box], 0, (0, 0, 255), 2)

3.最小外接圆

(x,y),radius = cv2.minEnclosingCircle(cnt)

参数说明:

  • points:输入参数图片轮廓数据

返回值:

  • center:一个包含圆心坐标的二元组 (x, y)

  • radius:浮点数类型,表示计算得到的最小覆盖圆的半径。

cv2.circle(circumscribed_contour_image,(x,y),radius,(0,0255),2)

直方图均衡化

1.绘制直方图

hist = cv2.calcHist(images,channels,mask,histSize,ranges)

  • images:输入图像列表,可以是一幅或多幅图像(通常是灰度图像或者彩色图像的各个通道)。

  • channels:一个包含整数的列表,指示在每个图像上计算直方图的通道编号。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。

  • mask(可选):一个与输入图像尺寸相同的二值掩模图像,其中非零元素标记了参与直方图计算的区域,None为全部计算。

  • histSize:一个整数列表,也就是直方图的区间个数(BIN 的数目)。用中括号括起来,例如:[256]。

  • ranges:每维数据的取值范围,它是一个二维列表,每一维对应一个通道的最小值和最大值,例如对灰度图像可能是 [0, 256]

一个长度为255的数组,数组中的每个值表示图像中对应灰度等级的像素计数就是返回值hist

minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(hist)

获取直方图的最小值、最大值及其对应最小值的位置索引、最大值的位置索引

cv2.line(img,pt1,pt2,color,thickness)

2.直方图均衡化

一副效果好的图像通常在直方图上的分布比较均匀,直方图均衡化就是用来改善图像的全局亮度和对比度。

自适应直方图均值化:以255*占比

dst = cv.equalizeHist(imgGray)

对比度受限的自适应直方图均衡化:

<u>clahe = cv2.createCLAHE(clipLimit=None,tileFridSize=None)</u>

  • clipLimit(可选):对比度限制参数,用于控制直方图均衡化过程中对比度增强的程度。要是设置一个大于1的值(如2.0或4.0),CLAHE会限制对比度增强的最大程度,避免过度放大噪声。如果不设置,OpenCV会使用一个默认值。

  • tileGridSize(可选):图像分块的大小,通常是一个包含两个整数的元组,如(8, 8),表示将图像划分成8x8的小块进行独立的直方图均衡化处理。分块大小的选择会影响到CLAHE的效果以及处理速度。

创建CLAHE对象后,可以使用 .apply() 方法对图像进行CLAHE处理:

img = clahe.apply(image)

模板匹配

res = cv2.matchTemplate(img,templ,method)

通过method:匹配方式,能够是以下之一:

越大越好:

  • cv2.TM_CCOEFF 相关系数匹配 (均值与像素之差的乘积求和)

  • cv2.TM_CCOEFF_NORMED 归一化相关系数匹配

  • cv2.TM_CCORR 相关匹配 (乘积)

  • cv2.TM_CCORR_NORMED 归一化相关匹配

    越接近0越好:

  • cv2.TM_SQDIFF 平方差匹配

  • cv2.TM_SQDIFF_NORMED 归一化平方差匹配

一个结果矩阵,与原图大小相同,每个元素表示匹配的相似度。就是由于matchTemplate返回

所以利用res进行绘图要先解包

绘制轮廓

loc = np.where(arr>0.8) # loc包含array中所有大于0.8的**元素索引**的数组

for pt in zip(*loc):
    right_bottom = (pt[1] + w, pt[0] + h)
    cv2.rectangle(image_np, pt[::-1], right_bottom, (0, 0, 255), 2)

霍夫变换

霍夫直线变换

lines = cv2.HoughLines(img,roh,theat,threshold)

统计概率霍夫直线变换

lines=cv2.HoughLinesP(img,rho,theta,threshold,lines=None,minLineLength=0,maxLineGap=0)

霍夫圆变换

circle = cv2.HoughCircles(img,method,dp,minDist,param1,param2)


  • image:输入图像,通常是灰度图像。

  • method:使用的霍夫变换方法:霍夫梯度法,可以是 cv2.HOUGH_GRADIENT,这是唯一在OpenCV中用于圆检测的方法。

  • dp:累加器分辨率与输入图像分辨率之间的降采样比率,用于加速运算但不影响准确性。设置为1表示霍夫梯度法中累加器图像的分辨率与原图一致

  • minDist:检测到的圆心之间的最小允许距离,以像素为单位。在霍夫变换检测圆的过程中,可能会检测到许多潜在的圆心。minDist 参数就是为了过滤掉过于接近的圆检测结果,避免检测结果过于密集。当你设置一个较小的 minDist 值时,算法会尝试找出尽可能多的圆,即使是彼此靠得很近的圆也可能都被检测出来。相反,当你设置一个较大的 minDist 值时,算法会倾向于只检测那些彼此间存在一定距离的独立的圆。

    例如,如果你设置 minDist 很小,可能在真实图像中存在的一个大圆旁边的一些噪声点会被误判为多个小圆;而如果设置 minDist 较大,则可以排除这种情况,只保留明显分离的圆的检测结果。

  • param1param2:这两个参数是在使用 cv2.HOUGH_GRADIENT 方法时的特定参数,分别为:

    • param1(可选):阈值1,决定边缘强度的阈值。

    • param2:阈值2,控制圆心识别的精确度。较大的该值会使得检测更严格的圆。param2 通常被称为圆心累积概率的阈值。在使用霍夫梯度方法时,param2 设置的是累加器阈值,它决定了哪些候选圆点集合被认为是有效的圆。较高的 param2 值意味着对圆的检测更严格,只有在累加器中积累了足够高的响应值才认为是真实的圆;较低的 param2 值则会降低检测的门槛,可能会检测到更多潜在的圆,但也可能包含更多的误检结果。

      举个例子,如果你将 param2 设置得较高,那么算法只会返回那些边缘强烈符合圆形特征且周围有足够的支持像素的圆;而如果设置得较低,即使边缘特征不是很强烈,只要有一些证据支持就可能将其视为一个圆。

返回值:cv2.HoughCircles 返回一个二维numpy数组,包含了所有满足条件的圆的参数。

图片亮度变换

1.线性变换

cv2.addWeighted(src1, alpha, src2, beta, gamma)

2.直接像素修改

numpy.clip(a, a_min, a_max)

posted @ 2025-08-11 11:44  yfceshi  阅读(11)  评论(0)    收藏  举报