![](https://img-blog.csdnimg.cn/20190801162026547.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
OpenCV
OpenCV python版图像处理
观月执白
春秋诗礼号儒身
封剑无为求道真
三世菩提修罗命
江湖观月执白人
展开
-
图像处理28:轮廓
一、什么是轮廓轮廓可以简单地解释为连接所有连续点(沿着边界),具有相同颜色或强度的曲线。轮廓是形状分析和物体检测和识别的有用工具。• 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测。 • 查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图像的话,应该将原始图像存储到其他变量中。 • 在 OpenCV原创 2017-08-16 03:54:51 · 619 阅读 · 0 评论 -
图像处理27:图像融合
图像金字塔的一个应用是图像融合。例如,在图像缝合中,需要将两幅图叠在一起,但是由于连接区域图像像素的不连续性,整幅图的效果看起来会很差。这时图像金字塔就可以排上用场了,他可以帮你实现无缝连接。这里的 一个经典案例就是将两个水果融合成一个,看看下图。可以通过阅读后边的更多资源来了解更多关于图像融合,拉普拉斯金字塔的细节。 实现上述效果的步骤如下: 1. 读入两幅图原创 2017-08-02 06:01:01 · 4120 阅读 · 2 评论 -
图像处理26:图像金子塔
一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下, 我们需要对同一图像的不同分辨率的子图像进行处理。比如要在一幅图像中查找某个目标,比如脸,而且不知道目标在图像中的尺寸大小。这种情况下,需要创建一组图像,这些图像是具有不同分辨率的原始图像。这组图像叫做图像金字塔(简单来说就是同一图像的不同分辨率的子图集合)。如果把最大的图像放在底部,最小的放在顶部,看起来像一座金字 塔,故而得原创 2017-08-01 21:56:51 · 1768 阅读 · 0 评论 -
图像处理25:边缘检测
Canny 边缘检测是一种非常流行的边缘检测算法,是 John F.Canny 在 1986 年提出的。1、噪声去除 由于边缘检测很容易受到噪声影响,所以第一步是使用 5x5 的高斯滤波器去除噪声。2、计算图像梯度 对平滑后的图像使用 Sobel 算子计算水平方向和竖直方向的一阶导数(图像梯度)(Gx 和 Gy)。根据得到的这两幅梯度图(Gx 和 Gy)找到边界原创 2017-08-01 20:22:13 · 588 阅读 · 0 评论 -
图像处理24:图像梯度
梯度简单来说就是求导。 OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel, Scharr 和 Laplacian。Sobel,Scharr 其实就是求一阶或二阶导数。Scharr 是对 Sobel(使用小的卷积核求解求解梯度角度时)的优化。Laplacian 是求二阶导数。1、Sobel 算子和 Scharr 算子Sobel 算子是高斯平滑与微分操作的和,所以原创 2017-08-01 19:20:06 · 781 阅读 · 0 评论 -
图像处理23: 形态学转换
形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。1、腐蚀 就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的原图像的所有原创 2017-08-01 06:05:04 · 703 阅读 · 0 评论 -
图像处理22:图像模糊(滤波器)
与一维信号一样,也可以对 2D 图像实施低通滤波(LPF),高通滤波 (HPF)等。LPF 可以帮助去除噪音,模糊图像。HPF 可以帮助找到图像的边缘 OpenCV 提供的函数cv.filter2D() 可以让我们对一幅图像进行卷积操作。下面我们将对一幅图像使用平均滤波器。下面是一个 5x5 的平均滤波器核:操作如下:将核放在图像的一个像素A上,求与核对应的图像上25(5x5) 个像原创 2017-08-01 04:34:33 · 2862 阅读 · 0 评论 -
图像处理21:Otsu's二值化
在使用全局阈值时,随便给了一个数来做阈值,那怎么知道选取的这个数的好坏呢?答案就是不停的尝试。如果是一副双峰图像(简单来说双峰图像是指图像直方图中存在两个峰)呢?我们岂不是应该在两个峰 之间的峰谷选一个值作为阈值?这就是 Otsu 二值化要做的。简单来说就是对 一副双峰图像自动根据其直方图计算出一个阈值。(对于非双峰图像,这种方法得到的结果可能会不理想)。 这里用到到的函数还是 cv2.thr原创 2017-08-01 02:32:31 · 1714 阅读 · 0 评论 -
图像处理20:自适应阈值
在前面的部分使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。 这种方法需要我们指定三个参数,返回值只有一个。 • Adaptive原创 2017-08-01 01:29:02 · 1735 阅读 · 0 评论 -
图像处理19:简单阈值
这种方法非常简单。但像素值高于阈值时,给这个像素赋予一个新值(可能是白色),否则给它赋予另外一种颜色(也许是黑色)。 这个函数就是cv2.threshhold()。这个函数的第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进行分类的阈值。第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。OpenCV 提供了多种不同的阈值方法,这是有第四个参数来决定的原创 2017-08-01 00:16:42 · 527 阅读 · 0 评论 -
图像处理18:透视变换
对于视角变换,我们需要一个 3x3 变换矩阵。在变换前后直线还是直线。 要构建这个变换矩阵,你需要在输入图像上找 4 个点,以及他们在输出图 像上对应的位置。这四个点中的任意三个都不能共线。这个变换矩阵可以有 函数cv2.getPerspectiveTransform() 构建。然后把这个矩阵传给函数 cv2.warpPerspective。 import cv2import原创 2017-07-31 23:24:21 · 1932 阅读 · 0 评论 -
图像处理17:仿射变换
在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后 cv2.getAffineTransform 会创建一个 2x3 的矩阵,最后这个矩阵会被传给函数 cv2.warpAffine。旋转和平移可以看成放射变换的一种特殊形式。旋转和本例子中放射变换之间的小区别:一个矩形,旋转之后看是矩形,仿射变换之后是平行四边形原创 2017-07-31 22:03:25 · 608 阅读 · 0 评论 -
图像处理16:图形旋转
对一个图像旋转角度 θ, 需要使用到下面形式的旋转矩阵。 但是 OpenCV 允许你在任意地方进行旋转,但是旋转矩阵的形式应该修改为其中:为了构建这个旋转矩阵,OpenCV提供了一个函数:cv2.getRotationMatrix2D。 下面的例子是在不缩放的情况下将图像旋转45度。#coding:utf-8import cv2imp原创 2017-07-31 21:02:35 · 755 阅读 · 0 评论 -
图像处理15:图像平移
平移就是将对象换一个位置。如果你要沿(x,y)方向移动,移动的距离 是(tx,ty),可以通过下面的方式构建移动矩阵: 可以使用 Numpy 数组构建这个矩阵(数据类型是 np.float32),然 后把它传给函数 cv2.warpAffine()。如下面这个例子,它被移动了 (100,50)个像素。import cv2import numpy as npimg = cv2原创 2017-07-31 20:43:03 · 1304 阅读 · 0 评论 -
图像处理14:图像扩展缩放
扩展缩放只是改变图像的尺寸大小。OpenCV 提供的函数 cv2.resize()可以实现这个功能。图像的尺寸可以自己手动设置,你也可以指定缩放因子。我 们可以选择使用不同的插值方法。在缩放时我们推荐使用cv2.INTER_AREA, 在扩展时我们推荐使用v2.INTER_CUBIC(慢) 和 v2.INTER_LINEAR。 默认情况下所有改变图像尺寸大小的操作使用的插值方法都是cv原创 2017-07-31 20:07:12 · 1007 阅读 · 0 评论 -
图像处理13:物体追踪
在 OpenCV 中有超过 190种(可以自己测试出来)进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。 还可以通过下面的命令得到所有可用的 flag:#coding: utf-8import cv2flags=[i for i in dir(cv2) if i.startswith('COLOR_')]for i原创 2017-07-30 15:00:51 · 637 阅读 · 0 评论 -
图像处理12:获取程序执行时间
使用 OpenCV 检测程序效率:cv2.getTickCount 函数返回从参考点到这个函数被执行的时钟数。所 以当你在一个函数执行前后都调用它的话,你就会得到这个函数的执行时间 (时钟数)。 cv2.getTickFrequency 返回时钟频率,或者说每秒钟的时钟数。所以 你可以按照下面的方式得到一个函数运行了多少秒:#coding:utf-8import cv原创 2017-07-25 15:50:28 · 602 阅读 · 0 评论 -
图像处理11:添加logo
把 OpenCV 的标志放到另一幅图像上。如果使用加法,颜色会改变,如果使用混合,会得到透明效果,但是我不想要透明。如果是矩形可以象上一章那样使用 ROI。但是他不是矩形。但是我们可以通过下面的按位运算实现:import cv2import numpy as npimg1 = cv2.imread('F:/beauty.jpg')img2 = cv2.imrea原创 2017-07-25 14:51:32 · 1044 阅读 · 0 评论 -
图像处理10:图像混合
图像混合的计算公式如下:g (x) = (1−α)f0 (x) + αf1 (x) 通过修改 α 的值(0 → 1),可以实现非常酷的混合。函数 cv2.addWeighted() 可以按下面的公式对图片进行混合操作。dst = α·img1 + β ·img2 + γ 这里 γ 的取值为 0。import cv2import nump原创 2017-07-25 04:12:03 · 761 阅读 · 0 评论 -
图像处理9:扩散填充
如果你想在图像周围创建一个边,就像相框一样,你可以使用cv2.copyMakeBorder() 函数。这经常在卷积运算或 0 填充时被用到。这个函数包括如下参数:src 输入图像top, bottom, left, right 对应边界的像素数目。borderType 要添加那种类型的边界, value 边界颜色import cv2import num原创 2017-07-25 00:35:12 · 1493 阅读 · 0 评论 -
图像处理8:局部复制粘贴
获取图像属性 :img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数, 通道数的元组。如果图像是灰度图,返回值仅有行数和列数。所以通过检查这个返回值 就可以知道加载的是灰度图还是彩色图。img.size可以返回图像的像素数目。img.dtype 返回的是图像的数据类型。你可以根据像素的行和列的坐标获取他的像素值。对BGR图像而言,返原创 2017-07-25 00:15:31 · 1856 阅读 · 0 评论 -
图像处理7:滑动条调色板
通过调节滑动条来设定画板颜色。我们 要创建一个窗口来显示显色,还有三个滑动条来设置 B,G,R 的颜色。当我们 滑动滚动条是窗口的颜色也会发生相应改变。默认情况下窗口的起始颜色为黑。 cv2.getTrackbarPos() 函数的一个参数是滑动条的名字,第二个参数 是滑动条被放置窗口的名字,第三个参数是滑动条的默认位置。第四个参数是 滑动条的最大值,第五个函数是回调函数,每次滑动条的滑动都会调用原创 2017-07-24 23:16:23 · 450 阅读 · 0 评论 -
图像处理6:鼠标绘制
首先我们来创建一个鼠标事件回调函数:cv2.setMouseCallback(),但鼠标事件发生是他就会被执行。 鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标。根据这些信息我们可 以做任何我们想做的事。#coding:utf-8import cv2import numpy as npdrawing = F原创 2017-07-24 22:55:16 · 395 阅读 · 0 评论 -
图像处理5:opencv绘图
用这些函数:cv2.line(),cv2.circle(),cv2.rectangle(), cv2.ellipse(),cv2.putText() 等绘制不同几何图形。import numpy as npimport cv2#draw lineimg = np.zeros((512,512,3), np.uint8)cv2.line(img, (0,0),(512,512)原创 2017-07-24 22:27:04 · 341 阅读 · 0 评论 -
图像处理4:录像视频保存
与从摄像头中捕获一样,你只需要把设备索引号改成视频文件的名字。在播放每一帧时,使用 cv2.waiKey() 设置适当的持续时间。如果设置的太低视 频就会播放的非常快,如果设置的太高就会播放的很慢(你可以使用这种方法 控制视频的播放速度)。通常情况下 25 毫秒就可以了。#coding:utf-8import numpy as npimport cv2cap = cv原创 2017-07-24 22:14:47 · 329 阅读 · 0 评论 -
图像处理3:摄像头捕获视频
为了获取视频,你应该创建一个 VideoCapture 对象。他的参数可以是 设备的索引号,或者是一个视频文件。设备索引号就是在指定要使用的摄像头。 一般的笔记本电脑都有内置摄像头。所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。之后,你就可以一帧一帧的捕获视频了。但是最后,别忘了停止捕获视频。#coding:utf-8import cv2import原创 2017-07-24 21:18:02 · 588 阅读 · 0 评论 -
图像处理2:模块介绍
opencv的每个模块介绍:学习opencv进行图像处理要对每个模块有个大致的了解,这些文件在之前安装的opencv路径的build/include/opencv2里。下面是对每个模块进行基本功能简介:【calib3d】——主要是相机校准和三维重建相关的内容。基本的多视角几何算法,单个立体摄像头原创 2017-07-12 12:03:07 · 2164 阅读 · 0 评论 -
图像处理1:python和opencv环境配置
说明1:现在网上很多关于python+opencv配置教程,但是很多都让人感觉想砸屏幕,原因自己想去吧,呵呵。说明2:安装路径尽量不要有中文,因为国外的软件有些是不支持中文的一、安装python首先要明确python有两个版本,2.x和3.x,如果想研究语法,建议学习一下3.x,但是目前的opencv目前支持python2.x,所以要安装的版本也就明确了,肯定是2.x。这里原创 2017-07-06 13:19:43 · 1172 阅读 · 0 评论