精华内容
下载资源
问答
  • 基于matlab实现的由A图中分离出目标物体,然后再有B图将A图中提取目标物体嵌入B图中给定的位置中,实现图像的合成。
  • 我们的钥匙观察结果激发了我们的聚类方案,那就是离群形状在本质上应该是随机的,相反,紧密包围目标对象的外围形状往往会被相似的形状很好地支撑在类似的视图捕获。我们分析候选前景细分之间的共性,而不是为了...
  • 做项目测试的适合,需要把json每个目标的mask分别提取出来保存,参考了该博主的内容,写的也挺详细的,我修改成自己需要的,将背景换成黑色,因为是分开保存,因此将mask统一定义成红色,跟将json转换成labelme_...

            做项目测试的适合,需要把json中每个目标的mask分别提取出来保存,参考了该博主的内容,写的也挺详细的,我修改成自己需要的,将背景换成黑色,因为是分开保存,因此将mask统一定义成红色,跟将json转换成labelme_json对应的mask颜色差不多就行了,有些还需要转换成二值图,这个都很方便,可以放在项目中了,我这里就不写了。

    from __future__ import division, print_function, absolute_import
    import numpy as np
    import os
    import json
    from PIL import Image,ImageDraw
    
    color_code={}
    color_code['red']='#FF0000'
    color_code['black']='#000000'
    
    def get_each_mask(jsonpath):
        for file in os.listdir(jsonpath):
            json_file = jsonpath + file
            data = json.load(open(json_file))
            img = Image.new('RGB', [640, 640], color_code['black'])
            img1 = ImageDraw.Draw(img)
            label_idx_list = list(np.arange(len(data['shapes'])))
            for i in label_idx_list:
                if data['shapes'][i]['label'] == 'A1':
                    xy = []
                    for xy_tuple in data['shapes'][i]['points']:
                        xy += xy_tuple
                    img1.polygon(xy, fill=color_code['red'], outline=color_code['red'])
                    label_idx_list.remove(i)    
            img.save(r'I:/footimage/paperlen/len/foot_mask/'+ os.path.splitext(file)[0] + '.png')
    
        for file in os.listdir(jsonpath):
            json_file = jsonpath + file
            data = json.load(open(json_file))
            img = Image.new('RGB', [640, 640], color_code['black'])
            img2 = ImageDraw.Draw(img)
            label_idx_list = list(np.arange(len(data['shapes'])))
            for i in label_idx_list:
                if data['shapes'][i]['label'] == 'A2':
                    xy = []
                    for xy_tuple in data['shapes'][i]['points']:
                        xy += xy_tuple
                    img2.polygon(xy, fill=color_code['red'], outline=color_code['red'])
                    label_idx_list.remove(i) 
            img.save(r'I:/footimage/paperlen/len/paper_mask/'+ os.path.splitext(file)[0] + '.png')
            
            
            
    if __name__=='__main__':
        jsonpath=r'I:/footimage/paperlen/len/json/'
        get_each_mask(jsonpath)
        

     

    展开全文
  • 图像处理-遥感图像飞机小目标提取

    千次阅读 2019-03-19 16:05:41
    第一个是遥感飞机图像小目标提取,就是一张高空拍摄的机场的照片,最后完成时将图像中的飞机数量求出,并标记出位置。总的流程可以分为图片预处理,提取特征,匹配特征,标记计数。先在原图中截取背景单一的含有...

    第一个是遥感飞机图像小目标提取,就是一张从高空拍摄的机场的照片,最后完成时将图像中的飞机数量求出,并标记出位置。总的流程可以分为图片预处理,提取特征,匹配特征,标记计数。先在原图中截取背景单一的含有目标提取物的图片进行特征采集,可使匹配更加准确。特征采集过程与图像处理是一个过程,只是一个数据采集的过程。
    预处理的目的是将图片二值化,利用连通域去除大面积的背景杂物,主要的杂物背景包括一些大面积的建筑物,停靠机台这样的。
    首先将图片进行灰度化处理,灰度图像是RGB三个分量相同的一种特殊的彩色图像,一个像素点的范围是0-255,(第一种方法是求出每个像素的RGB三个分量的平均值,然后将这个平均值赋予这个像素的三个分量),然后根据大律算法(Otsu)进行自动阈值分割,大律算法就是最小类间差,按照图像的灰度特性,将图像分为背景和前景两个部分,因为方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分差别越大,当部分前景错分为背景或部分背景都会导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小。还有一种简单的比较可行的方法就是对图片描绘灰度直方图,假如呈现双峰状态,则可以选波谷处的灰度值进行分割,进行这些处理后,图片将只剩下前景和背景,此时像素也只有0和1的差别了,一般飞机外壳是白色的,图像灰度化后对应部分也会相对较亮,所以一般提取目标物二值化化后的一般是白色区域部分,这个时候对图片进行开运算或者闭运算,闭运算是对图像先膨胀再进行腐蚀处理,开运算是对图像先腐蚀再膨胀,当目标提取物比较密集是使用闭运算效果比较好,否则选取开运算比较好,开运算可以去掉孤立的小点,毛刺和小桥,闭运算可以让很多重新弥合裂缝形成一个完整的连通域,然后利用regionprops函数去除面积过大或者过小的的连通阈区域,可以去除掉大面积的建筑物,因为二值化后像素就是0和1,此时通过统计1的个数就可以算出面积了,目标提取物的面积范围的确定可以以之前截取的样本计算出的面积为基准,波动范围根据图片的比例设定。利用角点检测(利用曲率和梯度)进一步确定待提取的目标连通阈,
    (角点:主要指的是轮廓的交点,图像中亮度变化剧烈的点,或者是边缘中曲率取极大值的点,角点检测分两类:基于图像边缘的检测方法、基于图像灰度的检测方法。前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割和边缘提取,具有较大的计算量,而且检测目标局部发生变化就可能失败,后者主要是通过计算点的曲率及梯度来检测角点。
    Harris-Laplacian 角点检测法是基于Moravec算子和自相关函数数理论得来的,通过计算自相关的特征值来判断是否有角点,具有尺寸不变形)
    将已经处理的图像和原灰度图像都进行角点检测后,再进行与处理,选择角点较多的连通阈块作为目标提取块

    展开全文
  • 该项目的目标是构建一种软件,以拍摄NFL比赛的图像,并提取有关该比赛的信息。 由于NFL播放的“预快照”状态是相对静态且定义明确的,因此第一阶段的重点是预快照信息。 我针对的某些类型的信息: 是shot弹枪的...
  • 任务目标如图所示,包含舰艇的图片,标识舰艇的位置本文的学习笔记,主要基于Stanford大学计算机视觉课程:Convolutional Neural Networks for Visual Recognition http://cs231n.stanford.edu/,主...

    目前,在处理海上无人艇的感知系统的开发。其中,比较核心的一个部分就是基于光电的目标识别(Object Detection)。

    任务目标

    57d8302bf3e58dc278582f413afe7ecb.png

    如图所示,从包含舰艇的图片中,标识舰艇的位置

    本文的学习笔记,主要基于Stanford大学计算机视觉课程:Convolutional Neural Networks for Visual Recognition http://cs231n.stanford.edu/,主讲人是李飞飞,斯坦福人工智能实验室与视觉实验室主任,主要研究方向为机器学习、计算机视觉、认知计算神经学,侧重大数据分析为主。已在Nature、PNAS、Journal of Neuroscience、CVPR、ICCV、NIPS、ECCV、IJCV、IEEE-PAMI等顶级期刊与会议上发表了100余篇学术论文。)

    没错,就是这位 “金灿灿”耀眼光芒的CS女神大咖

    f38ab3d56bb70a04769cd7525961b10a.png

    目前,计算机视觉是深度学习领域最热门的研究领域之一。计算机视觉实际上是一个跨领域的交叉学科,包括计算机科学(图形、算法、理论、系统、体系结构),数学(信息检索、机器学习),工程学(机器人、语音、自然语言处理、图像处理),物理学(光学 ),生物学(神经科学)和心理学(认知科学)等等。许多科学家认为,计算机视觉为人工智能的发展开拓了道路。

    9bc5ecdd2e201afc77b5de354327823f.png

    ▌计算机视觉的应用

    计算机视觉已经广泛应用于各个领域,并且衍生出了一大批快速有实际作用的应用,例如:

    人脸识别:Snapchat 和 Facebook 使用人脸检测算法来识别人脸。

    图像检索:Google Images 使用基于内容的查询来搜索相关图片,算法分析查询图像中的内容并根据最佳匹配内容返回结果。

    游戏和控制:使用立体视觉较为成功的游戏应用产品是:微软 Kinect。

    监测:用于监测可疑行为的监视摄像头遍布于各大公共场所中。

    生物识别技术:指纹、虹膜和人脸匹配仍然是生物识别领域的一些常用方法。

    智能汽车:计算机视觉仍然是检测交通标志、灯光和其他视觉特征的主要信息来源。

    视觉识别是计算机视觉的关键组成部分,如图像分类、定位和检测。神经网络和深度学习等数学工具极大地推动了视觉识别技术的发展。在本文中,我将分享 5 种主要的计算机视觉技术,并介绍几种基于计算机视觉技术的深度学习模型与应用。

    04637d818e8212e044206c99abb53237.png

    35ab4ad8e54eb6c2ce676043948848d8.png

    ▌1 、图像分类

    36f987d83d7b91f8a0d4b40ccd606466.png

    给定一组各自被标记为单一类别的图像,我们对一组新的测试图像的类别进行预测,并测量预测的准确性结果,这就是图像分类问题。图像分类问题需要面临以下几个挑战:

    视点变化,尺度变化,类内变化,图像变形,图像遮挡,照明条件和背景杂斑

    我们怎样来编写一个图像分类算法呢?

    计算机视觉研究人员提出了一种基于数据驱动的方法。

    该算法并不是直接在代码中指定每个感兴趣的图像类别,而是为计算机每个图像类别都提供许多示例,然后设计一个学习算法,查看这些示例并学习每个类别的视觉外观。也就是说,首先积累一个带有标记图像的训练集,然后将其输入到计算机中,由计算机来处理这些数据。

    因此,可以按照下面的步骤来分解:

    1. l 输入是由 N 个图像组成的训练集,共有 K 个类别,每个图像都被标记为其中一个类别。
    2. l 然后,使用该训练集训练一个分类器,来学习每个类别的外部特征。
    3. l 最后,预测一组新图像的类标签,评估分类器的性能,我们用分类器预测的类别标签与其真实的类别标签进行比较。

    目前较为流行的图像分类架构是卷积神经网络(CNN)——将图像输入神经网络,然后神经网络对图像数据进行分类。卷积神经网络从输入“扫描仪”开始,该输入“扫描仪”也不会一次性解析所有的训练数据。比如输入一个大小为 100*100 的图像,你也不需要一个有 10,000 个节点的网络层。相反,你只需要创建一个大小为 10 *10 的扫描输入层,扫描图像的前 10*10 个像素。然后,扫描仪向右移动一个像素,再扫描下一个 10 *10 的像素,这就是滑动窗口。

    2d9ee6ed419d7de0a4bd590fc431b021.png

    输入数据被送入卷积层,而不是普通层。每个节点只需要处理离自己最近的邻近节点,卷积层也随着扫描的深入而趋于收缩。除了卷积层之外,通常还会有池化层。池化是过滤细节的一种方法,常见的池化技术是最大池化,它用大小为 2*2 的矩阵传递拥有最多特定属性的像素。

    现在,大部分图像分类技术都是在 ImageNet 数据集上训练的, ImageNet 数据集中包含了约 120 万张高分辨率训练图像。测试图像没有初始注释(即没有分割或标签),并且算法必须产生标签来指定图像中存在哪些对象。

    现存的很多计算机视觉算法,都是被来自牛津、 INRIA 和 XRCE 等顶级的计算机视觉团队在 ImageNet 数据集上实现的。通常来说,计算机视觉系统使用复杂的多级管道,并且,早期阶段的算法都是通过优化几个参数来手动微调的。

    一届 ImageNet 竞赛的获奖者是 Alex Krizhevsky(NIPS 2012) ,他在 Yann LeCun 开创的神经网络类型基础上,设计了一个深度卷积神经网络。该网络架构除了一些最大池化层外,还包含 7 个隐藏层,前几层是卷积层,最后两层是全连接层。在每个隐藏层内,激活函数为线性的,要比逻辑单元的训练速度更快、性能更好。除此之外,当附近的单元有更强的活动时,它还使用竞争性标准化来压制隐藏活动,这有助于强度的变化。

    78410c0abf2b190b7e58d6481da20e3e.png

    就硬件要求而言, Alex 在 2 个 Nvidia GTX 580 GPU (速度超过 1000 个快速的小内核)上实现了非常高效的卷积网络。 GPU 非常适合矩阵间的乘法且有非常高的内存带宽。这使他能在一周内完成训练,并在测试时快速的从 10 个块中组合出结果。如果我们能够以足够快的速度传输状态,就可以将网络分布在多个内核上。

    随着内核越来越便宜,数据集越来越大,大型神经网络的速度要比老式计算机视觉系统更快。在这之后,已经有很多种使用卷积神经网络作为核心,并取得优秀成果的模型,如ZFNet(2013),GoogLeNet(2014), VGGNet(2014), RESNET(2015),DenseNet(2016)等。

    ▌2 、目标检测

    263a34e1319fe4a148bafe716e088794.png

    识别图像中的目标这一任务,通常会涉及到为各个目标输出边界框和标签。这不同于分类/定位任务——对很多目标进行分类和定位,而不仅仅是对个主体目标进行分类和定位。在目标检测中,你只有 2 个目标分类类别,即目标边界框和非目标边界框。例如,在汽车检测中,你必须使用边界框检测所给定图像中的所有汽车。

    如果使用图像分类和定位图像这样的滑动窗口技术,我们则需要将卷积神经网络应用于图像上的很多不同物体上。由于卷积神经网络会将图像中的每个物体识别为对象或背景,因此我们需要在大量的位置和规模上使用卷积神经网络,但是这需要很大的计算量!

    为了解决这一问题,神经网络研究人员建议使用区域(region)这一概念,这样我们就会找到可能包含对象的“斑点”图像区域,这样运行速度就会大大提高。第一种模型是基于区域的卷积神经网络( R-CNN ),其算法原理如下:

    1. l 在 R-CNN 中,首先使用选择性搜索算法扫描输入图像,寻找其中的可能对象,从而生成大约 2,000 个区域建议;
    2. l 然后,在这些区域建议上运行一个 卷积神网络;
    3. l 最后,将每个卷积神经网络的输出传给支持向量机( SVM ),使用一个线性回归收紧对象的边界框。

    b47ea5afc1de8165d21d6c4806dbc9b1.png

    实质上,我们将对象检测转换为一个图像分类问题。但是也存在这些问题:训练速度慢,需要大量的磁盘空间,推理速度也很慢。

    R-CNN 的第一个升级版本是 Fast R-CNN,通过使用了 2 次增强,大大提升了检测速度:

    在建议区域之前进行特征提取,因此在整幅图像上只能运行一次卷积神经网络;

    用一个 softmax 层代替支持向量机,对用于预测的神经网络进行扩展,而不是创建一个新的模型。

    7b376ef3fd6a7938283230f404d75669.png

    Fast R-CNN 的运行速度要比 R-CNN 快的多,因为在一幅图像上它只能训练一个 CNN 。 但是,择性搜索算法生成区域提议仍然要花费大量时间。

    Faster R-CNN 是基于深度学习对象检测的一个典型案例。

    该算法用一个快速神经网络代替了运算速度很慢的选择性搜索算法:通过插入区域提议网络( RPN ),来预测来自特征的建议。 RPN 决定查看“哪里”,这样可以减少整个推理过程的计算量。

    RPN 快速且高效地扫描每一个位置,来评估在给定的区域内是否需要作进一步处理,其实现方式如下:通过输出 k 个边界框建议,每个边界框建议都有 2 个值——代表每个位置包含目标对象和不包含目标对象的概率。

    b14a56ee1dd75b5f01f8aa10c07c3ef8.png

    一旦我们有了区域建议,就直接将它们送入 Fast R-CNN 。 并且,我们还添加了一个池化层、一些全连接层、一个 softmax 分类层以及一个边界框回归器。

    总之,Faster R-CNN 的速度和准确度更高。值得注意的是,虽然以后的模型在提高检测速度方面做了很多工作,但很少有模型能够大幅度的超越 Faster R-CNN 。换句话说, Faster R-CNN 可能不是最简单或最快速的目标检测方法,但仍然是性能最好的方法之一。

    近年来,主要的目标检测算法已经转向更快、更高效的检测系统。这种趋势在 You Only Look Once(YOLO),Single Shot MultiBox Detector(SSD)和基于区域的全卷积网络( R-FCN )算法中尤为明显,这三种算法转向在整个图像上共享计算。因此,这三种算法和上述的3种造价较高的R-CNN 技术有所不同。

    ▌3 、 目标跟踪

    a62a709367640013bbd4baa3f111eef8.png

    目标跟踪,是指在特定场景跟踪某一个或多个特定感兴趣对象的过程。传统的应用就是视频和真实世界的交互,在检测到初始对象之后进行观察。现在,目标跟踪在无人驾驶领域也很重要,例如 Uber 和特斯拉等公司的无人驾驶。

    根据观察模型,目标跟踪算法可分成 2 类:生成算法和判别算法。

    生成算法使用生成模型来描述表观特征,并将重建误差最小化来搜索目标,如主成分分析算法(PCA);

    判别算法用来区分物体和背景,其性能更稳健,并逐渐成为跟踪对象的主要手段(判别算法也称为 Tracking-by-Detection ,深度学习也属于这一范畴)。

    为了通过检测实现跟踪,我们检测所有帧的候选对象,并使用深度学习从候选对象中识别想要的对象。有两种可以使用的基本网络模型:堆叠自动编码器(SAE)和卷积神经网络(CNN)。

    目前,最流行的使用 SAE 进行目标跟踪的网络是 Deep Learning Tracker(DLT),它使用了离线预训练和在线微调。其过程如下:

    离线无监督预训练使用大规模自然图像数据集获得通用的目标对象表示,对堆叠去噪自动编码器进行预训练。堆叠去噪自动编码器在输入图像中添加噪声并重构原始图像,可以获得更强大的特征表述能力。

    将预训练网络的编码部分与分类器合并得到分类网络,然后使用从初始帧中获得的正负样本对网络进行微调,来区分当前的对象和背景。 DLT 使用粒子滤波作为意向模型(motion model),生成当前帧的候选块。 分类网络输出这些块的概率值,即分类的置信度,然后选择置信度最高的块作为对象。

    在模型更新中, DLT 使用有限阈值。

    fe0ef7cd0ab2a8beb8743f168c13279c.png

    鉴于 CNN 在图像分类和目标检测方面的优势,它已成为计算机视觉和视觉跟踪的主流深度模型。 一般来说,大规模的卷积神经网络既可以作为分类器和跟踪器来训练。具有代表性的基于卷积神经网络的跟踪算法有全卷积网络跟踪器(FCNT)和多域卷积神经网络(MD Net)。

    FCNT 充分分析并利用了 VGG 模型中的特征映射,这是一种预先训练好的 ImageNet 数据集,并有如下效果:

    卷积神经网络特征映射可用于定位和跟踪。

    对于从背景中区分特定对象这一任务来说,很多卷积神经网络特征映射是噪音或不相关的。

    较高层捕获对象类别的语义概念,而较低层编码更多的具有区性的特征,来捕获类别内的变形。

    因此, FCNT 设计了特征选择网络,在 VGG 网络的卷积 4-3 和卷积 5-3 层上选择最相关的特征映射。 然后为避免噪音的过拟合, FCNT 还为这两个层的选择特征映射单独设计了两个额外的通道(即 SNet 和 GNet ): GNet 捕获对象的类别信息; SNet 将该对象从具有相似外观的背景中区分出来。

    这两个网络的运作流程如下:都使用第一帧中给定的边界框进行初始化,以获取对象的映射。而对于新的帧,对其进行剪切并传输最后一帧中的感兴趣区域,该感兴趣区域是以目标对象为中心。最后,通过 SNet 和 GNet ,分类器得到两个预测热映射,而跟踪器根据是否存在干扰信息,来决定使用哪张热映射生成的跟踪结果。 FCNT 的图如下所示。

    99ce907a070166f0a0e016a159e6642f.png

    与 FCNT 的思路不同, MD Net 使用视频的所有序列来跟踪对象的移动。上述网络使用不相关的图像数据来减少跟踪数据的训练需求,并且这种想法与跟踪有一些偏差。该视频中的一个类的对象可以是另一个视频中的背景,因此, MD Net 提出了“多域”这一概念,它能够在每个域中独立的区分对象和背景,而一个域表示一组包含相同类型对象的视频。

    如下图所示, MD Net 可分为两个部分,即 K 个特定目标分支层和共享层:每个分支包含一个具有 softmax 损失的二进制分类层,用于区分每个域中的对象和背景;共享层与所有域共享,以保证通用表示。

    4ecfdd277e96e42dac9edcda5ee055e5.png

    近年来,深度学习研究人员尝试使用了不同的方法来适应视觉跟踪任务的特征,并且已经探索了很多方法:

    1. 应用到诸如循环神经网络( RNN )和深度信念网络(DBN )等其他网络模型;
    2. 设计网络结构来适应视频处理和端到端学习,优化流程、结构和参数;
    3. 或者将深度学习与传统的计算机视觉或其他领域的方法(如语言处理和语音识别)相结合。

    ▌4、语义分割

    65ba51518cab378a71a6b54204c20256.png

    计算机视觉的核心是分割,它将整个图像分成一个个像素组,然后对其进行标记和分类。特别地,语义分割试图在语义上理解图像中每个像素的角色(比如,识别它是汽车、摩托车还是其他的类别)。如上图所示,除了识别人、道路、汽车、树木等之外,我们还必须确定每个物体的边界。因此,与分类不同,我们需要用模型对密集的像素进行预测。

    与其他计算机视觉任务一样,卷积神经网络在分割任务上取得了巨大成功。最流行的原始方法之一是通过滑动窗口进行块分类,利用每个像素周围的图像块,对每个像素分别进行分类。但是其计算效率非常低,因为我们不能在重叠块之间重用共享特征。

    解决方案就是加州大学伯克利分校提出的全卷积网络( FCN ),它提出了端到端的卷积神经网络体系结构,在没有任何全连接层的情况下进行密集预测。

    这种方法允许针对任何尺寸的图像生成分割映射,并且比块分类算法快得多,几乎后续所有的语义分割算法都采用了这种范式。

    85901f5bf538d56b353d99b108ac176c.png

    但是,这也仍然存在一个问题:在原始图像分辨率上进行卷积运算非常昂贵。为了解决这个问题, FCN 在网络内部使用了下采样和上采样:下采样层被称为条纹卷积( striped convolution );而上采样层被称为反卷积( transposed convolution )。

    尽管采用了上采样和下采样层,但由于池化期间的信息丢失, FCN 会生成比较粗糙的分割映射。 SegNet 是一种比 FCN (使用最大池化和编码解码框架)更高效的内存架构。在 SegNet 解码技术中,从更高分辨率的特征映射中引入了 shortcut/skip connections ,以改善上采样和下采样后的粗糙分割映射。

    9faa85d5ae1ef8fc57b976f5bcd52436.png

    目前的语义分割研究都依赖于完全卷积网络,如空洞卷积 ( Dilated Convolutions ),DeepLab 和 RefineNet 。

    ▌5 、实例分割

    ca92387e6f4e40ecf5d02a8faad03959.png

    除了语义分割之外,实例分割将不同类型的实例进行分类,比如用 5 种不同颜色来标记 5 辆汽车。分类任务通常来说就是识别出包含单个对象的图像是什么,但在分割实例时,我们需要执行更复杂的任务。我们会看到多个重叠物体和不同背景的复杂景象,我们不仅需要将这些不同的对象进行分类,而且还要确定对象的边界、差异和彼此之间的关系!

    到目前为止,我们已经看到了如何以多种有趣的方式使用卷积神经网络的特征,通过边界框有效定位图像中的不同对象。我们可以将这种技术进行扩展吗?也就是说,对每个对象的精确像素进行定位,而不仅仅是用边界框进行定位? Facebook AI 则使用了 Mask R-CNN 架构对实例分割问题进行了探索。

    cc8e9752ec1d97ea32ccb4a3b54e4ebb.png

    就像 Fast R-CNN 和 Faster R-CNN 一样, Mask R-CNN 的底层是鉴于 Faster R-CNN 在物体检测方面效果很好,我们是否可以将其扩展到像素级分割?

    Mask R-CNN 通过向 Faster R-CNN 添加一个分支来进行像素级分割,该分支输出一个二进制掩码,该掩码表示给定像素是否为目标对象的一部分:该分支是基于卷积神经网络特征映射的全卷积网络。将给定的卷积神经网络特征映射作为输入,输出为一个矩阵,其中像素属于该对象的所有位置用 1 表示,其他位置则用 0 表示,这就是二进制掩码。

    10e57c52fc7cab8865154bcf190e6004.png

    另外,当在原始 Faster R-CNN 架构上运行且没有做任何修改时,感兴趣池化区域( RoIPool ) 选择的特征映射区域或原始图像的区域稍微错开。由于图像分割具有像素级特性,这与边界框不同,自然会导致结果不准确。 Mas R-CNN 通过调整 RoIPool 来解决这个问题,使用感兴趣区域对齐( Roialign )方法使其变的更精确。本质上, RoIlign 使用双线性插值来避免舍入误差,这会导致检测和分割不准确。

    一旦生成这些掩码, Mask R-CNN 将 RoIAlign 与来自 Faster R-CNN 的分类和边界框相结合,以便进行精确的分割:

    f82be1b505cae977983b6e36b5a1ed5d.png

    ▌Matlab实例-----工业产品识别检测 + 自动驾驶中的汽车检测

    工业产品识别与尺寸检测

    若谷:Matlab图像处理实例----基于卷积神经网络的工业产品尺寸检测(含代码)zhuanlan.zhihu.com

    自动驾驶中的汽车检测

    若谷:Matlab图像处理实例----基于卷积神经网络的工业产品尺寸检测(含代码)

    若谷:Matlab图像处理实例----基于卷积神经网络的工业产品尺寸检测(含代码)zhuanlan.zhihu.com

    ▌结语

    上述这 5 种主要的计算机视觉技术可以从单个或一系列图像中提取、分析和理解有用的信息。第六部分的Matlab实例-----水面船艇识别,step by step展示了CNN用于图像目标识别的方法和操作流程。当然,还有一些更高级的技术,如风格变换、灰白变彩色化、(表情)动作识别、三维目标、人体姿势估计等。事实上,计算机视觉的高级发展远没有到尽头。

    展开全文
  • 针对单次阈值分割法和灰度均值区域生长法在提取目标时出现不能分割出车身投影或者大量丢失车体等问题,本文结合单次阈值分割法和区域生长法的优势,提出了基于顶帽-底帽变换和二次图像分割的目标提取算法。...
  • 为了遥感图像中提取出更为准确完整的目标边缘,提出一种基于无下采样Shearlet 模极大值和改进数学形态学的目标边缘提取方法。首先采用无下采样 Shearlet 变换(NSST)将图像分解成边缘细节丰富的高频分量和边缘细节...
  • 摘要:20世纪80年代开始,机器视觉技术的发展速度不断加快,已经走进了人们的日常生活与工作之。...通过机器视觉对图像目标与背景进行特点分析,然后选取适合的阈值分割方法,可对目标物体进行提取、识别与定位。
  • 在此基础上,为排除噪声干扰的影响,采用数学形态学和迭代阈值分割相结合的方法从目标区域中提取出缺陷区域,并在迭代阈值分割的基础上,利用基于数学形态学的边缘提取算法提取了缺陷的边缘。实验结果表明,该法很好地...
  • 部分 V图像特征提取与描述34 角点检测的 FAST 算法目标• 理解 FAST 算法的基础• 使用 OpenCV 的 FAST 算法相关函数进行角点检测原理我们前面学习了几个特征检测器,它们大多数效果都很好。但是实时处理的角度...

    部分 V

    图像特征提取与描述

    34 角点检测的 FAST 算法

    目标

    • 理解 FAST 算法的基础

    • 使用 OpenCV 中的 FAST 算法相关函数进行角点检测

    原理

    我们前面学习了几个特征检测器,它们大多数效果都很好。但是从实时处理的角度来看,这些算法都不够快。一个最好例子就是 SLAM(同步定位与地图构建),移动机器人,它们的计算资源非常有限。

    为了解决这个问题,Edward_Rosten 和 Tom_Drummond 在 2006 年提出里 FAST 算法。我们下面将会对此算法进行一个简单的介绍。你可以参考原始文献获得更多细节(本节中的所有图像都是曲子原始文章)。

    34.1 使用 FAST 算法进行特征提取

    1. 在图像中选取一个像素点 p,来判断它是不是关键点。I p 等于像素点 p的灰度值。

    2. 选择适当的阈值 t。

    3. 如下图所示在像素点 p 的周围选择 16 个像素点进行测试。

    4. 如果在这 16 个像素点中存在 n 个连续像素点的灰度值都高于 I p + t,或者低于 I p −t,那么像素点 p 就被认为是一个角点。如上图中的虚线所示,n 选取的值为 12。

    5. 为了获得更快的效果,还采用了而外的加速办法。首先对候选点的周围每个 90 度的点:1,9,5,13 进行测试(先测试 1 和 19, 如果它们符合阈值要求再测试 5 和 13)。如果 p 是角点,那么这四个点中至少有 3 个要符合阈值要求。如果不是的话肯定不是角点,就放弃。对通过这步测试的点再继续进行测试(是否有 12 的点符合阈值要求)。这个检测器的效率很高,但是它有如下几条缺点:

    • 当 n<12 时它不会丢弃很多候选点 (获得的候选点比较多)。

    • 像素的选取不是最优的,因为它的效果取决与要解决的问题和角点的分布情况。

    • 高速测试的结果被抛弃

    • 检测到的很多特征点都是连在一起的。

    前 3 个问题可以通过机器学习的方法解决,最后一个问题可以使用非最大值抑制的方法解决。

    34.2 机器学习的角点检测器

    1. 选择一组训练图片(最好是跟最后应用相关的图片)

    2. 使用 FAST 算法找出每幅图像的特征点

    3. 对每一个特征点,将其周围的 16 个像素存储构成一个向量。对所有图像都这样做构建一个特征向量 P

    4. 每一个特征点的 16 像素点都属于下列三类中的一种。

    5. 根据这些像素点的分类,特征向量 P 也被分为 3 个子集:P d ,P s ,P b

    6. 定义一个新的布尔变量 K p ,如果 p 是角点就设置为 Ture,如果不是就设置为 False。

    7. 使用 ID3 算法(决策树分类器)Use the ID3 algorithm (decision tree classifier) to query each subset using the variable K p for the knowledge about the true class. It selects the x which yields the most information about whether the candidate pixel is a corner, measured by the entropy of K p .

    8. This is recursively applied to all the subsets until its entropy iszero.

    9. 将构建好的决策树运用于其他图像的快速的检测。

    34.3 非极大值抑制

    使用极大值抑制的方法可以解决检测到的特征点相连的问题

    1. 对所有检测到到特征点构建一个打分函数 V。V 就是像素点 p 与周围 16个像素点差值的绝对值之和。

    2. 计算临近两个特征点的打分函数 V。

    3. 忽略 V 值最低的特征点

    34.4 总结

    FAST 算法比其它角点检测算法都快。但是在噪声很高时不够稳定,这是由阈值决定的。

    34.5 OpenCV 中 中 FAST 特征检测器

    很其他特征点检测一样我们可以在 OpenCV 中直接使用 FAST 特征检测器。如果你愿意的话,你还可以设置阈值,是否进行非最大值抑制,要使用的邻域大小()等。

    邻域设置为下列 3 中之一:cv2.FAST_FEATURE_DETECTOR_TYPE_5_8,cv2.FAST_FEATURE_DETECTOR_TYPE_7_12和 cv2.FAST_FEATURE_DETECTOR_TYPE_9_16。下面是使用 FAST 算法进行特征点检测的简单代码。

    importnumpy as npimportcv2from matplotlib importpyplot as plt

    img= cv2.imread('simple.jpg',0)#Initiate FAST object with default values

    fast =cv2.FastFeatureDetector()#find and draw the keypoints

    kp =fast.detect(img,None)

    img2= cv2.drawKeypoints(img, kp, color=(255,0,0))#Print all default params

    print "Threshold:", fast.getInt('threshold')print "nonmaxSuppression:", fast.getBool('nonmaxSuppression')print "neighborhood:", fast.getInt('type')print "Total Keypoints with nonmaxSuppression:", len(kp)

    cv2.imwrite('fast_true.png',img2)#Disable nonmaxSuppression

    fast.setBool('nonmaxSuppression',0)

    kp=fast.detect(img,None)print "Total Keypoints without nonmaxSuppression:", len(kp)

    img3= cv2.drawKeypoints(img, kp, color=(255,0,0))

    cv2.imwrite('fast_false.png',img3)

    结果如下。第一幅图是使用了非最大值抑制的结果,第二幅没有使用非最大值抑制。

    35 BRIEF(Binary Robust Independent Elementary Features)

    目标

    • 我们学习 BRIEF 算法的基础

    原理

    我们知道 SIFT 算法使用的是 128 维的描述符。由于它是使用的浮点数,所以要使用 512 个字节。同样 SURF 算法最少使用 256 个字节(64 为维描述符)。创建一个包含上千个特征的向量需要消耗大量的内存,在嵌入式等资源有限的设备上这样是合适的。匹配时还会消耗更多的内存和时间。

    但是在实际的匹配过程中如此多的维度是没有必要的。我们可以使用 PCA,LDA 等方法来进行降维。甚至可以使用 LSH(局部敏感哈希)将 SIFT 浮点数的描述符转换成二进制字符串。对这些字符串再使用汉明距离进行匹配。汉明距离的计算只需要进行 XOR 位运算以及位计数,这种计算很适合在现代的CPU 上进行。但我们还是要先找到描述符才能使用哈希,这不能解决最初的内存消耗问题。

    BRIEF 应运而生。它不去计算描述符而是直接找到一个二进制字符串。这种算法使用的是已经平滑后的图像,它会按照一种特定的方式选取一组像素点对 n d (x,y),然后在这些像素点对之间进行灰度值对比。例如,第一个点对的灰度值分别为 p 和 q。如果 p 小于 q,结果就是 1,否则就是 0。就这样对 n d个点对进行对比得到一个 n d 维的二进制字符串。

    n d 可以是 128,256,512。OpenCV 对这些都提供了支持,但在默认情况下是 256(OpenC 是使用字节表示它们的,所以这些值分别对应与 16,32,64)。当我们获得这些二进制字符串之后就可以使用汉明距离对它们进行匹配了。

    非常重要的一点是:BRIEF 是一种特征描述符,它不提供查找特征的方法。所以我们不得不使用其他特征检测器,比如 SIFT 和 SURF 等。原始文献推荐使用 CenSurE 特征检测器,这种算法很快。而且 BRIEF 算法对 CenSurE关键点的描述效果要比 SURF 关键点的描述更好。

    简单来说 BRIEF 是一种对特征点描述符计算和匹配的快速方法。这种算法可以实现很高的识别率,除非出现平面内的大旋转。

    35.1 OpenCV 中的 BRIEF

    下面的代码使用了 CenSurE 特征检测器和 BRIEF 描述符。(在 OpenCV中 CenSurE 检测器被叫做 STAR 检测器)。

    importnumpy as npimportcv2from matplotlib importpyplot as plt

    img= cv2.imread('simple.jpg',0)#Initiate STAR detector

    star = cv2.FeatureDetector_create("STAR")#Initiate BRIEF extractor

    brief = cv2.DescriptorExtractor_create("BRIEF")#find the keypoints with STAR

    kp =star.detect(img,None)#compute the descriptors with BRIEF

    kp, des =brief.compute(img, kp)print brief.getInt('bytes')print des.shape

    函数 brief.getInt( ′ bytes ′ ) 会以字节格式给出 n d 的大小,默认值为 32。下面就是匹配了,我们会在其他章节中介绍。

    36 ORB (Oriented FAST and Rotated BRIEF)

    目标

    • 我们要学习 ORB 算法的基础

    原理

    对于一个 OpenCV 的狂热爱好者来说 ORB 最重要的一点就是:它来自“OpenCV_Labs''。这个算法是在 2011 年提出的。在计算开支,匹配效率以及更主要的是专利问题方面 ORB 算法是是 SIFT 和 SURF 算法的一个很好的替代品。SIFT 和 SURF 算法是有专利保护的,如果你要使用它们,就可能要花钱。但是 ORB 不需要!!!

    ORB 基本是 FAST 关键点检测和 BRIEF 关键点描述器的结合体,并通过很多修改增强了性能。首先它使用 FAST 找到关键点,然后再使用 Harris角点检测对这些关键点进行排序找到其中的前 N 个点。它也使用金字塔从而产生尺度不变性特征。但是有一个问题,FAST 算法步计算方向。那旋转不变性怎样解决呢?作者进行了如下修改。

    它使用灰度矩的算法计算出角点的方向。以角点到角点所在(小块)区域质心的方向为向量的方向。为了进一步提高旋转不变性,要计算以角点为中心半径为 r 的圆形区域的矩,再根据矩计算除方向。

    对于描述符,ORB 使用的是 BRIEF 描述符。但是我们已经知道 BRIEF对与旋转是不稳定的。所以我们在生成特征前,要把关键点领域的这个 patch的坐标轴旋转到关键点的方向。

    For any feature set of n binary tests at location (x i , y i ), define a 2×n matrix, S which contains the coordinates of these pixels. Then using the orientation of patch,θ, its rotation matrix is found and rotates the S to get steered(rotated) version S θ . ORB discretize the angle to increments of2π/30(12 degrees), and construct a lookup table of precomputed BRIEF patterns. As long as the keypoint orientation \theta is consistent across views, the correct set of points S θ will be used to compute its descriptor.

    BRIEF has an important property that each bit feature has a large variance and a mean near 0.5. But once it is oriented along keypoint direction, it loses this property and become more distributed. High variance makes a feature more discriminative, since it responds differentially to inputs. Another desirable property is to have the tests uncorrelated, since then each test will contribute to the result. To resolve all these, ORB runs a greedy search among all possible binary tests to find the ones that have both high variance and means close to 0.5, as well as being uncorrelated. The result is calledrBRIEF.

    For descriptor matching, multi-probe LSH which improves on the traditional LSH, is used. The paper says ORB is much faster than SURF and SIFT and ORB descriptor works better than SURF. ORB isa good choice in low-power devices for panorama stitching etc.

    实验证明,BRIEF 算法的每一位的均值接近 0.5,并且方差很大。steered_BRIEF算法的每一位的均值比较分散(均值为 0.5,0.45,0.35... 等值的关键点数相当),这导致方差减小。数据的方差大的一个好处是:使得特征更容易分辨。为了对 steered_BRIEF 算法使得特征的方差减小的弥补和减小数据间的相关性,用一个学习算法(learning method)选择二进制测试的一个子集。在描述符匹配中使用了对传统 LSH 改善后的多探针 LSH。文章中说 ORB算法比 SURF 和 SIFT 算法快的多,ORB 描述符也比 SURF 好很多。ORB是低功耗设备的最佳选择。

    36.1 OpenCV 中的 ORB 算法

    和前面一样我们首先要使用函数 cv3.ORB() 或者 feature2d 通用接口创建一个 ORB 对象。它有几个可选参数。最有用的应该是 nfeature,默认值为 500,它表示了要保留特征的最大数目。scoreType 设置使用 Harris打分还是使用 FAST 打分对特征进行排序(默认是使用 Harris 打分)等。参数 WTA_K 决定了产生每个 oriented_BRIEF 描述符要使用的像素点的数目。默认值是 2,也就是一次选择两个点。在这种情况下进行匹配,要使用NORM_HAMMING 距离。如果 WTA_K 被设置成 3 或 4,那匹配距离就要设置为 NORM_HAMMING2。

    下面是一个使用 ORB 的简单代码。

    importnumpy as npimportcv2from matplotlib importpyplot as plt

    img= cv2.imread('simple.jpg',0)#Initiate STAR detector

    orb =cv2.ORB()#find the keypoints with ORB

    kp =orb.detect(img,None)#compute the descriptors with ORB

    kp, des =orb.compute(img, kp)#draw only keypoints location,not size and orientation

    img2 = cv2.drawKeypoints(img,kp,color=(0,255,0), flags=0)

    plt.imshow(img2),plt.show()

    练习

    37 特征匹配

    目标

    • 我们将要学习在图像间进行特征匹配

    • 使用 OpenCV 中的蛮力(Brute-Force)匹配和 FLANN 匹配

    37.1 Brute-Force 匹配的基础

    蛮力匹配器是很简单的。首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点。

    对于 BF 匹配器,我们首先要使用 cv2.BFMatcher() 创建一个 BFMatcher 对象。它有两个可选参数。第一个是 normType。它是用来指定要使用的距离测试类型。默认值为 cv2.Norm_L2。这很适合 SIFT 和 SURF 等(c2.NORM_L1 也可以)。对于使用二进制描述符的 ORB,BRIEF,BRISK算法等,要使用 cv2.NORM_HAMMING,这样就会返回两个测试对象之间的汉明距离。如果 ORB 算法的参数设置为 V TA_K==3 或 4,normType就应该设置成 cv2.NORM_HAMMING2。

    第二个参数是布尔变量 crossCheck,默认值为 False。如果设置为True,匹配条件就会更加严格,只有到 A 中的第 i 个特征点与 B 中的第 j 个特征点距离最近,并且 B 中的第 j 个特征点到 A 中的第 i 个特征点也是最近(A 中没有其他点到 j 的距离更近)时才会返回最佳匹配(i,j)。也就是这两个特征点要互相匹配才行。这样就能提供统一的结果,这可以用来替代 D.Lowe在 SIFT 文章中提出的比值测试方法。

    BFMatcher 对象具有两个方法,BFMatcher.match() 和 BFMatcher.knnMatch()。

    第一个方法会返回最佳匹配。第二个方法为每个关键点返回 k 个最佳匹配(降序排列之后取前 k 个),其中 k 是由用户设定的。如果除了匹配之外还要做其他事情的话可能会用上(比如进行比值测试)。

    就像使用 cv2.drawKeypoints() 绘制关键点一样,我们可以使用cv2.drawMatches() 来绘制匹配的点。它会将这两幅图像先水平排列,然后在最佳匹配的点之间绘制直线(从原图像到目标图像)。如果前面使用的是 BFMatcher.knnMatch(),现在我们可以使用函数 cv2.drawMatchsKnn为每个关键点和它的 k 个最佳匹配点绘制匹配线。如果 k 等于 2,就会为每个关键点绘制两条最佳匹配直线。如果我们要选择性绘制话就要给函数传入一个掩模。

    让我们分别看一个 ORB 和一个 SURF 的例子吧。(使用不同距离计算方法)。

    37.2 对 对 ORB 描述符进行蛮力匹配

    现在我们看一个在两幅图像之间进行特征匹配的简单例子。在本例中我们有一个查询图像和一个目标图像。我们要使用特征匹配的方法在目标图像中寻找查询图像的位置。(这两幅图像分别是/sample/c/box.png,和/sample/c/box_in_scene.png)

    我们使用 ORB 描述符来进行特征匹配。首先我们需要加载图像计算描述符。

    importnumpy as npimportcv2from matplotlib importpyplot as plt

    img1= cv2.imread('box.png',0) #queryImage

    img2 = cv2.imread('box_in_scene.png',0) #trainImage

    #Initiate SIFT detector

    orb =cv2.ORB()#find the keypoints and descriptors with SIFT

    kp1, des1 =orb.detectAndCompute(img1,None)

    kp2, des2= orb.detectAndCompute(img2,None)

    下面我们要创建一个 BFMatcher 对象,并将距离计算设置为 cv2.NORM_HAMMING(因为我们使用的是 ORB),并将 crossCheck 设置为 True。然后使用 Matcher.match()方法获得两幅图像的最佳匹配。然后将匹配结果按特征点之间的距离进行降序排列,这样最佳匹配就会排在前面了。最后我们只将前 10 个匹配绘制出来(太多了看不清,如果愿意的话你可以多画几条)。

    #create BFMatcher object

    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)#Match descriptors.

    matches =bf.match(des1,des2)#Sort them in the order of their distance.

    matches = sorted(matches, key = lambdax:x.distance)#Draw first 10 matches.

    img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10], flags=2)

    plt.imshow(img3),plt.show()

    下面就是我得到的结果。

    37.3 匹配器对象是什么?

    matches = bf.match(des1,des2) 返回值是一个 DMatch 对象列表。这个DMatch 对象具有下列属性:

    • DMatch.distance - 描述符之间的距离。越小越好。

    • DMatch.trainIdx - 目标图像中描述符的索引。

    • DMatch.queryIdx - 查询图像中描述符的索引。

    • DMatch.imgIdx - 目标图像的索引。

    37.4 对 对 SIFT 描述符进行蛮力匹配和比值测试

    现在我们使用 BFMatcher.knnMatch() 来获得 k 对最佳匹配。在本例中我们设置 k = 2,这样我们就可以使用 D.Lowe 文章中的比值测试了。

    importnumpy as npimportcv2from matplotlib importpyplot as plt

    img1= cv2.imread('box.png',0) #queryImage

    img2 = cv2.imread('box_in_scene.png',0) #trainImage

    #Initiate SIFT detector

    sift =cv2.SIFT()#find the keypoints and descriptors with SIFT

    kp1, des1 =sift.detectAndCompute(img1,None)

    kp2, des2=sift.detectAndCompute(img2,None)#BFMatcher with default params

    bf =cv2.BFMatcher()

    matches= bf.knnMatch(des1,des2, k=2)#Apply ratio test

    good =[]for m,n inmatches:if m.distance < 0.75*n.distance:

    good.append([m])#cv2.drawMatchesKnn expects list of lists as matches.

    img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)

    plt.imshow(img3),plt.show()

    结果如下:

    37.5 FLANN 匹配器

    FLANN 是快速最近邻搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)的简称。它是一个对大数据集和高维特征进行最近邻搜索的算法的集合,而且这些算法都已经被优化过了。在面对大数据集时它的效果要好于 BFMatcher。

    我们来对第二个例子使用 FLANN 匹配看看它的效果。

    使用 FLANN 匹配,我们需要传入两个字典作为参数。这两个用来确定要使用的算法和其他相关参数等。第一个是 IndexParams。各种不同算法的信息可以在 FLANN 文档中找到。这里我们总结一下,对于 SIFT 和 SURF 等,我们可以传入的参数是:

    index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)

    但使用 ORB 时,我们要传入的参数如下。注释掉的值是文献中推荐使用的,但是它们并不适合所有情况,其他值的效果可能会更好。

    index_params= dict(algorithm =FLANN_INDEX_LSH,

    table_number= 6, #12

    key_size = 12, #20

    multi_probe_level = 1) #2

    第二个字典是 SearchParams。用它来指定递归遍历的次数。值越高结果越准确,但是消耗的时间也越多。如果你想修改这个值,传入参数:

    search p arams = dict(checks = 100)。

    有了这些信息我们就可以开始了。

    importnumpy as npimportcv2from matplotlib importpyplot as plt

    img1= cv2.imread('box.png',0) #queryImage

    img2 = cv2.imread('box_in_scene.png',0) #trainImage

    #Initiate SIFT detector

    sift =cv2.SIFT()#find the keypoints and descriptors with SIFT

    kp1, des1 =sift.detectAndCompute(img1,None)

    kp2, des2=sift.detectAndCompute(img2,None)#FLANN parameters

    FLANN_INDEX_KDTREE =0

    index_params= dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)

    search_params= dict(checks=50) #or pass empty dictionary

    flann=cv2.FlannBasedMatcher(index_params,search_params)

    matches= flann.knnMatch(des1,des2,k=2)#Need to draw only good matches, so create a mask

    matchesMask = [[0,0] for i inxrange(len(matches))]#ratio test as per Lowe's paper

    for i,(m,n) inenumerate(matches):if m.distance < 0.7*n.distance:

    matchesMask[i]=[1,0]

    draw_params= dict(matchColor = (0,255,0),

    singlePointColor= (255,0,0),

    matchesMask=matchesMask,

    flags=0)

    img3= cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)

    plt.imshow(img3,),plt.show()

    结果如下:

    38 使用特征匹配和单应性查找对象

    目标

    • 联合使用特征提取和 calib3d 模块中的 findHomography 在复杂图像中查找已知对象。

    38.1 基础

    还记得上一节我们做了什么吗?我们使用一个查询图像,在其中找到一些特征点(关键点),我们又在另一幅图像中也找到了一些特征点,最后对这两幅图像之间的特征点进行匹配。简单来说就是:我们在一张杂乱的图像中找到了一个对象(的某些部分)的位置。这些信息足以帮助我们在目标图像中准确的找到(查询图像)对象。

    为了达到这个目的我们可以使用 calib3d 模块中的 cv2.findHomography()函数。如果将这两幅图像中的特征点集传给这个函数,他就会找到这个对象的透视图变换。然后我们就可以使用函数 cv2.perspectiveTransform() 找到这个对象了。至少要 4 个正确的点才能找到这种变换。

    我们已经知道在匹配过程可能会有一些错误,而这些错误会影响最终结果。为了解决这个问题,算法使用 RANSAC 和 LEAST_MEDIAN(可以通过参数来设定)。所以好的匹配提供的正确的估计被称为 inliers,剩下的被称为outliers。cv2.findHomography() 返回一个掩模,这个掩模确定了 inlier 和outlier 点。

    让我们来搞定它吧!!!

    38.2 代码

    和通常一样我们先在图像中来找到 SIFT 特征点,然后再使用比值测试找到最佳匹配。

    importnumpy as npimportcv2from matplotlib importpyplot as plt

    MIN_MATCH_COUNT= 10img1= cv2.imread('box.png',0) #queryImage

    img2 = cv2.imread('box_in_scene.png',0) #trainImage

    #Initiate SIFT detector

    sift =cv2.SIFT()#find the keypoints and descriptors with SIFT

    kp1, des1 =sift.detectAndCompute(img1,None)

    kp2, des2=sift.detectAndCompute(img2,None)

    FLANN_INDEX_KDTREE=0

    index_params= dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)

    search_params= dict(checks = 50)

    flann=cv2.FlannBasedMatcher(index_params, search_params)

    matches= flann.knnMatch(des1,des2,k=2)#store all the good matches as per Lowe's ratio test.

    good =[]for m,n inmatches:if m.distance < 0.7*n.distance:

    good.append(m)

    现在我们设置只有存在 10 个以上匹配时才去查找目标(MIN_MATCH_COUNT=10),

    否则显示警告消息:“现在匹配不足!”

    如果找到了足够的匹配,我们要提取两幅图像中匹配点的坐标。把它们传入到函数中计算透视变换。一旦我们找到 3x3 的变换矩阵,就可以使用它将查询图像的四个顶点(四个角)变换到目标图像中去了。然后再绘制出来。

    if len(good)>MIN_MATCH_COUNT:

    src_pts= np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)

    dst_pts= np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)

    M, mask= cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)

    matchesMask=mask.ravel().tolist()

    h,w=img1.shape

    pts= np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)

    dst=cv2.perspectiveTransform(pts,M)

    img2= cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.LINE_AA)else:print "Not enough matches are found - %d/%d" %(len(good),MIN_MATCH_COUNT)

    matchesMask=None#Finally we draw our inliers (if successfully found the object) or matching keypoints (if failed).

    draw_params= dict(matchColor = (0,255,0), #draw matches in green color

    singlePointColor =None,

    matchesMask= matchesMask, #draw only inliers

    flags = 2)

    img3= cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)

    plt.imshow(img3,'gray'),plt.show()

    结果如下。复杂图像中被找到的目标图像被标记成白色。

    展开全文
  • 在OpenCV,一般转换图像格式为HSV格式(默认格式为BGR),再进行指定颜色的提取。 直接使用RGB提取颜色不推荐 HSV格式的介绍:HSV 为色相,饱和度,明度。 1.将一副图像从rgb颜色空间转换到hsv颜色空间 hsv...
  • 测量数据中提取地物目标极化特征有两类:一种针对相对平稳或者相对固定的目标;另一种针对若干独立的小单元组成的分布式目标。 1.平稳目标的散射特征 对于散射特征平稳的相对固定的目标极化SAR图像数据分解出...
  • 机场识别作为模式识别领域的问题之一,在军事上有着重要的应用前景。...用Canny算子进行图像的边缘提取,提出了一种改进的Hough变换,能够边缘图像中准确地提取出直线段,并最终实现机场跑道的定位。
  • 本书基本概念入手,系统地介绍了图像分析的基本理论与方法,涉及数字图像处理的基础知识、特征提取图像表示、图像分割与目标识别、场景理解等相关问题。 并在书加入了应用实例以及实验结果图片,突出了理论和...
  • 在压缩跟踪图像特征是通过随机投影生成的。 生成的图像特征受随机数影响,因此每次执行的结果都不同。 如果未捕获目标的明显特征,则跟踪器很可能会失败。 因此,每次执行的跟踪结果都不一致。 所提出的算法...
  • 为了能够监控视频快速、准确地分析车辆目标,提出了基于感兴趣区域( ROI) 的车辆目标提.取方法。针对高速公路监控视频,利用混合高斯背景建模,在视频划定ROI,以排除逆向车道车辆目标.的影响,应用图像形态学...
  • 第二期 传统计算机视觉案例导言传统计算机视觉方法使用成熟的 CV 技术处理目标检测问题,如特征描述子...从图像中提取出足够多的特征后,这些特征可形成每个目标类别的定义(即「词袋」)。预测阶段中,在其他图像中...
  • 部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 34 角点检测的 FAST 算法 目标 • 理解 FAST 算法的基础 • 使用 OpenCV 的 FAST 算法相关函数进行角点检测原理 我们前面学习了几个特征...
  • 首先是提取出这两个白色小点在的圆环,然后在此圆环之使用阈值函数就可以看到提取出来的噪声点。如果要在源图像标注出来噪声点的话需要使用斑点检测算子。 源程序 void process(){ Mat source = imread(""); ...
  • 图像中目标扣取代码 真的很不错 大家可以试一试 不过是matlab代码 可以很好的把目标从图像中提取出来哦
  • 尽管我们可以图片中提取一些功能,但是本地二值模式(LBP)是理论上简单但有效的灰度和旋转不变纹理分类方法。 它们之所以起作用,是因为最常见的图案对应于原始的微特征,例如边缘,拐角,斑点,平...
  • 首先,我们要明白,图像检索,简单的说,便是图片检索数据库检索出满足条件的图片,图像检索技术的研究根据描述图像内容方式的不同可以分为两类: 一类是基于文本的图像检索技术,简称TBIR, 一类为基于内容的...
  • 计算机视觉理论的特征描述是常见的目标分析技术之一,关键点的检测和关键点的提取目标分析的重要手段和重要步骤之一。局部图像特征描述的核心问题是不变性和可分析性,不变性是基于特征描述对于视角变化的不变性...
  • 在此文章处,将讨论特征以及怎样利用视觉工具箱从图像中提取特征。借助于上一篇博客的图像处理技术,我们将要讨论几种特征类型:区域、线和兴趣点。 区域特征 图像分割是把一幅图像划分成具有应用意义的若干区域的...
  • 我们目前正在从图像中的标签中提取数据。 从网站上抓取的包含物种正式描述(治疗)的数据。 物种描述和分布数据的PDS图像。 数据收集说明的图像。 注意所有术语,特征和提取方法对于要开采的文献都是唯一的,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 827
精华内容 330
关键字:

从图像中提取目标