
opencv笔记
opencv-python笔记
嘎嘎嘎,好玩,真好玩
sweetheart7-7
学习笔记
展开
-
人脸检测与数字验证码识别
使用Haar分类器进行面部检测简单介绍Haar特征分类器对象检测技术它是基于机器学习的,通过使用大量的正负样本图像训练得到一个cascade_function,最后再用它来做对象检测。如果你想实现自己的面部检测分类器,需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。 可参考https://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html,这里不做介绍,现在我们利用OpenCV已经训练好的分类器,直接利用它来实现原创 2021-02-09 18:51:01 · 3657 阅读 · 0 评论 -
分水岭算法
详细解释:https://baijiahao.baidu.com/s?id=1656610125269278567&wfr=spider&for=pcimport cv2 as cvimport numpy as np"""分水岭算法原理: 任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是 山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水 汇合,我们需要在水汇合的原创 2021-02-08 11:38:55 · 788 阅读 · 0 评论 -
开闭操作及其他形态学操作
import cv2 as cvimport numpy as np"""开运算:先进性腐蚀再进行膨胀就叫做开运算,它被用来去除噪声。闭运算:先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点.这里我们用到的函数是 cv2.morphologyEx().开闭操作作用:1. 去除小的干扰块-开操作2. 填充闭合区间-闭操作3. 水平或垂直线提取,调整kernel的row,col值差异。比如:采用开操作,kernel为(1, 15),提取垂直线,kernel为...原创 2021-02-07 20:45:56 · 363 阅读 · 0 评论 -
图像的膨胀与腐蚀
形态学操作是根据图像形状进行的简单操作.一般情况下对二值化图像进行的操作.需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的.两个基本的形态学操作是腐蚀和膨胀.他们的变体构成了开运算,闭运算,梯度等import cv2 as cvdef erode_demo(image): """ 就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色). 卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1, 那么中原创 2021-02-07 19:09:28 · 427 阅读 · 0 评论 -
对象测量
import cv2 as cvimport numpy as npdef measure_object(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU) print("threshold value: %s" % ret) cv.imshow("bi..原创 2021-02-07 12:23:51 · 331 阅读 · 0 评论 -
轮廓发现
详细介绍:https://blog.youkuaiyun.com/u010847519/article/details/72354811. 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。. 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测. 查找轮廓的函数会修改原始图像。如果在找到轮廓之后还想使用原始图像的话,应该将原始图像存储到其他变量中.. 在 OpenCV 中,查找轮廓就像在黑色背景中找原创 2021-02-06 22:35:21 · 350 阅读 · 0 评论 -
霍夫变换
投票法确定某直线对应的r 和 θ通过每个点的梯度画梯度方向的直线,确定圆心在用投票法由圆心确定半径import cv2 as cvimport numpy as npdef line_detection(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # aperture_size 可以设置sobel 算子的大小。 # 50低阈值, 150高阈值 edges = cv.Canny(gray, 5.原创 2021-02-04 17:40:07 · 607 阅读 · 0 评论 -
Canny边缘提取
非极大值抑制:算法使用一个3×3邻域作用在幅值阵列M[i,j]的所有点上;每一个点上,邻域的中心像素M[i,j]与沿着梯度线的两个元素进行比较,其中梯度线是由邻域的中心点处的扇区值ζ[i,j]给出。如果在邻域中心点处的幅值M[i,j]不比梯度线方向上的两个相邻点幅值大,则M[i,j]赋值为零,否则维持原值;此过程可以把M[i,j]宽屋脊带细化成只有一个像素点宽,即保留屋脊的高度值。高低阈值连接T1,T2为阈值,凡是高于T2的都保留,凡是低于T1的都丢弃从高于T2的像素出发,凡是大...原创 2021-02-04 12:34:45 · 357 阅读 · 1 评论 -
图像梯度
import cv2 as cvimport numpy as np# 图像梯度(由x,y方向上的偏导数和偏移构成),有一阶导数(sobel算子)和二阶导数(Laplace算子)# 用于求解图像边缘,一阶的极大值,二阶的零点# 一阶偏导在图像中为一阶差分(2个相邻像素之间的差值),再变成算子(即权值)与图像像素值乘积相加,二阶同理# 即通过不同的算子/卷积核来实现求偏导def sobel_demo(image): # (src, ddepth, dx, dy) # gr...原创 2021-02-02 22:40:53 · 267 阅读 · 0 评论 -
图像金字塔
import cv2 as cvimport numpy as np# 要求图片宽和高相同# 图像金字塔和拉普拉斯金字塔(L1 = g1 - expand(g2)):reduce:高斯模糊+降采样,expand:扩大+卷积# PyrDown降采样,PyrUp上采样def pyramid_demo(image): level = 4 temp = image.copy() pyramid_images = [] for i in range(level)...原创 2021-02-02 21:16:34 · 121 阅读 · 0 评论 -
图像的二值化
二值图像就是将灰度图转化成黑白图有全局和局部两种如果是一副双峰图像(简单来说双峰图像是指图像直方图中存在两个峰)呢?我们应该在两个峰之间的峰谷选一个值作为阈值?这就是 Otsu 二值化要做的。简单来说就是对一副双峰图像自动根据其直方图计算出一个阈值。(对于非双峰图像,这种方法得到的结果可能会不理想)。import cv2 as cvimport numpy as npimport matplotlib.pyplot as plt# 二值图像就是将灰度图转化成黑白图# 有全局和局部两种#原创 2021-01-31 21:59:48 · 450 阅读 · 0 评论 -
背景检出
opencv中的GMM(混合高斯分布)算法原理import cv2 as cvimport numpy"""在很多基础应用中背景检出都是一个非常重要的步骤。例如顾客统计,使用一个静态摄像头来记录进入和离开房间的人数,或者是交通摄像头,需要提取交通工具的信息等。在所有的这些例子中,首先要将人或车单独提取出来。技术上来说,我们需要从静止的背景中提取移动的前景。如果图像中的交通工具还有影子的话,那这个工作就更难了,因为影子也在移动,仅仅使用减法会把影子也当成前景,这是一件很复杂的事情。 为了实原创 2021-01-31 18:16:55 · 301 阅读 · 0 评论 -
模板匹配
import cv2 as cvimport numpy as np# 模板匹配,就是在整个图像区域发现与给定子图像匹配的小块区域,# 需要模板图像T和待检测图像-源图像S# 工作方法:在待检测的图像上,从左到右,从上倒下计算模板图像与重叠子图像匹配度,# 匹配度越大,两者相同的可能性越大。def template_demo(): tpl = cv.imread("./images/rabbit.jpg") target = cv.imread("./images/Crysta原创 2021-01-31 17:15:22 · 360 阅读 · 0 评论 -
直方图反向投影
反向投影可以用来做图像分割, 或者在图像中找寻我们感兴趣的部分。它会输出与输入图像(待搜索)同样大小的图像, 其中的每一个像素值代表了输入图像上对应点属于目标对象的概率。输出图像中像素值越高(越白)的点就越可能代表我们要搜索的目标(在输入图像所在的位置)。直方图投影经常与camshift 算法等一起使用。步骤:1. 为一张包含我们要查找目标的图像创建直方图, 我们要查找的对象要尽量占满这张图像。最好使用颜色直方图,因为一个物体的颜色要比它的灰度能更好的被用来进行图像分割与对象识别。2. 再把.原创 2021-01-29 19:07:13 · 390 阅读 · 0 评论 -
直方图及直方图的应用
import cv2 as cvimport matplotlib.pyplot as pltimport numpy as npdef plot_demo(image): # image.ravel()将图像展开为一行, 256为bins数量, [0, 256]为x轴范围 # (x, bins = None, range) # print(image.ravel().shape) plt.hist(image.ravel(), 256, [0, 256])原创 2021-01-29 19:00:39 · 690 阅读 · 0 评论 -
边缘保留滤波EPF
更多参考:https://zhuanlan.zhihu.com/p/127023952 ***https://blog.youkuaiyun.com/keith_bb/article/details/54427779https://blog.youkuaiyun.com/dcrmg/article/details/52705087import cv2 as cvdef bi_demo(image): # (src, d, sigmaColor, sigmaSpace, dst=None, bo原创 2021-01-29 14:06:57 · 249 阅读 · 0 评论 -
图像模糊处理
一些图像知识:噪声:主要有三种:椒盐噪声(Salt & Pepper):含有随机出现的黑白亮度值。脉冲噪声:只含有随机的正脉冲和负脉冲噪声。高斯噪声:含有亮度服从高斯或正态分布的噪声。高斯噪声是很多传感器噪声的模型,如摄像机的电子干扰噪声。滤波器:主要两类:线性和非线性线性滤波器:使用连续窗函数内像素加权和来实现滤波,同一模式的权重因子可以作用在每一个窗口内,即线性滤波器是空间不变的。如果图像的不同部分使用不同的滤波权重因子,线性滤波器是空间可变的。因此可以使用卷积模板来实现滤波。原创 2021-01-29 12:19:23 · 1363 阅读 · 0 评论 -
图像的变换
对图像进行各种几个变换, 例如移动, 旋转, 仿射变换等。函数为:cv2.getPerspectiveTransform代码参考:https://blog.youkuaiyun.com/songchunxiao1991/article/details/80226510变换 OpenCV提供了两个变换函数, cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数可以实现所有类型的变换.cv2.warpAffine 接收的参数是2×3的变换矩阵, 而 cv2.warpPerspectiv原创 2021-01-29 09:24:54 · 411 阅读 · 0 评论 -
ROI与泛洪填充
[h+2, w+2], np.uint8 参数固定用法floodFill默认在为0的区域进行填充mask = np.zeros([h+2, w+2], np.uint8)将指定区域内的指定色彩范围,填充为新的颜色image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None(1.操作的图像, 2.掩模, 3.取此点的像素值, 4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值, 7.填充的方法)低值 = 参.原创 2021-01-28 22:14:49 · 211 阅读 · 0 评论 -
像素运算
(src1, alpha, src2, beta, gamma)图像混合,alpha, beta为这两张图片的权重gamma, 图1与图2作和后添加的数值. 不要太大, 不然图片一片白.dst = cv.addWeighted(image, c, blank, 1-c, b)对像素值进行逻辑运算cv.bitwise_xx()运用上述的与运算特性可以对之前章节的特定颜色进行提取import cv2 as cvimport numpy as np# 对图像像素进行加减乘除def ad原创 2021-01-28 00:23:47 · 378 阅读 · 0 评论 -
色彩空间的转换
颜色空间转换, 从bgr到hsvhsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)用inRange函数提取指定颜色范围,其余置为(0)黑,这里对hsv来处理mask = cv.inRange(hsv_image, lowerb=lower_hsv, upperb=upper_hsv)import cv2 as cvimport numpy as np# 颜色空间转换, 从bgr到gray, hsv, yuv, ycrcbdef color_s.原创 2021-01-27 21:47:27 · 517 阅读 · 0 评论 -
颜色滑动条
获取滑动条当前值(参数: 滑动条的名字, 滑动条被放置窗口的名字)r = cv.getTrackbarPos(“R”, “image”)trackbarName(滑动条的名字), windowName(滑动条被放置窗口的名字), value(滑动条的默认位置), count(滑动条的最大值), onChange(回调函数)每次滑动条的滑动都会调用回调函数, 传递的默认参数为滑动条的当前位置cv.createTrackbar(“R”, “image”, 0, 255, nothing)import原创 2021-01-27 20:37:16 · 271 阅读 · 0 评论 -
opencv常用画图函数
画这些图形时需要指定在哪个图片上画比如img,显示时,只需要显示图片cv.imshow("image", img)即可import cv2 as cvimport numpy as np"""绘图函数:cv2.line(),cv2.circle(),cv2.rectangle(), cv2.ellipse(),cv2.putText() 等。"""def draw(img): # img, pt1(起点坐标), pt2(终点坐标), color, thickness cv.原创 2021-01-27 20:07:05 · 331 阅读 · 0 评论 -
opencv绑定鼠标事件函数
setMouseCallback()函数创建图像与窗口并将窗口与回调函数绑定当在此窗口有鼠标事件发生时,将(事件, x坐标, y坐标, 是否点击鼠标0/1)作为参数传递给回调函数cv.EVENT_LBUTTONDBLCLK如果事件双击左键发生cv.circle(img, (x, y), 100, (255, 255, 0), 2)画一个半径为100px BGR为(255,255,0)粗细为3px的圆圈import cv2 as cv"""在双击过的地方绘制一个圆圈"""# 查看所原创 2021-01-27 18:41:18 · 354 阅读 · 3 评论 -
初识opencv
import cv2 as cvimg = cv.imread("./images/1.jpg") # 读入图片# 创建一个窗口,第一个参数是窗口名, 第二个参数代表自适应大小,也可指定尺寸cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)# 指定窗口显示图片,(窗口名, 图片)cv.imshow("input image", img)# 等有键输入或者1000ms后自动将窗口消除,0表示只有键输入才结束窗口# 返回值为输入键的ASCII值原创 2021-01-26 20:10:35 · 168 阅读 · 1 评论