opencv-python

基本操作

每个像素点值在0-255之间,值越小越黑,越大越白 opencv读取格式是BGR

cv2.IMREAD_COLOR 彩色图像

cv2.IMREAD_GRAYSCALE 灰色图像

图片读取

cv2.imread(‘cat.png’,cv2.IMREAD_COLOR) 读取数据,彩色数据

cv2.imread(‘cat.png’,cv2.IMREAD_GRAYSCALE) 读取数据并转换成灰度图

视频读取

cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。

如果是视频文件,直接指定好路径即可。

vc=cv2.VideoCapture(path)

open,frame = vc.read()

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

open布尔值,表示是否读取了

frame表示一帧图像

颜色通道提取

b,g,r = cv2.split(img) 拆分成三个通道
img = cv2.merge((b,g,r))合并,合并成原来的BGR格式图片

边界填充

cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType)

  • BORDER_REPLICATE 复制法,也就是复制最边缘像素。
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称
  • BORDER_WRAP:外包装法
  • BORDER_CONSTANT:常量法,常数值填充。需要指定 value=

数值计算

读取数据得到的是numpy数组,所以图像之间可以进行相关的数值计算,当数据相加时数组的大小应该是相同的。
cv2.resize(path,(100,100))改变图像大小
cv2.addWeighted(path,weight1,path2,weight2,bias)实现图像融合 R=pathweight1+path2weight2+bias

图像处理

图像阈值

ret, dst = cv2.threshold(src, thresh, maxval, type)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图

  • dst: 输出图

  • ret: 返回阈值

  • thresh: 阈值

  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

    • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
    • cv2.THRESH_BINARY_INV THRESH_BINARY的反转
    • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
    • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
    • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

图像平滑

均值滤波cv2.blur(path,(3,3))
方框滤波cv2.boxFilter(path,(3,3),normalize=True)可以指定是否归一化,若归一化则和均值滤波相同,若不指定这容易产生越界
高斯滤波cv2.GaussianBlur(path,(3,3),1),高斯卷积核中的数值是满足高斯分布的,相当于更重视中间的
中值滤波cv2.medianBlur(path,5)

腐蚀操作

腐蚀操作原理:存在一个kernel,比如(3,3),在图像中不断平移,在这个方框中,哪个颜色占比最多,就将该颜色覆盖到整个方框中。
cv2.erode(img,kernel,iterations)
iterations迭代次数

膨胀操作

膨胀操作原理:存在一个kernel,在图像上进行平移,如果方框中存在白色,那么这个方框内所有颜色都是白色。
cv2.dilate(img,kernel,iterations)

开运算与闭运算

morphology:形态学

  • 开运算:先腐蚀,在膨胀
    • 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)

梯度

sobel算子

在这里插入图片描述
cv2.Sobel(src, ddepth, dx, dy, ksize)

  • ddepth:图像的深度,一般为-1
  • dx和dy分别表示水平和竖直方向,判断是计算x方向还是y方向,通过指定0or1
  • ksize是Sobel算子的大小
    在sobel进行梯度计算时,可能得到的梯度并不是一个正值,当得到负值时默认会被截断为0,在实际应用中我们关心的是相对梯度大小,也就是无论正负值都显示出来。
    关于opencv中的数据类型可以参考:opencv数据类型
    1 0表示DX
    0 1表示DY
    cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
    cv2.convertScaleAbs(sobelx)

Scharr算子

在这里插入图片描述
Scharr算子的使用类似与sobel算子
cv2.Scharr(img,cv2.CV_64F,1,0)
cv2.convertScaleAbs(scharrx)

拉普拉斯算子

在这里插入图片描述
cv2.Laplacian(img,cv2.CV_64F)
cv2.convertScaleAbs(laplacian)

Canny边缘检测

  • 使用高斯滤波器,以平滑图像,滤除噪声。

  • 计算图像中每个像素点的梯度强度和方向。

  • 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应(如人脸检测的框的确定)。

  • 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

  • 通过抑制孤立的弱边缘最终完成边缘检测。
    Canny边缘检测使用
    cv2.imread(path,cv2.IMREAD_GRAYSCALE)
    cv2.Canny(img,minval,maxval)

图像轮廓

寻找轮廓
binary, contours, hierarchy =cv2.findContours(img,mode,method)

  • binary:就是刚才输入的二值图像
  • contours:list结构,保存的是轮廓点
  • hierarchy:保存的层级信息
    mode:轮廓检索模式
  • RETR_EXTERNAL :只检索最外面的轮廓;
  • RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
  • RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
  • RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;(一般最常使用)
    method:轮廓逼近方法
  • CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
  • CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
    绘制轮廓
    cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
  • cv2.drawContours()绘制轮廓函数
  • draw_img:在原图像上绘制轮廓
  • contours:轮廓
  • -1:画所有轮廓,如果是2,表示画第2个轮廓
  • (0, 0, 255):BGR的颜色通道,自己选定绘制轮廓的颜色
  • 2:绘制线条的宽度
    轮廓特征
    面积:
    cnt = contours[0]
    cv2.contourArea(cnt)
    周长:
    cv2.arcLength(cnt,True) True表示曲线是闭合的
    外接矩形
    x,y,w,h = cv2.boundingRect(cnt)
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
    外接圆
    (x,y),radius = cv2.minEnclosingCircle(cnt)
    img = cv2.circle(img,center,radius,(0,255,0),2)

模板匹配

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,越相关
  • 最好使用带归一化的结果
    进行模板匹配
    返回每个窗口左上角的值和损失大小

直方图

统计图像中相同像素点值的个数
cv2.calcHist(images,channels,mask,histSize,ranges)

  • images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
  • channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
  • mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。
  • histSize:BIN 的数目(直方图中的横坐标的数目)。也应用中括号括来
  • ranges: 像素值范围常为 [0-256]
    使用方法
    cv2.calcHist([img],[0],None,[256],[0,256])

直方图均衡化

cv2.equalizeHist(img)
自适应直方图均衡化
分块做均衡化
但是更可能会受到噪声点的影响
cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))

频域

  • 高频:变化剧烈的灰度分量
    • 高频滤波,使得图像细节增强
  • 低频:变化缓慢的灰度分量
    • 低频滤波 使得图像模糊
      使用方法
  • opencv中主要就是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32 格式。
  • 得到的结果中频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现。
  • cv2.dft()返回的结果是双通道的(实部,虚部),通常还需要转换成图像格式才能展示(0,255)。
    1、dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
    2、dft_shift = np.fft.fftshift(dft)
    3、magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV-Python是OpenCV的Python绑定库,它提供了丰富的计算机视觉功能和图像处理算法。它可以用于图像处理、对象检测、特征提取和跟踪、图像分割等任务。为了安装OpenCV-Python,您可以使用pip命令。如果只需要主要模块,可以运行"pip install opencv-python",如果还需要额外的贡献模块,可以运行"pip install opencv-contrib-python"。根据不同的需求,您可以选择安装不同的版本。目前有OpenCV2和OpenCV3两个大版本,OpenCV3提供了更多功能和方便的特性,但是考虑到与深度学习框架的兼容性和安装的难度,我们推荐先使用OpenCV2进行学习和应用。为了更方便地安装OpenCV-Python,您可以使用以下命令:"pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple"。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [OpenCV-python安装教程](https://blog.csdn.net/qq_41627235/article/details/87692748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【基础知识】4、python-opencv 超详细介绍](https://blog.csdn.net/jiaoyangwm/article/details/79961778)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值