OpenCV_01 简介+无版权安装+模块分析

 OpenCV是应用广泛的开源图像处理库,我们以其为基础,介绍相关的图像处理方法:包括基本的图像处理方法:几何变换,形态学变换,图像平滑,直方图操作,模板匹配,霍夫变换等;特征提取和描述方法:理解角点特征,Harris和Shi-Tomas算法,SIFT/SURF算法,Fast算法,ORB算法等;还有OpenCV在视频操作中的应用,最后的案例是使用OpenCV进行人脸检测。

1.1 图像是什么

图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要源泉。“图”是物体反射或透射光的分布,“像“是人的视觉系统所接受的图在人脑中所形版的印象或认识,照片、绘画、剪贴画、地图、书法作品、手写汉学、传真、卫星云图、影视画面、X光片、脑电图、心电图等都是图像。—姚敏. 数字图像处理:机械工业出版社,2014年。

1.1.1 模拟图像和数字图像

图像起源于1826年前后法国科学家Joseph Nicéphore Niépce发明的第一张可永久保存的照片,属于模拟图像。模拟图像又称连续图像,它通过某种物理量(如光、电等)的强弱变化来记录图像亮度信息,所以是连续变换的。模拟信号的特点是容易受干扰,如今已经基本全面被数字图像替代。

在第一次世界大战后,1921年美国科学家发明了Bartlane System,并从伦敦传到纽约传输了第一幅数字图像,其亮度用离散数值表示,将图片编码成5个灰度级,如下图所示,通过海底电缆进行传输。在发送端图片被编码并使用打孔带记录,通过系统传输后在接收方使用特殊的打印机恢复成图像。

1950年左右,计算机被发明,数字图像处理学科正式诞生。

模拟图像和数字图像的对比,我们可以看一下:

1.2 数字图像的表示

1.2.1 位数

计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像,包含0~255灰度,其中0,代表最黑,1,表示最白。

 人眼对灰度更敏感一些,在16位到32位之间。

1.2.2 图像的分类

二值图像

一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。

灰度图

每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度(如果用16位,则有65536级)。

彩色图

每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像。

2.1 OpenCV简介

OpenCV是一款由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法,并且正在日益扩展。

OpenCV的优势:

  1. 编程语言

    OpenCV基于C++实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API,结合了OpenCV C++ API和Python语言的最佳特性。

  2. 跨平台

    可以在不同的系统平台上使用,包括Windows,Linux,OS X,Android和iOS。基于CUDA和OpenCL的高速GPU操作接口也在积极开发中

  3. 活跃的开发团队

  4. 丰富的API

    完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。

2.2 OpenCV-Python

OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。

Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因为它的简单性和代码可读性。它使程序员能够用更少的代码行表达思想,而不会降低可读性。

与C / C++等语言相比,Python速度较慢。也就是说,Python可以使用C / C++轻松扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。这给我们带来了两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。OpenCV-Python是原始OpenCV C++实现的Python包装器。

OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。

2.3 OpenCV部署方法

安装OpenCV之前需要先安装numpy, matplotlib。

创建Python虚拟环境cv, 在cv中安装即可。

先安装OpenCV-Python, 由于一些经典的算法被申请了版权,新版本有很大的限制,所以选用3.4.3以下的版本

pip install opencv-python==3.4.2.17

现在可以测试下是否安装成功,运行以下代码无报错则说明安装成功。

import cv2
# 读一个图片并进行显示(图片路径需自己指定)
lena=cv2.imread("opencv.jpg")
cv2.imshow("image",lena)
cv2.waitKey(0)

如果我们要利用SIFT和SURF等进行特征提取时,还需要安装:

pip install opencv-contrib-python==3.4.2.17

2.4 OpenCV的模块

下图列出了OpenCV中包含的各个模块:

其中core、highgui、imgproc是最基础的模块,该课程主要是围绕这几个模块展开的,分别介绍如下:

  • core模块实现了最核心的数据结构及其基本运算,如绘图函数、数组操作相关函数等。
  • highgui模块实现了视频与图像的读取、显示、存储等接口。
  • imgproc模块实现了图像处理的基础方法,包括图像滤波、图像的几何变换、平滑、阈值分割、形态学处理、边缘检测、目标检测、运动分析和对象跟踪等。

对于图像处理其他更高层次的方向及应用,OpenCV也有相关的模块实现

  • features2d模块用于提取图像特征以及特征匹配,nonfree模块实现了一些专利算法,如sift特征。
  • objdetect模块实现了一些目标检测的功能,经典的基于Haar、LBP特征的人脸检测,基于HOG的行人、汽车等目标检测,分类器使用Cascade Classification(级联分类)和Latent SVM等。
  • stitching模块实现了图像拼接功能。
  • FLANN模块(Fast Library for Approximate Nearest Neighbors),包含快速近似最近邻搜索FLANN 和聚类Clustering算法。
  • ml模块机器学习模块(SVM,决策树,Boosting等等)。
  • photo模块包含图像修复和图像去噪两部分。
  • video模块针对视频处理,如背景分离,前景检测、对象跟踪等。
  • calib3d模块即Calibration(校准)3D,这个模块主要是相机校准和三维重建相关的内容。包含了基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。
  • G-API模块包含超高效的图像处理pipeline引擎

总结

  1. OpenCV是计算机视觉的开源库

    优势:

    • 支持多种编程语言

    • 跨平台

    • 活跃的开发团队

    • 丰富的API

  2. 图像是什么

    图:物体反射或透射光的分布

    像:人的视觉系统所接受的图在人脑中所形版的印象或认识

  3. 模拟图像和数字图像

    模拟图像:连续存储的数据,

    数字图像:分级存储的数据

  4. 数字图像

    位数:图像的表示,常见的就是8位

    分类:二值图像,灰度图像和彩色图像

  5. OpenCV 的模块

    core:最核心的数据结构

    highgui:视频与图像的读取、显示、存储

    imgproc:图像处理的基础方法

    features2d:图像特征以及特征匹配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV_02 图像的基本操作:图像IO+绘制图形+像素点+属性+图像通道+色彩空间的改变

