opencv-python基础知识

图像起点为左上角,两条轴方向分别向右和向下

读取图片

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。

相关推荐
星火撩猿1 小时前
OpenCv实战笔记(1)在win11搭建opencv4.11.1 + qt5.15.2 + vs2019_x64开发环境
笔记·qt·opencv
蓝莓味柯基2 小时前
Python 学习路线与笔记跳转(持续更新笔记链接)
笔记·python·学习
岑梓铭3 小时前
考研408《计算机组成原理》复习笔记,第二章计算机性能
笔记·考研·408·计算机组成原理
这个家伙很笨5 小时前
了解Android studio 初学者零基础推荐(1)
android·笔记·android studio
珊瑚里的鱼5 小时前
LeetCode 102题解 | 二叉树的层序遍历
开发语言·c++·笔记·算法·leetcode·职场和发展·stl
264玫瑰资源库5 小时前
网狐旗舰大联盟组件源码私测笔记:结构分层、UI重构与本地实操全流程
java·前端·数据库·笔记·ui·重构
science怪兽8 小时前
【进阶】C# 委托(Delegate)知识点总结归纳
开发语言·笔记·c#
love530love9 小时前
修复笔记:获取 torch._dynamo 的详细日志信息
运维·人工智能·pytorch·笔记·python·深度学习·virtualenv
ZeroOne电平浪客10 小时前
AUTOSAR_BSW_从入门到精通学习笔记系列_EcuM
笔记·mcu·学习·汽车·autosar·普华小满