图像起点为左上角,两条轴方向分别向右和向下
读取图片
cv2.imread(path[,读取方式])
读取方式:
cv2.IMREAD_COLOR:读取彩色图片,默认
cv2.IMREAD_GRAYSCALE:读取灰度图
窗体创建
cv2.namedWindow("winname"[,窗口属性])
窗口属性:
cv2.WINDOW_AUTOSIZE:默认,窗口会根据加载的图像自动调整大小
Cv2.WINDOW_NORMAL:窗口大小是可调整的,可拖动窗口边缘自动调整
显示图像
Cv2.imshow(窗口名,要显示的图像)
注:在调用显示图像的API后,要调用cv2.waitKey(0),给图像绘制留下时间,否则窗口会出现无响应情况
cv2.waitKey(0):表示无限期等待
cv2.waitKey(n):n>0,代表程序要等待n毫秒
关闭窗口
cv2.destroyAllwindows([窗口名]):销毁打开的窗口,并释放相关资源
保存图像
cv2.imwrite(路径,图像)
截取图像
img[y:y+h,x:x+w]
y:子区域左上角y坐标
h:子区域宽度
x:子区域左上角x坐标
w:子区域长度
调整图像大小
cv2.resize(图像,(w,h))
绘制直线
cv2.line(图像,起点,终点,颜色,线条粗线) (w,h)(B,G,R)
绘制圆形
cv2.circle(图像,圆心坐标,半径,颜色,线条粗细,cv2.line_AA)
线条粗细=-1:填充为一个闭合图形
cv2.line_AA:反走样技术,抗锯齿,使边缘更加平滑,默认为cv2.LINE_8
绘制矩形
cv2.rectangle(图像,左上坐标,右下坐标,颜色,线条粗细)
添加文字
cv2.putText(图像,文本,位置,字体样式,大小,颜色,线条粗细)
读取视频
cap=cv2.VideoCapture(path) #读取本地视频
注:path=0,代表从摄像头读取实时视频流
ret,frame=cap.read()
返回值cap调用read方法,返回一个布尔值和一桢图像,布尔值表示是否成功读到桢,如果为False,可能是读取失败,或者视频结束,如果为True,则是当前桢的图像数据
释放摄像头资源
cap.realse()
0xFF:用于判断按下的按键的ASCLL码,ord()函数用于转换ASCLL码
图像预处理
图像反转(镜像旋转)
cv2.flip(图像,flipcode)
flipcode=0:垂直翻转,沿着x轴翻转,上下翻转
flipcode>0:水平翻转,沿着y轴翻转,左右翻转
Flipcode<0:垂直翻转+水平翻转
图像仿射变换
旋转、平移、缩放、剪切
cv2.warpAffine(img,M,dsize)
仿射变换函数
img:输入图像
M:2*3的变换矩阵,类型为np.float32
dsize:输出图像的尺寸,(w,h)
图像旋转
M=cv2.getRotationMrtix2D()
获取旋转矩阵
center:旋转中心,格式为(x,y)
angle:旋转角度,单位为度,正值表示逆时针旋转,负值表示顺时针旋转
scale:缩放比例,若设为1,则不缩放
图像平移
平移矩阵:
np.float([1,0,tx],
0,1,ty\]) tx:x轴方向平移量 ty:y轴方向平移量 图像缩放 缩放矩阵: np.float(\[sx,0,0\], \[0,sy,0\]) sx:x轴上的缩放因子 sy:y轴上的缩放因子 图像剪切 np.float(\[1,shy,0\], \[shx,1,0\]) shy:x轴上的剪切因子 shx:y轴上的剪切因子 插值方法 flags参数 1.最近邻插值 cv2.INTER_NEAREST cv2.warpAffine(img,M,dsize,flags=cv2.INTER_NEAREST) 2.双线性插值 cv2.INTER_LINEAR 3.像素区域插值 cv2.INTER_AREA 4.双三次插值 cv2.INTER_CUBIC 5.lanczos插值 cv2.INTER_LANCZOS4 边缘填充 boderMode参数 1.边界复制 borderMode=cv2.BODER_REPLICATE cv2.warpAffine(img,M,dsize,flags=cv2.INTER_NEAREST,borderMode=cv.BODER.REPLICATE) 2.边界反射 cv2.BODER_REFLECT 3.边界反射101 cv2.BODER_REFLECT_101 4.边界常数 borderMode=cv2.BODER_CONSTANT,boderValue=(0,0,0) #具体的BGR值 cv2.warpAffine(img,M,dsize,flags=cv2.INTER_NEAREST,borderMode=cv2.BODER_CONSTANT,boderValue=(0,0,0)) 5.边界包裹 cv2.BODER_WRAP 图像校正(透视变换) 把一个图像投影到一个新的平面 获取透视变换矩阵 M=getPerspectiveTransfome(src,dst) src:原图中需要进行透视变换的区域的四个角坐标 dst:新区域的四个角 透视变换函数 cv2.warpPerspective(原图像 , M,dsize,flags,boderMode) 图像色彩空间 1.RGB颜色空间 颜色加法 cv2.add():饱和相加,最大255 numpy相加:两个图像应具有相同的大小和类型,模运算,也就是对256进行取余运算 颜色加权法 cv2.addWighted(图像1,图像1的权重,图像2,图像2的权重,gamma) gamma:亮度调整值 gamma\>0:图像会变亮 gamma=0:亮度不变 gamma\<0:图像会变暗 HSV颜色空间 H:色调 0-360度 S:饱和度 0%-100% V:亮度 图像转换 cv2.cvtColor(图像,转换方式) 彩色图转灰度图:cv2.COLOR_BGR2GRAY 彩色图转HSV:cv2.COLOR_BGR2HSV 灰度图:单通道 BGR:三通道 合并方法 1.最大值法 选出BGR中值最大那个 2.平均值法 三个通道取平均值 3.加权平均 图像的二值化处理 仅由0,1构成,0:黑色,1:白色 全局阈值法 thresh,binary=cv2.threshold(img,thresh,maxval,type) binary:进行二值化后的图像 img:要进行二值化的灰度图 thresh:阈值 type:阈值类型 阈值法:cv2.THRESH_BINARY 大于阈值设为maxval,小于阈值,设为0 反阈值法:cv2.THRESH_BINARY_INV 大于阈值设为0,小于设为maxval 截断阈值法:cv2.THRESH_TRUNC 大于阈值部分设为阈值,小于阈值部分不变 低阈值零处理:cv2.THRESH_TOZERO 大于阈值部分不变,小于阈值部分设为0 超阈值零处理:cv2.THRESH_TOZERO_INV 大于阈值部分设为0,小于阈值部分不变 OTSU阈值法:结合阈值法和反阈值法实现 cv2.THRESH_OTSU+cv2.THRESH_BINARY cv2.THRESH_OTSU+cv2.THRESH_BINARY_INV(默认结合反阈值法) 自适应二值化 适用于明暗分布不均匀的图像 会对图像中所有像素点计算阈值 cv2.adaptiveTreshold(图像,最大阈值,小区域阈值计算方式,二值化方法,选取的小区域面积,最终阈值等于小区域计算出的阈值再减去此值) 小区域阈值计算方式: ADAPTIVE_THRESH_MEAN_C:小区域内取均值 ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核 二值化方法: 阈值法:cv2.THRESH_BINARY 反阈值法::cv2.THRESH_BINARY_INV 图像掩膜 cv2.inRange(img,color_low,color_high) 大小和原图一直,是一个二值化图像 color_low:目标颜色范围的hsv最小值numpy数组 color_high:目标颜色范围的hsv最大值numpy数组 目标颜色区域被设置为白色,其他区域被设置为黑色 与运算 颜色识别:通过掩膜与原图的运算,可以提取出被原图覆盖的区域 cv2.bitwise_and(src1,src2\[,mask\]) src1:输入的原始图像 src2:输入的另一个图,可以和src1一样 mask:掩膜 颜色替换:通过掩膜的布尔索引进行替换 例: #读取图像 img=cv2.imread() #颜色空间转换 img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #创建掩膜 mask=cv2.inRange(img_hsv,color_low,color_high) #位与运算,提取掩膜区域 bit_and=cv2.bitwise(img,img,mask=mask) #通过布尔索引进行颜色替换 img\[mask==255\]=(0,255,0) #替换成绿色 ROI切割 通过numpy数组进行切割 图像添加水印 有颜色logo黑背景+有颜色背景黑logo进行融合 例: #读取背景图和logo bg=cv2.imread() logo=cv2.imread() #获取logo的大小 h,w=logo.shape\[:2
#从背景中切割和logo一样大小的区域
roi=bg[:h,:w]
#将logo转为灰度图
logo_gray=cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
#创建掩膜:白logo
_,white=cv2.thrshold(gray_logo,170,255,cv2.THERSH_BINARY_INV)
#与运算,提取有颜色的logo
fg1=cv2.bitwise(logo, logo, white)
#创建掩膜,黑logo
balck=cv2.threshold(gray_logo,170,255,cv2.THRESH_BIANARY)
#黑logo+切割背景
fg2=cv2.bitwise(roi, roi, black)
#融合
roi[:]=fg1+fg2
cv.imshow("fg",fg)
cv.waitkey(0)
cv.destroyAllWindows()
图像噪点消除
均值滤波
相当于一个模糊操作
cv2.blur(img,ksize)
ksize:卷积核,为一个元组,如:(3,3)
方框滤波
cv2.boxFilter(image,depth,ksize,normalize)
depth:输出图像深度,为-1时输出原图像深度
normalizie:当normalize为True的时候,方框滤波就是均值滤波;normalize为False的时候,相当于求区域内的像素和
高斯滤波
权重
1/16 1/8 1/16 1/8 1/4 1/8 1/16 1/8 1/16
cv2.GaussianBlur(img,ksize,sigmaX)
sigamX:值越大,越模糊
中值滤波
使用区域内的中值代替像素值
cv2.medianBlur(img,ksize)
双边滤波
模糊操作很难保存边缘特征
双边滤波保留了更多的边缘信息
使用两个高斯核:值域和空域
cv2.bilateralFilter(img,ksize,sigma,sigma)
sigma取值最好在10-150
图像梯度处理
cv2.filter2D(img,ddepth,kernel)
kernel:卷积核
垂直边缘提取
kernel=[-1 0 1
-2 0 2
-1 0 1]
水平边缘提取
kernel.T:对上面kernel进行转置
kernel=[-1 -2 -1
0 0 0
-1 -2 -1]
Sobel算子
上面两个卷积核都是Sobel算子
cv2.Sobel(img,ddepth,dx,dx,ksize)
img:输入图像,通常是一个单通道灰度图
ddepth:输出图像深度,-1表示与原图相同
dx,dy:dx=1,dy=0时表示求x方向的一阶导数,dx=0,dy=1时表示求y方向的一阶导数,dx=1,dy=1时表示求xy方向的一阶导数
Laplacian算子
二阶导
f(x-1,y)+f(x+1,y)+f(x,y-1)+f(x,y+1)-4f(x,y)
cv2.Laplacian(img,ddepth)
图像边缘检测
不是一个算子,是一整套方案
高斯滤波->计算梯度与方向->非极大值抑制->双阈值筛选
cv2.Canny(image, threshold1,threshold2)
image:输入的灰度/二值化图像
threshold1:低阈值,决定可能的边缘点
threshold2:高阈值,用于决定强边缘点
绘制图像轮廓
1.查找轮廓
contours,h=cv2.findContours(img,mode,method)
contours:查找到的轮廓点坐标
h:层级关系
img:要进行查找的图像,必须是二值化图像
mode:如何找,
cv2.RETR_EXTERNAL,只查找最外层轮廓,每一条轮廓只有前一条轮廓与后一条轮廓的索引,没有父轮廓与子轮廓的索引;
cv2.RETR_LIST,列出所有轮廓,每一条轮廓只有前一条轮廓与后一条轮廓的索引,没有父轮廓与子轮廓的索引;
cv2.RETR_CCOMP:列出所有轮廓,轮廓分为两种模式,层级0:最外层轮廓,层级1:所有内部轮廓;
cv2.RETR_TREE:列出所有轮廓,轮廓会按照树的方式显示,最外层轮廓作为树根,其子轮廓是一个一个的树枝
method:如何存,CHAIN_APPROX_NONE:全部点存储;CHAIN_APPROX_SIMPLE:只存储顶点;CHAIN_APPROX_TC89_L1
2.绘制轮廓
cv2.darwContours(img,contours,-1(要绘制轮廓的索引),color,线条宽度)
凸包特征检测
1.获取凸包点
cv2.convexHull(points)
points:轮廓点
2.绘制凸包
cv2.polylines(img,pts,isClosed,color,thickness=1)
pts:凸包点
isClosed:布尔类型,表示是否闭合多边形
图像轮廓特征查找
也就是查找外接轮廓
1.外接矩形
cv2.boundingRect(轮廓点)
传入轮廓点坐标,返回x,y,w,h
2.绘制最小外接矩形
旋转卡壳法
rect=cv2.minAreaRect(轮廓点)
rect 是计算轮廓最小面积外接矩形:rect 结构通常包含中心点坐标 (x, y)、宽度 width、高度 height 和旋转角度 angle
cv2.boxPoints(rect).astype(int)
返回四行两列的数组,每一行代表一个坐标的(x,y)
3.最小外接圆
cv2.minEnclosingCircle(轮廓点)
返回值:
center:一个包含圆心坐标的的二元组(x,y)
radius:半径,浮点数类型
直方图均衡化
绘制直方图
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]。
返回值hist 是一个长度为255的数组,数组中的每个值表示图像中对应灰度等级的像素计数
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)
获取直方图的最小值、最大值及其对应最小值的位置索引、最大值的位置索引
cv2.line(img, pt1, pt2, color, thickness)
img:原始图像,即要在上面画线的numpy数组(一般为uint8类型)。
pt1 和 pt2:分别为线段的起点和终点坐标,它们都是元组类型,例如 (x1, y1) 和 (x2, y2) 分别代表线段两端的横纵坐标。
color:线段的颜色,通常是一个包含三个元素的元组 (B, G, R) 表示BGR色彩空间的像素值,也可以是灰度图像的一个整数值。
thickness:线段的宽度,默认值是1,如果设置为负数,则线宽会被填充。
均衡化
1.自适应直方图均衡化
dst = cv.equalizeHist(imgGray)
imgGray为需要直方图均衡化的灰度图,返回值为处理后的图像
2.对比度受限的自适应直方图均衡化
clahe=cv2.creatCLAHE(cilpLimit=None,tileGridSize=None)
clipLimit(可选):对比度限制参数,用于控制直方图均衡化过程中对比度增强的程度。如果设置一个大于1的值(如2.0或4.0),CLAHE会限制对比度增强的最大程度,避免过度放大噪声。如果不设置,OpenCV会使用一个默认值。
tileGridSize(可选):图像分块的大小,通常是一个包含两个整数的元组,如(8, 8),表示将图像划分成8x8的小块进行独立的直方图均衡化处理。分块大小的选择会影响到CLAHE的效果以及处理速度。
创建CLAHE对象后,可以使用 .apply() 方法对图像进行clahe处理:
img=clahe.apply(image)
image:要均衡化的图像。
img均衡后的图像
霍夫变换
边缘检测->亮度明显改变的部分
轮廓检测->在边缘中寻找封闭的曲线
霍夫变换->在边缘或轮廓中寻找特定几何形状
1.霍夫直线变换
lines=cv2.HoughLines(image,roh,theta,threshold)
image:输入图像,通常为二值化图像
roh:r的精度,以像素为单位
theta:角度的精度
threshold:累加阈值数,只有超过这个阈值直线才会被返回
返回一个二维数组,每一行代表一条直线在霍夫空间的参数(rho,theta)
2.统计概率霍夫直线变换
lines=cv2.HoughLinesP(image, rho, theta,threshold,lines=None,minLineLength=0,maxLineGap=0)
返回值lines:cv2.HoughLinesP 函数返回一个二维数组,每个元素是一个包含4个元素的数组,分别表示每条直线的起始点和结束点在图像中的坐标(x1, y1, x2, y2)。
3.霍夫圆变换
circle=cv2.HoughCircles(image, method,dp,minDist,param1,param2)
image:输入图像,通常是灰度图像。
method:使用的霍夫变换方法:霍夫梯度法,可以是 cv2.HOUGH_GRADIENT,这是唯一在OpenCV中用于圆检测的方法。
dp:累加器分辨率与输入图像分辨率之间的降采样比率,用于加速运算但不影响准确性。设置为1表示霍夫梯度法中累加器图像的分辨率与原图一致
minDist:检测到的圆心之间的最小允许距离,以像素为单位。在霍夫变换检测圆的过程中,可能会检测到许多潜在的圆心。minDist 参数就是为了过滤掉过于接近的圆检测结果,避免检测结果过于密集。当你设置一个较小的 minDist 值时,算法会尝试找出尽可能多的圆,即使是彼此靠得很近的圆也可能都被检测出来。相反,当你设置一个较大的 minDist 值时,算法会倾向于只检测那些彼此间存在一定距离的独立的圆。
param1 和 param2:这两个参数是在使用 cv2.HOUGH_GRADIENT 方法时的特定参数,分别为:
param1(可选):阈值1,决定边缘强度的阈值。
param2:阈值2,控制圆心识别的精确度。较大的该值会使得检测更严格的圆。param2 通常被称为圆心累积概率的阈值。在使用霍夫梯度方法时,param2 设置的是累加器阈值,它决定了哪些候选圆点集合被认为是有效的圆。较高的 param2 值意味着对圆的检测更严格,只有在累加器中积累了足够高的响应值才认为是真实的圆;较低的 param2 值则会降低检测的门槛,可能会检测到更多潜在的圆,但也可能包含更多的误检结果。
返回值:cv2.HoughCircles 返回一个二维numpy数组,包含了所有满足条件的圆的参数。
图像亮度变换
线性变换
cv2.addweighted(src1,alpha,arc2,beta,gamma)
src1:第一张输入图像,它将被赋予权重 alpha。
alpha:第一个输入图像的权重。
src2:第二张输入图像,它将被赋予权重 beta。
beta:第二个输入图像的权重。
gamma:一个标量,将被添加到权重求和的结果上,可用于调整总体亮度。 计算公式为: dst = src1 * alpha + src2 * beta + gamma
直接像素值修改
numpy.clip(a,a_min,a_max)
a:输入数组。
a_min:指定的最小值,数组中所有小于 a_min 的元素将被替换为 a_min。
a_max:指定的最大值,数组中所有大于 a_max 的元素将被替换为 a_max。