1 图像的IO操作 这里我们会给大家介绍如何读取图像,如何显示图像和如何保存图像。 1.1 读取图像 API cv.imread()参数: 要读取的图像 读取方式的标志 cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将被忽略。这是默…

数据结构之树:树的介绍——9

数据结构之树,介绍篇 树的基本定义 介绍:树(tree)是计算机中非常重要的数据结构,它的外形看起来像一颗倒挂着的的树,使用树这种结构可以描述生活中很多的事物,如族谱,单位的组织架…

OpenCV_03 图像的算数操作:图像的加法+图像的混合

1.图像的加法 你可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res img1 img2。两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。 注意:OpenCV加法和Numpy加法之间存…

数据结构之二叉树:二叉查找树的先序、中序、后序、层序遍历,Python代码实现——10(续)

数据结构之二叉查找树的代码实现 本节继续对上一节BST的功能实现 在实现之前,先对要实现的功能进行一下简单的介绍 BST的几种常见遍历方式 以一个简化的树为例,一棵树包含根(父)结点和其左子树及右子树: 遍历顺序的先后是指根(父)结点被遍…

OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔

1 图像缩放 缩放是对图像的大小进行调整,即使图像放大或缩小。 API cv2.resize(src,dsize,fx0,fy0,interpolationcv2.INTER_LINEAR)参数: src : 输入图像 dsize: 绝对尺寸,直接指定调整后图像的大小 fx,fy: 相对尺寸,将dsize设…

Direct2D教程(九)渲染位图

概述 这篇的标题更确切的说应该叫位图画刷,这样才好和前几篇对应起来。在Direct2D中,位图的渲染也是通过画刷来实现的。 Direct2D中并没有直接操作位图的接口,而是借助WIC(Windows Image Component)来完成的。今天我们…

OpenCV_05 形态学操作:连通性+腐蚀和膨胀+开闭运算+礼帽和黑帽

1 连通性 在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有3种:4邻接、8邻接和D邻接。分别如下图所示: 4邻接:像素p(x,y)的4邻域是:(x1,y);(x-1,y)&#xff…

数据结构之二叉树:折纸问题——11

数据结构之二叉树:Python代码解决折纸问题 折纸问题 要求:请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方…

OpenCV_06 图像平滑:图像噪声+图像平滑+滤波

1 图像噪声 由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。 1.1 椒盐噪声 椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白…

数据结构之堆:堆的介绍与python实现——12

堆的简单实现与代码实现 堆的定义 在定义堆(heap)之前,先回顾一下完全二叉树的定义: 完全二叉树:除了最后一层的结点有可能没有达到最大值外,其它层的结点值都达到最大值,此外最后一层的叶子…

OpenCV_07 直方图:灰度直方图+直方图均衡化

1 灰度直方图 1.1 原理 直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。其中, bin 为直方图中经常用到的一个概念,可以译为 “直条” 或 “组距”,其数值是从数据中计算出的特征统计量&…

OpenCV_08 边缘检测:Sobel检测算子+Laplacian算子+Canny边缘检测

1 原理 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式如下图所示: 图像边缘检测大幅度地减少了数据量,并且剔除了可以…

数据结构之堆:堆的排序,Python代码实现——13

堆的排序,使用Python代码实现 上一节对堆进行了简单的实现,但是实现的堆只是部分有序(父结点大于子结点,子结点之间无序) 接下来我们实现对堆的所有元素进行升序排序 排序过程 实现步骤: 构造堆;得到堆顶元素,这个…

数据结构之优先队列:优先队列的介绍与基础操作实现,Python代码实现——14

优先队列(Priority queue)的介绍 优先队列是计算机中一种抽象的数据结构类,它有着一个类似和队列或者堆的结构,但是其中每个元素额外有一个优先级别在一个优先队列中,一个高优先顺序的元素会先执行与低优先顺序的元素。在它的执行过程中&…

初识--百年孤独

转载于:https://www.cnblogs.com/xmyun/articles/6306290.html

OpenCV_09 模版匹配和霍夫变换:霍夫线检测+霍夫圆检测

1 模板匹配 1.1 原理 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最…

UICollectionView下拉使header放大模糊

模糊主要使用UIVisualEffectView,这只在ios8以后适用 //模糊的遮罩view property(nonatomic,strong) UIVisualEffectView *effectView; property(nonatomic,strong) CollectionviewLayout *layout;CollectionviewLayout *layout [[CollectionviewLayout alloc]init…

数据结构之优先队列:最小索引优先队列,Python代码实现——15

最小索引优先队列(Min index priority queue) 在之前实现的最大优先队列和最小优先队列,他们可以分别快速访问到队列中最大元索和最小元素,但是他们有一 个缺点,就是没有办法通过索引访问已存在于优先队列中的对象,并更新它们。 为了实现这个目的,在优先队列的基础上,学习一种…

OpenCV_10 傅里叶变换:频域滤波+CV的应用

1 傅里叶变换的理解 傅里叶变换是由法国的一位数学家Joseph Fourier在18世纪提出来的,他认为:任何连续周期的信号都可以由一组适当的正弦曲线组合而成。 傅里叶变换是描述信号的需要,它能够反映信号的特征,并可以使用特征值进行量…

OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合

1 图像的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓是图像目标的外部特征,这种特征对于我们进行图像分析,目标识别和理解等更深层次的处理都有很重要的意义。 轮廓提…