• 这本书怎样?

    这本书怎样?

    展开全文
  • 序列图像 图像处理使用 序列图像 图像处理使用 序列图像 图像处理使用
  • 图像处理程序的序列化和反序列化 所谓序列化,就是讲内存数据保存为磁盘数据的过程,反序列化就是反过来理解。对于图像处理程序来说,最主要的变量是图片,然后还有相关的参数或运算结果。 opencv本身提供了...
    图像处理程序的序列化和反序列化
           所谓序列化,就是讲内存数据保存为磁盘数据的过程,反序列化就是反过来理解。对于图像处理程序来说,最主要的变量是图片,然后还有相关的参数或运算结果。
     opencv本身提供了FileStorage的序列化保存方法,这对于保存参数来说非常适合;但是如果用来保存图片,会将原始图片的体积多倍增大,速度也比较慢。Mfc本身也提供了序列化的操作,但是使用起来需要修改的地方比较多。
           我们最终想要通过保存得到,并且能够被图像处理程序读取的,是一个单一的文件。这个文件不仅包含了图片数据,而且包括相关的参数和运算结果,同时这个文件不能太大。所以我想到采用zip压缩/解压的方式来打包原始图片和运算结果。实验证明,效果是能够符合要求的。
      在打包代码的选择上,找到了比较好的实现。zip.c++/unzip.c++中提供了稳定并且便于使用的压缩解压过程(具体使用参考对应的.h文件,压缩文件可以设定密码)。实际使用中,保存的时候参数保存为.xml文件,图片保存为.jpg图片,而后统一压缩成.go文件;读取的时候反过来操作。
      为了说明问题,编写例程。现在把使用说明一下,具体细节可以参考代码。
    1、点击读取图片,可以读入jpg或bmp图片,同时手工设置参数一到三
    2、点击保存,保存为.go文件
    3、点击打开,打开相应的.go文件,同时解压缩后,图片和参数分别显示出来。
      本例程主要展现的是“图像处理程序的序列化和反序列化”,实际使用过程中,在稳定性和易用性方面还要做工作。
        
    主要代码:
    //保存序列化结果
    void CGOsaveView::OnButtonSave()
    {
    CString str1;string s1;
    CString str2;string s2;
    CString str3;string s3;
     
    CString szFilters= _T("go(*.go)|*.go|*(*.*)|*.*||");
    CString FilePathName = "";
    CFileDialog dlg(FALSE,NULL,NULL,0,szFilters,this);
    if(dlg.DoModal()==IDOK){
    FilePathName=dlg.GetPathName();
    }
     
    if (m_fimage.rows <= 0)
    {
    AfxMessageBox("m_fimage为空!");
    return;
    }
     
    GetDlgItemText(IDC_EDIT1,str1);
    GetDlgItemText(IDC_EDIT2,str2);
    GetDlgItemText(IDC_EDIT3,str3);
    s1 = str1.GetBuffer(0);
    s2 = str2.GetBuffer(0);
    s3 = str3.GetBuffer(0);
     
    string filename = "params.xml";
    FileStorage fs(filename, FileStorage::WRITE);
    fs << "str1" << s1;
    fs << "str2" << s2;
    fs << "str3" << s3;
    fs.release();
     
    imwrite("m_fimage.jpg",m_fimage);
     
    AfxMessageBox("数据保存成功!");
     
     
    HZIP hz = CreateZip(FilePathName,"GreenOpen");//可以设定密码
    ZipAdd(hz,"params.xml", "params.xml");
    ZipAdd(hz,"m_fimage.jpg", "m_fimage.jpg");
    CloseZip(hz);
    AfxMessageBox("数据压缩成功!");
     
      
    }
     
    //打开序列化结果
    void CGOsaveView::OnButtonOpen()
    {
    string s1;
    string s2;
    string s3;
     
    CString szFilters= _T("*(*.*)|*.*|go(*.go)|*.go||");
    CString FilePathName = "";
    CFileDialog dlg(TRUE,NULL,NULL,0,szFilters,this);
    if(dlg.DoModal()==IDOK){
    FilePathName=dlg.GetPathName();
    }
    HZIP hz = OpenZip(FilePathName,"GreenOpen");
    ZIPENTRY ze; GetZipItem(hz,-1,&ze); int numitems=ze.index;
    if (numitems <=0)
    {
    AfxMessageBox("文件读取错误!");
    return;
    }
    for (int i=0; i<numitems; i++)
    GetZipItem(hz,i,&ze);
    UnzipItem(hz,i,ze.name);
    }
    CloseZip(hz);
    AfxMessageBox("数据解压缩成功");
    m_fimage = imread("m_fimage.jpg");
    if (m_fimage.rows <=0 )
    {
    AfxMessageBox("文件读取错误!");
    return;
    }
    string filename = "params.xml";
    FileStorage fs(filename, FileStorage::READ);
    fs["str1"]>>s1;
    fs["str2"]>>s2;
    fs["str3"]>>s3;
     
    SetDlgItemText(IDC_EDIT1,s1.c_str());
    SetDlgItemText(IDC_EDIT2,s2.c_str());
    SetDlgItemText(IDC_EDIT3,s3.c_str());
    AfxMessageBox("数据反序列成功");
    SOURSHOW;
    }
     





    目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
    展开全文
  • 在学习分类器的时候,我们会接触到xml,yaml等标记语言的文件。这些文件实际上就是记录了对一件事物(不仅仅是图片)的描述。那具体记录的是什么呢?等下就会有讲解。 先贴上代码#include #include ...

    在学习分类器的时候,我们会接触到xml,yaml等标记语言的文件。这些文件实际上就是记录了对一件事物(不仅仅是图片)的描述。那具体记录的是什么呢?等下就会有讲解。
    先贴上代码

    #include<iostream>
    #include<opencv2\opencv.hpp>
    using namespace cv;
    using namespace std;
    
    int main()
    { 
        Mat wirteimg = Mat::eye(10, 10, CV_8UC1);//生成一个100*100的对角矩阵
        Mat readimg;
        //imwrite("对角矩阵.jpg", img);//保存为jpg格式。测试时删除原文件可查看效果,用全局路径可以保存到特定路径
        //imread()函数可以进行读取
        //imwrite函数只支持CV8U类型的数据(使用OpenCV保存其他类型Mat的时候,程序不会报错,但是无法生成结果文件)可以用FileStorage类,来保存为XML/YAML文件(一种采用标记语言编码数据的文件格式)
        FileStorage fw("对角矩阵.xml", FileStorage::WRITE);//做输出
            fw << "Mat" << wirteimg;//通过输出流写文件,给定MAT标签
                fw.release();//释放文件流对象
        FileStorage fr("对角矩阵.xml", FileStorage::READ);//做读取
        //读取并打印XML文件
            fr["Mat"] >> readimg;//通过输入流读取数据,读取时也要先用标签
                fr.release();//调用这个函数后  
        cout << readimg;        
    return 0;
    }

    在这里我们对FileStorage右键转到定义,就可以看到这个类的声明,其中我翻译了一部分用到的

    class **CV_EXPORTS_W** *FileStorage*
    {
    public:
        //! file storage mode
        enum Mode //这里可以看到操作模式中是一个枚举类型,包含了一系列操作
        {
            READ        = 0, //读取!< value, open the file for reading
            WRITE       = 1, //写入!< value, open the file for writing
            APPEND      = 2, //打开一个文件并添加!< value, open the file for appending
            MEMORY      = 4, //从缓冲区读或写入一个FileStorage释放后返回的数据!< flag, read data from source or write data to the internal buffer (which is
                             //!< returned by FileStorage::release)
            FORMAT_MASK = (7<<3), //添加一个格式标签,如上个代码块中的写入前先写入个Mat字符串,读取时先读取其是否有Mat字符串!< mask for format flags
            FORMAT_AUTO = 0,      //自动添加!< flag, auto format
            FORMAT_XML  = (1<<3), //xml文件标签!< flag, XML format
            FORMAT_YAML = (2<<3)  //yaml标签!< flag, YAML format
        };
        enum
        {
            UNDEFINED      = 0,
            VALUE_EXPECTED = 1,
            NAME_EXPECTED  = 2,
            INSIDE_MAP     = 4
        };
    
        /** @brief The constructors.
    
        The full constructor opens the file. Alternatively you can use the default constructor and then
        call FileStorage::open.
         */
        CV_WRAP FileStorage();
    
        /** @overload
        @param source Name of the file to open or the text string to read the data from. Extension of the
        file (.xml or .yml/.yaml) determines its format (XML or YAML respectively). Also you can append .gz
        to work with compressed files, for example myHugeMatrix.xml.gz. If both FileStorage::WRITE and
        FileStorage::MEMORY flags are specified, source is used just to specify the output file format (e.g.
        mydata.xml, .yml etc.).
        @param flags Mode of operation. See  FileStorage::Mode
        @param encoding Encoding of the file. Note that UTF-16 XML encoding is not supported currently and
        you should use 8-bit encoding instead of it.
        */
        CV_WRAP FileStorage(const String& source, int flags, const String& encoding=String());//上面使用到的是这个有参构造函数,参数分别为,文件名,操作类型,末尾表明该文件使用的编码格式,可以不写
    
        /** @overload */
        FileStorage(CvFileStorage* fs, bool owning=true);

    好了,现在在来看下保存的xml文件到底写的是什么东西

    <?xml version="1.0"?>
    <opencv_storage>
    <Mat type_id="opencv-matrix">//这里包含了标签,即描述的文件
      <rows>10</rows>//这里很直观的看出是图像的一些数据信息,包括行和列
      <cols>10</cols>
      <dt>u</dt>//这里是图像的通道类型,如果是CV_8UC2.则会变成"2u"。
      <data>//这里是数据
        1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
        0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0
        0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1</data></Mat>
    </opencv_storage>
    

    看到这里就明晰前面的问题了,这文件其实就是对Mat的数据类型进行了标记。对图像的标记,其实也就是写入了一些关于图像被处理后得到的特征的数据。关键还是看人对一个事物进行了怎样的抽象,以及在计算机中实现相应的数据结构。

    注:本人才疏学浅,欢迎指正。

    展开全文
  • 读取图片序列 seek、tell from PIL import Image image = Image.open('./images/capf.gif') index=1 try: while 1: image.seek(image.tell()+1) print('图像读取第'+str(index)+'帧') image.save('....

    读取图片序列 seek、tell

    from PIL import Image
    
    image = Image.open('./images/capf.gif')
    index=1
    try:
        while 1:
            image.seek(image.tell()+1)
            print('图像读取第'+str(index)+'帧')
            image.save('./images/capf_gif/帧'+str(index)+'.png')
            index=index+1
    except EOFError:
        print('图像读取完毕!')
    
    图像读取第1帧
    图像读取第2帧
    图像读取第3帧
    图像读取第4帧
    图像读取第5帧
    图像读取第6帧
    图像读取第7帧
    图像读取第8帧
    图像读取第9帧
    图像读取第10帧
    图像读取第11帧
    图像读取第12帧
    图像读取完毕!
    

    迭代器读取 ImageSequence模块

    from PIL import ImageSequence
    for frame in ImageSequence.Iterator(image):
        print(frame.format,frame.size,frame.mode,frame.getbands())
    
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    GIF (500, 296) P ('P',)
    
    展开全文
  • 目前想法: 1、先做一般的动作识别分类,然后再迁移到特定行为; 2、先用数据集做,再用不分割的视频改进。 数据库: ...Real-world Anomaly Detection in Surveillance Videos, arxiv 1801.04264):...

    目前想法:

    1、先做一般的动作识别分类,然后再迁移到特定行为;

    2、先用数据集做,再用不分割的视频改进。

    数据库:

    异常行为识别:https://www.leiphone.com/news/201803/H7hLNZlR8sQ3hYqz.html

    Real-world Anomaly Detection in Surveillance Videos, arxiv 1801.04264):提出了一种基于深度多实例排序的弱监督算法框架,同时提出了一个新的大规模异常事件检测数据集http://crcv.ucf.edu/cchen/

    THUMOS 2014:该数据集即为THUMOS Challenge 2014,地址为 THUMOS14。该数据集包括行为识别和时序行为检测两个任务。它的训练集为UCF101数据集,包括101类动作,共计13320段分割好的视频片段。THUMOS2014的验证集和测试集则分别包括1010和1574个未分割过的视频。在时序行为检测任务中,只有20类动作的未分割视频是有时序行为片段标注的,包括200个验证集视频(包含3007个行为片段)和213个测试集视频(包含3358个行为片段)。这些经过标注的未分割视频可以被用于训练和测试时序行为检测模型。

    未分割的时序视频中的动作定位,使用多重C3D网络

    https://blog.csdn.net/wzmsltw/article/details/65437295 (<--原文链接)

    https://github.com/zhengshou/scnn/

    精度太少了,state-of-the-art才十几。。

    a.多尺度视频片段生成
    SCNN模型框架的第一步就是生成候选的视频片段,之后拿这些片段作为下一步的输入。在SCNN中采用了划窗方法产生视频片段,包括多个大小的窗口:16,32,64,128,256,512, 划窗的重叠为75%。在得到视频片段后,对其进行平均采样16帧视频,从而使得输出的segment的长度均为16。在生成训练数据时,同时还记录和segment和ground truth instance之间的最大重叠度(IoU)以及类别(即如果存在多个重叠的ground truth,取重叠度最大的那个)。

    b.多阶段SCNN
    SCNN 共有3个阶段:proposal, classification and localization network。三者均为结构相同的C3D network[2],只有最后一层全连接层根据任务不同而有不同的长度。三者的输入均为上一步得到的segment。

    Proposal Network: 输出为两类,即预测该segment是动作的概率及是背景的概率(action or not)。训练时将IoU大于0.7的作为正样本(动作),小于0.3的作为负样本(背景),对负样本进行采样使得正负样本比例均衡。采用softmax loss进行训练。

    classification Network: 输出为K+1个类别(包括背景类)的分数, 这个网络被用来初始化localization network, 仅在训练阶段使用,在测试阶段不使用。训练时同样将IoU大于0.7的作为正样本(K类动作),小于0.3的作为背景类,对背景类动作进行采样使得背景类动作的数量和K类动作数量的平均值相近。训练时同样采用softmax loss。

    Localization Network:输出为K+1个类别(包括背景类)的分数,这个分数应该算做是该segment是某类动作的置信度分数。在训练时localization network用训练好的classification network做初始化,使用与classification network 相同的数据集,但增加了基于IoU分数的overlap Loss.本文新提出的一个loss function:

    lambda为比例系数,SCNN中=1


        其中kn为该segment的真实类别,vn为其IoU, Pn为localization network 的输出分数。αα 为超参数。 这个loss的作用是根据IoU的分数调整预测结果,使得输出的分数不仅能对动作的类别进行分类,还能够估计其与ground truth的重叠程度。有利于后续的NMS。

    测试时的计算流程: 在测试时,只使用proposal 及 localization network。对于每个segment,先用proposal network计算它是动作的概率,若这个概率高于阈值(0.7),则作为一个候选segment进入下一个阶段用localization network计算置信度分数,低于阈值的segment都会被舍弃。

    c.后处理
    后处理是在测试阶段进行的。使用的方法是基于 PlPl(localization network的输出分数)进行非极大化抑制(NMS)来移除重叠,在SCNN中,NMS的阈值被设置为0.1。对于时序上重叠的动作,通过NMS去除分数低的,保留分数高的。 

     

    SCNN完善:

    Efficient Action Detection in Untrimmed Videos via Multi-Task Learning (WACV2016)

    这篇文章实际上是将SCNN的多阶段网络放到了一个网络里面去,通过共享前面的卷积层,加快了算法的速度。该方法在THUMOS14上的mAP为19.0%(重叠度阈值取0.5).其余重叠度阈值下的表现也与SCNN基本一致。

    展开全文
  • 图像处理的一般流程

    2012-11-14 16:26:29
    ----> 预处理 ---> 数据压缩 ---> 分割 ---> 目标识别 ---> 图像理解
  • VTK序列图像的读取

    2013-05-07 23:19:41
    医学图像处理的应用程序中,经常会碰到读取一个序列图像的操作。比如CT、MR等所成的图像都是一个切面一个切面地存储的,医学图像处理程序要处理这些数据,第一步当然是把这些数据从磁盘等外部存储介质中导入内存。 ...
  • 摘要:序列图像的超分辨率复原是指采用信号处理的方法通过对序列低分辨率退化图像的处理来获得一幅或者多幅SR复原图像,该技术可以弥补硬件实现的局限并且成本低,在视频、遥感等领域有着重要的应用前景。...
  • 用ITK做三维图像处理时候,原始数据一般都是序列图像,那么序列图像的读取就是我们完成三维图像处理重要的起点。 序列图像读取用到了一下几个类:  #include #include代码如下: //声明像素类型和图像维数 ...
  • 【转】时间序列分类算法简介及其在能耗数据分类上的应用 原文链接:时间序列分类算法简介及其在能耗数据分类上的应用–李元龙   本文首先简要介绍最近几年来时间序列分类算法的最新研究成果,包括dynamic time ...
  • 傅立叶变换在图像处理中有非常重要的作用。因为不仅傅立叶分析涉及图像处理很多方面,傅立 叶改进算法,比如离散余弦变换,gabor与小波在图像处理中也有重要的分量。傅立叶变换在图像处理的重要作用:  1.图像增强...
  • Logistic混沌序列加密。
  • Deep Learning and Time Series This document shows a list of bibliographical references on DeepLearning and Time Series, organized by type and year. I add some additional notes on each reference. ...
  • 图像处理基本概念

    2018-07-07 19:55:07
    本文总结一下数字图像处理基本概念,主要来源:《数字图像处理》第三版第二章 数字图像处理:利用计算机系统对数字图像进行各种目的的处理数字图像:二维数字组形式表示的图像像素:由一个数字序列表示的图像中的一...
  • 本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用——傅里叶变换和霍夫变换。其中,傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理...
  • 图像处理的发展概述

    2013-12-18 15:05:42
    数字图像处理发展概况 数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理最早出现于20世纪50年代,当时的电子计算机...
  • 对视频序列转换为图像帧的好像可以逐渐的对图片序列进行必要的事前处理,比如进行标注、先验信息的提取等。这里借用Opencv平台库简单的视频将一个输入视频序列转换为图片序列的程序。 int _tmain(int argc, char* ...
  • 三维图像处理与分析 三维场景距离信息的获取 运动图像序列分析
  • 第六章 彩色图像处理 第六章 彩色图像处理 一颜色模型 1 RGB彩色模型 2 CMY和CMYK彩色模型 3 HSI彩色模型 4 色彩转换 二彩色图像处理基础 1 伪彩色图像处理 11 灰度分层 12 灰度到彩色变换 2 全彩色图像处理 ...
1 2 3 4 5 ... 20
收藏数 89,541
精华内容 35,816
热门标签
关键字:

序列图像处理