精华内容
下载资源
问答
  • 图像压缩感知

    2013-12-18 17:38:10
    图像压缩感知的文献。作者MSAR的高级研究员FengWu
  • 图像压缩感知的感知稀疏表示
  • 医学图像压缩感知matlab
  • matlab图像压缩感知

    热门讨论 2011-04-21 16:11:55
    图像压缩感知资料及代码,里面包含BP ,MP ,OMP,BCS等经典算法。
  • 重叠块投影与重构的图像压缩感知
  • 图像压缩感知 omp

    2012-05-31 10:34:38
    图像压缩感知算法的omp实现matlab版
  • 图像处理-贝叶斯小波图像压缩感知方法.pdf 图像处理程序
  • 利用图像的非局部相似性先验以提升图像恢复质量已...为了更有效地提升压缩感知(CS)图像的重构质量,提出了一种基于加权结构组稀疏表示(WSGSR)的图像压缩感知重构方法。采用非局部相似图像块结构组加权稀疏表示的
  • 使用WDFB的基于块的中子辐射图像压缩感知
  • 该方案利用小波变换实现图像稀疏化,利用标准伪随机数均匀分布和二维中心傅里叶变换生成随机测量矩阵,并对小波变换后的高频子带进行加权采样,用改进的基追踪算法实现二维图像压缩感知重建。仿真实验结果表明,该...
  • 联合低秩与稀疏先验的高光谱图像压缩感知重建
  • 结合基于图像块的显著性信息随机采样和基于投影Landweber的压缩感知重构算法,提出了一种新的图像压缩感知编码与重构方法。该方法在编码端通过图像显著性信息来分配不同的测量维数以实现测量维数的自适应,在重构端...
  • 为了提高模型估计的准确性,将各级小波系数的BG模型参数分开估计,进而提出了一种改进的图像压缩感知稀疏重建的新方法,即期望最大分段贝努力高斯近似信息传递算法(EM-SSBG-AMP)。仿真结果表明,相同采样率下,新算法的...
  • 为了提高彩色图像重构质量,利用具有近似平移不变性特性的双树复数小波作为自然图像的稀疏表示,提出了基于双树复数小波局部高斯模型的彩色图像压缩感知重构算法,该算法在重构时充分利用了彩色图像通道间的互相关性...
  • 图稀疏正则化多测量矢量模型的高光谱图像压缩感知重建
  • 基于分块和混合采样的图像压缩感知,刘学,全子一,压缩感知是一种集采样和压缩于一体的新的理论框架。但是对于大规模信号如2D图像,由于需要高维的随机采样矩阵和高效的重构算法,�
  • 图像压缩感知This article is part of a series on building a sample application — a multi-image gallery blog — for performance benchmarking and optimizations. (View the repo here.) 本文是构建用于性能...

    图像压缩感知

    This article is part of a series on building a sample application — a multi-image gallery blog — for performance benchmarking and optimizations. (View the repo here.)

    本文是构建用于性能基准测试和优化的示例应用程序(一个多图像画廊博客)系列文章的一部分。 (在此处查看回购 。)



    We’ve been building a sample application — a multi-image gallery blog — for performance benchmarking and optimizations. At this point, our application serves the same image regardless of the resolution and screen size it’s being served in. In this image resizing tutorial, we’ll modify it to serve a resized version depending on display size.

    我们一直在构建一个示例应用程序-一个多图像画廊博客-用于性能基准测试和优化。 此时,我们的应用程序将提供相同的图像,而不管其提供的分辨率和屏幕尺寸如何。在此图像大小调整教程中,我们将对其进行修改以根据显示尺寸来提供调整大小的版本。

    目的 (Objective)

    There are two stages to this improvement.

    此改进有两个阶段。

    1. We need to make all images responsive wherever this might be useful. One place is the thumbnails on the home page and in the gallery pages, and another is the full-size image when an individual image is clicked in the gallery.

      我们需要在可能有用的地方使所有图像响应。 一个地方是主页和图库页面上的缩略图,另一个地方是单击图库中的单个图像时的全尺寸图像。
    2. We need to add resizing-logic to our app. The point is to generate a resized image on the fly as it’s demanded. This will keep non-popular images from polluting our hard drive, and it’ll make sure the popular ones are, on subsequent requests, served in optimal sizes.

      我们需要将resizing-logic添加到我们的应用程序中。 关键是根据需要动态生成调整大小的图像。 这样可以防止非热门图片污染我们的硬盘,并确保在随后的请求中以最佳尺寸投放热门图片。

    响应式图像? (Responsive Images?)

    As this post explains, images in the modern web are incredibly complex. Instead of just <img src="mypic.jpg"> from the olden days, we now have something crazy like this:

    正如这篇文章所解释的那样,现代网络中的图像非常复杂。 现在,我们<img src="mypic.jpg">只是<img src="mypic.jpg"> ,而是一些疯狂的东西:

    <picture>
    <source media="(max-width: 700px)" sizes="(max-width: 500px) 50vw, 10vw"
    srcset="stick-figure-narrow.png 138w, stick-figure-hd-narrow.png 138w">
    
    <source media="(max-width: 1400px)" sizes="(max-width: 1000px) 100vw, 50vw"
    srcset="stick-figure.png 416w, stick-figure-hd.png 416w">
    
    <img src="stick-original.png" alt="Human">
    </picture>

    A combination of srcset, picture and sizes is necessary in a scenario where you’re doubtful that if you use the same image for a smaller screen size, the primary subject of the image may become too small in size. You want to display a different image (more focused on the primary subject) in a different screen size, but still want to display separate assets of the same image based on device-pixel ratio, and want to customize height and width of the image based on viewport.

    如果您怀疑是否将相同的图像用于较小的屏幕尺寸,则图像的主要对象可能会变得过小,因此需要将srcsetpicturesizes组合在一起。 您想要以不同的屏幕尺寸显示不同的图像(更侧重于主要主题),但仍要基于设备像素比率显示同一图像的单独资产,并希望根据图像的高度和宽度自定义在视口上。

    Since our images are photos and we always want them to be in their default DOM-specified position filling up the maximum of their parent container, we have no need for picture (which lets us define an alternative source for a different resolution or browser support — like trying to render SVG, then PNG if SVG is unsupported) or sizes (which lets us define which viewport portion an image should occupy). We can get away with just using srcset, which loads a different size version of the same image depending on the screen size.

    由于我们的图片是照片,并且我们始终希望它们位于默认的DOM指定位置,从而填满其父容器的最大值,因此我们不需要picture (这使我们可以为其他分辨率或浏览器支持定义替代来源-例如尝试渲染SVG,如果不支持SVG,则渲染PNG)或sizes (这可以让我们定义图像应占据的视口部分)。 我们只需要使用srcset就可以了,它根据屏幕大小加载同一图像的不同大小版本。

    添加srcset (Adding srcset)

    The first location where we encounter images is in home-galleries-lazy-load.html.twig, the partial template that renders the home screen’s galleries list.

    我们遇到图像的第一个位置在home-galleries-lazy-load.html.twig ,这是呈现主屏幕画廊列表的部分模板。

    <a class="gallery__link" href="{{ url('gallery.single-gallery', {id: gallery.id}) }}">
      <img src="{{ gallery.images.first|getImageUrl }}" alt="{{ gallery.name }}"
        class="gallery__leading-image card-img-top">
    </a>

    We can see here that the image’s link is fetched from a Twig filter, which can be found in the src/Twig/ImageRendererExtension.php file. It takes the image’s ID and the route’s name (defined in the annotation in ImageController‘s serveImageAction route) and generates a URL based on that formula: /image/{id}/raw -> replacing {id} with the ID given:

    我们在这里可以看到图像的链接是从Twig过滤器获取的,该过滤器可以在src/Twig/ImageRendererExtension.php文件中找到。 它获取图像的ID和路由的名称(在ImageControllerserveImageAction路由的注释中定义),并基于以下公式生成URL: /image/{id}/raw serveImageAction >用给定的ID替换{id}

    public function getImageUrl(Image $image)
    {
      return $this->router->generate('image.serve', [
          'id' => $image->getId(),
      ], RouterInterface::ABSOLUTE_URL);
    }

    Let’s change that to the following:

    让我们将其更改为以下内容:

    public function getImageUrl(Image $image, $size = null)
    {
      return $this->router->generate('image.serve', [
          'id' => $image->getId() . (($size) ? '--' . $size : ''),
      ], RouterInterface::ABSOLUTE_URL);
    }

    Now, all our image URLs will have --x as a suffix, where x is their size. This is the change we’ll apply to our img tag as well, in the form of srcset. Let’s change it to:

    现在,我们所有的图像URL都将带有--x后缀,其中x是其大小。 这也是我们将以srcset形式应用于img标签的srcset 。 让我们将其更改为:

    <a class="gallery__link" href="{{ url('gallery.single-gallery', {id: gallery.id}) }}">
      <img src="{{ gallery.images.first|getImageUrl }}"
           alt="{{ gallery.name }}"
           srcset="
               {{ gallery.images.first|getImageUrl('1120') }}  1120w,
               {{ gallery.images.first|getImageUrl('720') }} 720w,
               {{ gallery.images.first|getImageUrl('400') }}  400w"
           class="gallery__leading-image card-img-top">
    </a>

    If we refresh the home page now, we’ll notice the srcset’s new sizes listed:

    如果现在刷新主页,则会注意到srcset的新大小列出:

    Srcset

    This isn’t going to help us much, though. If our viewport is wide, this will request full-size images, despite them being thumbnails. So instead of srcset, it’s better to use a fixed small thumbnail size here:

    不过,这对我们没有太大帮助。 如果我们的视口很宽,则尽管它们是缩略图,但仍将请求全尺寸图像。 因此,最好使用固定的小缩略图代替srcset

    <a class="gallery__link" href="{{ url('gallery.single-gallery', {id: gallery.id}) }}">
      <img src="{{ gallery.images.first|getImageUrl('250') }}"
           alt="{{ gallery.name }}"
           class="gallery__leading-image card-img-top">
    </a>

    We now have thumbnails-on-demand, but which get cached and fetched when they’re already generated.

    现在,我们提供了按需缩略图,但是当它们已经生成时便会被缓存并提取。

    Let’s hunt down other srcset locations now.

    现在让我们寻找其他srcset位置。

    In templates/gallery/single-gallery.html.twig, we apply the same fix as before. We’re dealing with thumbnails, so let’s just shrink the file by adding the size parameter into our getImageUrl filter:

    templates/gallery/single-gallery.html.twig ,我们应用了与以前相同的修复程序。 我们正在处理缩略图,因此让我们通过在我们的getImageUrl过滤器中添加size参数来缩小文件:

    <img src="{{ image|getImageUrl(250) }}" alt="{{ image.originalFilename }}"
        class="single-gallery__item-image card-img-top">

    And now for the srcset implementation, finally!

    现在终于srcset实现srcset

    The individual image views are rendered with a JavaScript modal window at the bottom of the same single-gallery view:

    单个图像视图在同一单画廊视图底部JavaScript模式窗口中呈现:

    {% block javascripts %}
        {{ parent() }}
    
        <script>
            $(function () {
                $('.single-gallery__item-image').on('click', function () {
                    var src = $(this).attr('src');
                    var $modal = $('.single-gallery__modal');
                    var $modalBody = $modal.find('.modal-body');
    
                    $modalBody.html('');
                    $modalBody.append($('<img src="' + src + '" class="single-gallery__modal-image">'));
                    $modal.modal({});
                });
            })
        </script>
    {% endblock %}

    There’s an append call which adds the img element into the modal’s body, so that’s where our srcset attribute must go. But since our image URLs are dynamically generated, we can’t really call the Twig filter from within the script. One alternative is to add the srcset into the thumbnails and then use it in the JS by copying it from the thumb elements, but this would not only make the full-sized images load in the background of the thumbnails (because our viewport is wide), but it would also call the filter 4 times for each thumbnail, slowing things down. Instead, let’s create a new Twig filter in src/Twig/ImageRendererExtension.php which will generate the full srcset attribute for each image.

    有一个append调用将img元素添加到模态的主体中,因此这是我们的srcset属性必须去的地方。 但是由于我们的图片网址是动态生成的,因此我们无法真正从script调用Twig过滤器。 一种替代方法是将srcset添加到缩略图中,然后通过从thumb元素复制它来在JS中使用它,但这不仅会使完整尺寸的图像加载到缩略图的背景中(因为我们的视口很宽) ,但每个缩略图也会调用过滤器4次,从而降低了速度。 相反,让我们在src/Twig/ImageRendererExtension.php创建一个新的Twig过滤器,该过滤器将为每个图像生成完整的srcset属性。

    public function getImageSrcset(Image $image)
    {
        $id = $image->getId();
        $sizes = [1120, 720, 400];
        $string = '';
        foreach ($sizes as $size) {
            $string .= $this->router->generate('image.serve', [
                'id' => $image->getId() . '--' . $size,
            ], RouterInterface::ABSOLUTE_URL).' '.$size.'w, ';
        }
        $string = trim($string, ', ');
        return html_entity_decode($string);
    }

    We mustn’t forget to register this filter:

    我们一定不要忘记注册此过滤器:

    public function getFilters()
    {
        return [
            new Twig_SimpleFilter('getImageUrl', [$this, 'getImageUrl']),
            new Twig_SimpleFilter('getImageSrcset', [$this, 'getImageSrcset']),
        ];
    }

    We have to add these values into a custom attribute, which we’ll call data-srcset on each individual thumbnail:

    我们必须将这些值添加到自定义属性中,在每个缩略图data-srcset其称为data-srcset

    <img src="{{ image|getImageUrl(250) }}"
          alt="{{ image.originalFilename }}"
          data-srcset=" {{ image|getImageSrcset }}"
          class="single-gallery__item-image card-img-top">

    Now each individual thumbnail has a data-srcset attribute with the required srcset values, but this doesn’t trigger because it’s in a custom attribute, data to be used later.

    现在,每个单独的缩略图都有一个data-srcset属性,该属性具有所需的srcset值,但这不会触发,因为它位于自定义属性中,供以后使用。

    data-srcset generated

    The final step is updating the JS to take advantage of this:

    最后一步是更新JS以利用此优势:

    {% block javascripts %}
        {{ parent() }}
    
        <script>
            $(function () {
                $('.single-gallery__item-image').on('click', function () {
                    var src = $(this).attr('src');
                    var srcset = $(this).attr('data-srcset');
                    var $modal = $('.single-gallery__modal');
                    var $modalBody = $modal.find('.modal-body');
    
                    $modalBody.html('');
                    $modalBody.append($('<img src="' + src + '" srcset="' + srcset + '" class="single-gallery__modal-image">'));
                    $modal.modal({});
                });
            })
        </script>
    {% endblock %}

    添加滑翔 (Adding Glide)

    Glide is a library which does what we want — on-demand image resizing. Let’s install it.

    Glide是一个可以满足我们需要的库-按需调整图像大小。 让我们安装它。

    composer require league/glide

    Next, let’s register it in the app. We do this by adding a new service into src/Services with the following content:

    接下来,让我们在应用程序中注册它。 为此,我们将新服务添加到src/Services ,内容如下:

    <?php
    namespace App\Service;
    
    use League\Glide;
    
    class GlideServer
    {
        private $server;
    
        public function __construct(FileManager $fm)
        {
            $this->server = $server = Glide\ServerFactory::create([
                'source' => $fm->getUploadsDirectory(),
                'cache' => $fm->getUploadsDirectory().'/cache',
            ]);
        }
    
        public function getGlide()
        {
            return $this->server;
        }
    }

    The service consumes the already declared FileManager service which is auto-injected because of Symfony’s new auto-wiring approach. We declare both the input and output path as the uploadsdir, give the output dir a cache suffix, and add a method for returning the server. The server is basically the instance of Glide which does the resizing and serves back a resized image.

    该服务使用已经声明的FileManager服务,该服务由于Symfony的新自动装配方法而自动注入。 我们将输入路径和输出路径都声明为上uploads目录,为输出目录提供一个cache后缀,并添加一种用于返回服务器的方法。 服务器基本上是Glide的实例,该实例进行大小调整并提供调整大小的图像。

    We need to make the getUploadsDirectory method in FileManager public, as it’s currently private:

    我们需要在FileManager中将getUploadsDirectory方法getUploadsDirectory公开,因为它目前是private

    public function getUploadsDirectory()
    {
        return $this->path;
    }

    Finally, let’s modify the ImageController’s serveImageAction method so that it looks like this:

    最后,让我们修改ImageController的serveImageAction方法,使其看起来像这样:

    /**
     * @Route("/image/{id}/raw", name="image.serve")
     */
    public function serveImageAction(Request $request, $id, GlideServer $glide)
    {
        $idFragments = explode('--', $id);
        $id          = $idFragments[0];
        $size        = $idFragments[1] ?? null;
    
        $image = $this->em->getRepository(Image::class)->find($id);
    
        if (empty($image)) {
            throw new NotFoundHttpException('Image not found');
        }
    
        $fullPath = $this->fileManager->getFilePath($image->getFilename());
    
        if ($size) {
    
            $info        = pathinfo($fullPath);
            $file        = $info['filename'] . '.' . $info['extension'];
            $newfile     = $info['filename'] . '-' . $size . '.' . $info['extension'];
            $fullPathNew = str_replace($file, $newfile, $fullPath);
    
            if (file_exists($fullPath) && ! file_exists($fullPathNew)) {
    
                $fullPath = $fullPathNew;
                $img      = $glide->getGlide()->getImageAsBase64($file,
                    ['w' => $size]);
    
                $ifp = fopen($fullPath, 'wb');
    
                $data = explode(',', $img);
                fwrite($ifp, base64_decode($data[1]));
                fclose($ifp);
            }
        }
    
        $response = new BinaryFileResponse($fullPath);
        $response->headers->set('Content-type',
            mime_content_type($fullPath));
        $response->headers->set('Content-Disposition',
            'attachment; filename="' . $image->getOriginalFilename() . '";');
    
        return $response;
    }

    This method now explodes the image ID by double-dash, separating size from the image ID. Once Doctrine fetches the image’s filepath from the database, the size is re-attached to the filename if one was passed in, otherwise the original image is used. If this image doesn’t exist, one is generated from the original path and saved for later use.

    现在,此方法通过双破折号爆炸图像ID,从而将大小与图像ID分开。 一旦Doctrine从数据库中获取了图像的文件路径,如果传入了文件名,则大小会重新附加到文件名,否则将使用原始图像。 如果该图像不存在,则会从原始路径生成一个并保存以备后用。

    For demonstration purposes, we’re taking a longer way around here and generating files manually by appending the size to them and saving them into the uploads folder. It should be noted that you can also use the outputImage method from Glide to directly output the image, and it’ll be served straight from the cache subfolder, not saving it with a suffix in the main upload folder. You can also use the makeImage method to just create the image and let the old logic of fetching the image take over. That’s the approach we picked below:

    为了演示起见,我们在这里花了更长的时间,并通过将大小附加到文件并保存到uploads文件夹中来手动生成文件。 请注意,您还可以使用Glide的outputImage方法直接输出图像,它将直接从cache子文件夹提供,而不是将其后缀保存在主upload文件夹中。 您也可以使用makeImage方法创建图像,并让获取图像的旧逻辑接管。 这就是我们下面选择的方法:

    /**
     * @Route("/image/{id}/raw", name="image.serve")
     */
    public function serveImageAction(Request $request, $id, GlideServer $glide)
    {
        $idFragments = explode('--', $id);
        $id          = $idFragments[0];
        $size        = $idFragments[1] ?? null;
    
        $image = $this->em->getRepository(Image::class)->find($id);
    
        if (empty($image)) {
            throw new NotFoundHttpException('Image not found');
        }
    
        $fullPath = $this->fileManager->getFilePath($image->getFilename());
    
        if ($size) {
    
            $info        = pathinfo($fullPath);
            $file        = $info['filename'] . '.' . $info['extension'];
    
            $cachePath = $glide->getGlide()->makeImage($file, ['w' => $size]);
            $fullPath = str_replace($file, '/cache/' . $cachePath, $fullPath);
        }
    
        $response = new BinaryFileResponse($fullPath);
        $response->headers->set('Content-type',
            mime_content_type($fullPath));
        $response->headers->set('Content-Disposition',
            'attachment; filename="' . $image->getOriginalFilename() . '";');
    
        return $response;
    }

    Our on-demand-image-resizing business is operational. Now all we have to do is test things.

    我们的按需缩放图像业务正在运营。 现在我们要做的就是测试。

    测试中 (Testing)

    As soon as we refresh the home page, which will be a little slower now, the images will start being generated in the var/uploads folder. Let’s check it out, without scrolling to the second page.

    刷新主页(现在会慢一点)后,图像就会开始在var/uploads文件夹中生成。 让我们检查一下,而无需滚动到第二页。

    Images generated

    Sure enough, we now have a tiny thumbnail version of every image in the home page, and that’s the image that’s getting served. Notice the small file sizes. Now let’s access a gallery and click on an image to get a big version of it.

    可以肯定的是,我们现在在主页中的每个图像都有一个缩略图版本,这就是要提供的图像。 请注意文件较小。 现在,让我们访问图库,然后单击图像以获取它的大版本。

    A big image generated with srcset

    Yep, our image got generated from the original.

    是的,我们的图像是从原始图像生成的。

    But what about mobile? In modern browsers, it’s easy enough to turn on mobile mode. Let’s try opening a gallery image in mobile view and check the image folder afterwards.

    但是手机呢? 在现代浏览器中,打开移动模式非常容易。 让我们尝试在移动视图中打开图库图像,然后再检查图像文件夹。

    Image generated for mobile

    What if we change orientation and check the folder then?

    如果我们更改方向并检查文件夹怎么办?

    Landscape mobile

    Success, our image’s mobile size has been successfully generated, and the full screen image from before has been reused because that’s how big our “mobile’s” screen is in landscape mode. On-demand srcset was successfully implemented!

    成功,我们的图像的移动尺寸已成功生成,并且以前的全屏图像已被重用,因为这就是我们的“移动”屏幕处于横向模式的大小。 按需srcset已成功实现!

    The app with these upgrades in place has been tagged as this release.

    已完成这些升级的应用程序已标记为此版本

    结论 (Conclusion)

    In this post, we went through the process of optimizing images for delivery in a photo-oriented site. We kept the thumbnails at a fixed size for best results, and with full screen images we focused on implementing srcset — a simple addition to any modern website — in tandem with Glide, an on-demand image resizing package that can do the heavy lifting for us.

    在这篇文章中,我们经历了优化图像以在面向照片的站点中交付的过程。 我们将缩略图保持为固定大小以获得最佳效果,并通过全屏图像专注于实现srcset (对任何现代网站的简单添加)与Glide配合使用,Glide是一种按需调整图像大小的软件包,可以为我们。

    But while we’re resizing images, wouldn’t it be smart to also auto-optimize them for quality and size by removing metadata? And is it really the best option to be resizing them on demand while the user is waiting or is there another, more practical approach? Find out in the next part.

    但是,当我们调整图像大小时,通过删除元数据来自动优化它们的质量和大小是否明智? 是否真的是在用户等待时按需调整大小的最佳选择,还是有另一种更实用的方法? 在下一部分中查找。

    翻译自: https://www.sitepoint.com/improving-performance-perception-on-demand-image-resizing/

    图像压缩感知

    展开全文
  • 为了提高压缩感知中图像的稀疏表示性能, 提出了一种Contourlet域方向子带稀疏表示的图像压缩感知算法。将图像Contourlet分解后的多个高频子带根据方向正交特点进行重组, 采用随机高斯矩阵对重组后的子带分别进行测量...
  • 图像压缩感知重建中,针对重构效果和耗时不能兼得的问题进行深入研究。基于小波域稀疏,选用常规观测矩阵进行观测采样,通过对观测结果预定义滤波、选取信号硬阈值,引入共轭梯度下降算法,对分段正交匹配追踪...
  • 根据干涉多光谱图像的特点,提出一种基于帧间预测和联合优化的干涉多光谱图像压缩感知重建算法。 在干涉多光谱图像重建中,根据干涉多光谱图像的帧间相关特性,通过帧间预测除去当前帧图像测量数据中帧 间相关...
  • 名称 基于MATLAB的图像压缩感知 目录 目录 I 第1章 绪论 3 1.1 研究背景和意义 3 1.2 数据压缩技术 4 1.2.1 传统数据压缩技术 4 1.2.2 压缩感知理论(Compressed/Compressive Sensing/Sampling, CS) 5 1.3 无线...

    欢迎添加微信互相交流学习哦!

    二维码

    项目源码:https://gitee.com/oklongmm/biye


    名称    基于MATLAB的图像压缩感知
         


    目录
    目录    I
    第1章 绪论    3
    1.1 研究背景和意义    3
    1.2  数据压缩技术    4
    1.2.1 传统数据压缩技术    4
    1.2.2 压缩感知理论(Compressed/Compressive Sensing/Sampling, CS)    5
    1.3 无线传感器网络    7
    1.3.1 无线传感器网络概述    7
    1.3.2 无线传感器网络数据压缩的必要性    9
    1.4 本文主要工作和内容安排    10
    第2章 压缩感知理论    11
    2.1压缩感知的前提条件—稀疏性和不相干性    11
    2.2 三个关键技术    14
    2.3信号的稀疏表示    15
    2.4 观测矩阵设计    17
    2.5 稀疏信号的重构    19
    2.6 重构算法    20
    2.7 压缩感知优势及不足    21
    2.8 压缩感知在传感网中的观测方式    22
    第3章 压缩感知理论应用概述    24
    3.1 压缩成像    24
    3.2 模拟信息转换    24
    3.3 生物传感    25
    3.4 本章小结    25
    第4章 CS在无线传感网中的应用    26
    4.1 研究背景    26
    4.1.1 基于感知数据相关性的压缩    26
    4.1.2传统压缩重构方法    27
    4.1.3 图像压缩重构质量的评价    27
    4.2 压缩感知理论算法对一维信号的实现    29
    4.2.1 CS用于WSN的优势    29
    4.2.2 观测重构模型    30
    4.2.2 正交匹配追踪算法(OMP)    30
    4.2.3 算法的实现及结果分析    31
    4.3 压缩感知理论算法对二维图像重构的实现    35
    4.3.1 基于小波变换的分块压缩感知理论    35
    4.3.2 实现步骤    36
    4.3.3 重构结果及分析    39
    4.4 本章小结    42
    第5章 总结与展望    43
    5.1 工作总结    43
    5.2 后续展望    43
    参考文献    44
    致谢    46
    附录    47


    摘要
    数据压缩技术是提高无线数据传输速度的有效措施之一。传统的数据压缩技术是基于奈奎斯特采样定律进行采样,并根据数据本身的特性降低其冗余度,从而达到压缩的目的。近年来出现的压缩感知理论(Compressed Sensing,CS)则不受制于奈奎斯特采样定律,它是采用非自适应线性投影来保持信号的原始结构,以直接采集压缩后的数据的方式,从尽量少的数据中提取尽量多的信息。
    本文阐述了压缩感知方法的基本原理,分析了CS理论框架及关键技术问题,介绍了压缩感知技术应用于无线传感的优势,并着重介绍了信号稀疏变换、观测矩阵设计和重构算法三个方面的最新进展,对研究中现存的难点问题进行了探讨。并运用matlab软件,在离散傅里叶变换(DFT)和离散余弦变换(DCT)分块CS的基础上,采用正交匹配追踪算法(OMP)实现了对一维信号和二维图像的高概率重构。将重构结果与原始信号对比,结果表明,只要采样数M(远小于奈奎斯特定理所需要的采样率)能够包含图像所需要的有用信息时,CS算法就能精确的完成对图像的重构,并且重构效果也比较好。

    关键词:压缩感知 无线传感 正交匹配 稀疏表示 观测矩阵


    Abstract 
    The data compression technology is one of the efficient measures for increasing the speed of wireless data communication. Traditional data compression technology is based on Nyquist sampling theorem, reaching the goal of compression by decreasing redundancy of information. In recent years, Compressed Sensing(CS) comes out as a new sampling theory, it does not have to obey Nyquist sampling theorem, and it can keep the original structure of signals by attaining the non-adaptive linear projections. So, CS can gather the compressed data directly and get more information from less data. 
    This paper reviews the theoretical framework and the key technical problems of compressed sensing and introduces the latest developments of signal sparse representation, design of measurement matrix and reconstruction algorithm. Then this paper also discusses the existing difficult problems. Based on the discrete fourier transform (DFT) and discrete cosine transform (DCT), we use MATLAB software, realizes the accurate reconstruction of one-dimension signal two-dimension image by applying the OMP algorithm. Then make a comparison to the reconstruction of signal to original signals and make a conclusion. If only the sampling measurements M (far less than Nyquist sampling measurements ) contain the useful information of signals, CS algorithm can complete the accurate reconstruction, and the effect of reconstruction signal is good too.

    Key words:  compressed sensing   wireless sensor networks   orthogonal matching pursuit   sparse presentation   measurement matri
     
    第1章 绪论
    在当今的信息社会,电脑、手机、传感器、驱动器等都要连接到因特网,这样的无线通信系统中,将会产生并且传播大量数据信息,从而对信号的采样、存储、传输和恢复造成巨大压力,增加了通信设备的成本。对人们来说,如何有效的处理这些数据,成为一个新的挑战。近几年来,在信号处理领域出现的压缩感知理论(CS)打破了传统采样过程中信号采样速率必须达到信号带宽两倍以上才能精确重构原始信号的奈奎斯特采样定理,使得信息存储、处理和传输的成本大大降低。
    1.1 研究背景和意义
    随着人们对信息需求量的增加,网络通信、多媒体技术、存储技术的发展越来越快,网络的规模也越来越大,寻找高效的信息技术来降低数据量成为无线传输系统中急需处理的问题之一。这是因为数字化的各类信息的数据量十分庞大,若不对其进行有效的压缩就难以得到实际的应用,因此,数据压缩技术成为人们研究的一项重要技术。无线传感器网络是近来研究的热点方向之一。它是由分布在监测区域内的大量微型传感器节点通过无线电通信而形成的一个自组织网络系统。这个系统的目的是协作的感知、采集和处理网络覆盖区域里被监测对象的信息,并将结果发送给用户。在一个传感器网络中,常常包含大量传感器节点,每个传感器都会采集大量的数据。这些数据将会被传输到一个控制中心,也会在各个节点之间传输,在这种分布式传感网络中,数据传输功耗和带宽需求非常大,所以,如何对这样的分布式信号进行压缩,从而减小通信开销已经成为非常紧迫的需求。
    压缩感知理论与传统奈奎斯特采样定理不同,它指出,只要信号是可压缩的或在某个变换域是稀疏的,那么就可以用一个与变换基不相关的观测矩阵将变换所得高维信号投影到一个低维空间上,然后通过求解一个优化问题就可以从这些少量的投影中以高概率重构出原信号,可以证明这样的投影包含了重构信号的足够信息。 在该理论框架下,采样速率不决定于信号的带宽,而决定于信息在信号中的结构和内容。 事实上,压缩感知理论的某些抽象结论源于Kashin创立的范函分析和逼近论, 最近由Candès,Romberg ,Tao和Donoho等人构造了具体的算法并且通过研究表明了这一理论的巨大应用前景。从信号分析角度来讲,傅立叶变换是信号和数字图像处理的理论基础,小波分析将信号和数字图像处理带入到一个崭新的领域。 多尺度几何分析是继小波分析后的新一代信号分析工具,它具有多分辨、局部化和多方向性等优良特性,更适合于处理图像等高维信号。 这些研究工作都为压缩感知理论奠定了基础。显然,在压缩感知理论中,图像/信号的采样和压缩同时以低速率进行,使传感器的采样和计算成本大大降低,而信号的恢复过程是一个优化计算的过程。 因此,该理论指出了将模拟信号直接采样压缩为数字形式的有效途径,具有直接信息采样特性。 由于从理论上讲任何信号都具有可压缩性,只能找到其相应的稀疏表示空间,就可以有效地进行压缩采样,这一理论必将给信号采样方法带来一次新的革命。
    1.2  数据压缩技术
    数据压缩技术就是对原始数据进行数据编码或者压缩编码,从而用最少的数码来表示信源发出的信号。数据压缩的对象很广泛,可以是通信时间、传输带宽、存储空间甚至发射能量。数据压缩的作用是能够快速地传输各种信号;在已有的一些通信干线并行开通更多的多媒体业务;紧缩数据存储容量;降低发信机功率等等。
    1.2.1 传统数据压缩技术
    前较成熟的数据压缩技术有许多种,按照压缩后对信息的失真程度,主要分为无损压缩和有损压缩。 
    无损压缩是利用数据中的统计冗余进行压缩。数据中间存在的一些多余成分,称之为冗余度。例如,在某一份计算机文件中,一些符号会反复出现、一些符号比其它的符号出现得更频繁、一些符号总是出现在各数据块中的可预见的位置上,以上讲述的这些冗余部分便可在数据编码中除去或者减少。这种无损压缩机制可以完全恢复原始数据而不引起任何失真,但是压缩率却受到数据统计冗余度的理论限制,一般为2:1到5:1。这类方法可以广泛用于文本数据、程序以及特殊应用场景的图像数据(如医学图像)的压缩。它的主要压缩机制包括Huffman编码、算术编码、游程编码和字典编码等系列。 
    有损压缩是利用了人类对图像或者声音中的某些频率成分不敏感的特殊性质,允许压缩过程中损失一定的信息;尽管不能完全恢复出原始数据,但是所缺失的数据部分对于我们理解原始图像的影响很小,却使得压缩比大了许多。有损压缩广泛应用于语音,图像和视频数据的压缩。它一般有两种基本的压缩机制,一种是有损变换编解码(如傅立叶变换、离散余弦变换、小波变换),即首先对图像或者声音进行采样、切成小块、变换到一个新的空间、量化,接着对量化值进行熵编码;另外一种是预测编解码(如脉冲编码调制、差分脉冲编码调制、自适应差分脉冲编码调制等),即利用先前的数据和随后解码的数据来预测当前的声音采样或者图像帧,并对预测数据与实际数据之间的误差以及其它一些重现预测的信息进行量化与编码。 
    综合无损压缩和有损压缩的优点,还出现了第三类压缩技术:混合压缩。它主要是求取在压缩效率、压缩比以及保真度之间的最佳平衡,如静止图像压缩标准JPEG和活动图像压缩标准MPEG就是采用混合编码的压缩方法。
    1.2.2 压缩感知理论(Compressed/Compressive Sensing/Sampling, CS)
    在传统理论的指导下,信号主要的一些压缩方法都要基于奈奎斯特采样定律进行采样,即信息采样速率至少为信号带宽的两倍。信号的编解码过程如图1.1所示:编码端首先获得X 的N点采样值,经变换后只保留其中K个最大的投影系数并对它们的幅度和位置编码,最后将编得的码值进行存储或传输。解压缩仅是编码过程的逆变换。实际上,采样得到的大部分数据都是不重要的,即K值很小,但由于奈奎斯特采样定理的限制,采样点数N可能会非常大,采样后的压缩是造成资源浪费的根本所在。
     

    CS 理论的信号编解码框架和传统的框架大不一样,如图1.2 所示。CS 理论对信号的采样、压缩编码发生在同一个步骤,利用信号的稀疏性,以远低于Nyquist采样率的速率对信号进行非自适应的测量编码。测量值并非信号本身,而是从高维到低维的投影值,从数学角度看,每个测量值是传统理论下的每个样本信号的组合函数,即一个测量值已经包含了所有样本信号的少量信息。解码过程不是编码的简单逆过程,而是在盲源分离中的求逆思想下,利用信号稀疏分解中已有的重构方法在概率意义上实现信号的精确重构或者一定误差下的近似重构,解码所需测量值的数目远小于传统理论下的样本数。
    压缩感知的核心思想是压缩和采样合并进行,并且测量值远小于传统采样方法的数据量,突破了香农采样定理的瓶颈,使高分辨率的信号采集成为可能。
     压缩感知理论主要包括信号的稀疏表示、随机测量和重构算法等三个方面。稀疏表示是应用压缩感知的先验条件,随机测量是压缩感知的关键过程,重构算法是获取最终结果的必要手段。
     

    压缩感知关键要素包括稀疏表示、测量矩阵和重构算法。
    信号在某种表示方式下的稀疏性,是压缩感知应用的理论基础,经典的稀疏化的方法有离散余弦变换(DCT)、傅里叶变换(FFT)、离散小波变换(DWT)等。
    最近几年,对稀疏表示研究的另一个热点是信号在冗余字典下的稀疏分解。 这是一种全新的信号表示理论:用超完备的冗余函数库取代基函数,称之为冗余字典,字典中的元素被称为原子。目前信号在冗余字典下的稀疏表示的研究集中在两个方面:一是如何构造一个适合某一类信号的冗余字典,二是如何设计快速有效的稀疏分解算法。目前常用的稀疏分解算法大致可分为匹配追踪(Matching Pursuit)和基追踪(Basis Pursuit)两大类。
    压缩感知理论中,通过变换得到信号的稀疏系数后,需要设计压缩采样系统的观测部分,它围绕观测矩阵 展开。观测器的设计目的是如何采样得到M个观测值,并保证从中能重构出长度为N的信号X或者稀疏基基 下等价的稀疏系数向量。
    CandeS和Tao等证明:独立同分布的高斯随机测量矩阵可以成为普适的压缩感知测量矩阵。2007年Candes等研究者建立了著名的约束等距性(RIP)理论,即要想使信号完全重构,必须保证观测矩阵不会把两个不同的 K项稀疏信号映射到同一个采样集合中,这就要求从观测矩阵中抽取的每M个列向量构成的矩阵是非奇异的。
    Donoho给出压缩感知概念的同时定性和定量的给出测量矩阵要满足三个特征:(1)由测量矩阵的列向量组成的子矩阵的最小奇异值必须大于一定的常数;(2)测量矩阵的列向量体现某种类似噪声的独立随机性;(3)满足稀疏度的解是满足1范数最小的向量。
    目前常用的测量矩阵包括:
    (1)随机高斯矩阵。矩阵每个元素独立地服从均值为0,方差为 的高斯分布。
    (2)随机贝努利矩阵。矩阵的每个元素独立地服从对称的贝努利分布,等概率为 或- 。          
    (3)部分正交矩阵。先生成N×N的正交矩阵U(如傅里叶矩阵),然后在矩阵U中随机地选取M行向量,对M×N矩阵的列向量进行单位化得到测量矩阵。
    (4)部分哈达玛矩阵。生成大小为N×N的哈达玛矩阵,然后在生成矩阵中随机地选取M行向量,构成一个M×N的矩阵。
    (5)托普利兹和循环矩阵。首先生成一个向量u,由向量u生成相应的轮换矩阵或托普利兹矩阵U,然后在矩阵U中随机地选取其中的M行而构造的矩阵Φ。
    (6)稀疏随机矩阵。首先生成一个零元素的矩阵Φ,在矩阵Φ的每一个列向量中,随机地选取d个位置,然后在所选取的位置的值赋为1。
        压缩感知的重构算法主要分为两大类,一是贪婪算法,它是通过选择合适的原子并经过一系列的逐步递增的方法实现信号矢量的逼近,此类算法主要包括匹配跟踪算法、正交匹配追踪算法、补空间匹配追踪算法等。二是凸优化算法,它是把0范数放宽到1范数通过线性规划求解的,此类算法主要包括梯度投影法、基追踪法、最小角度回归法等。凸优化算法算法比贪婪算法所求的解更加精确,但是需要更高的计算复杂度。
        此外,迭代阈值法也得到了广泛的应用,此类算法也较易实现,计算量适中,在贪婪算法和凸优化算法中都有应用。但是,迭代阈值法对于迭代初值和阈值的选取均较敏感,且不能保证求出的解是稀疏的。
    就目前主流的两种重建算法而言,基于1范数最小的重建算法计算量巨大,对于大规模信号无法应用;贪婪算法虽然重建速度快,但是在信号重建质量上还有待提高。
    目前,上述理论已经应用到各个领域,如传感网、频谱感知、雷达、医学信号处理、信道预测等方面,取得了很好的效果。以上是关于压缩感知理论与分布式压缩感知理论的简单介绍,详细阐述将在第二章和第三章进行展开。 
    1.3 无线传感器网络    
     无线传感器网络是计算、通信和传感器这三项技术相结合的产物,一开始在军事应用中收集数据,对战场情况和威胁及其重要程度进行适时的完整评价,后发展到民事运用,如监控大型设备,灾区临时通信,卫生保健等等。 
    1.3.1 无线传感器网络概述 
    无线传感器网络一般由若干传感器节点组成,节点是组成无线传感器网络的基本单位,它负责完成采集信息、融合并传输数据的功能。每一个传感器节点由数据采集模块(传感器、A/D转换器)、数据处理和控制模块(微处理器、存储器)、通信模块(无线收发器)和供电模块(电池、DC/DC能量转换器等)组成,如图1-3所示。
     

    其中,数据采集模块负责感知所需要的信息,数据处理和控制模块负责对感知所得的信息和接收信息进行处理,通信模块负责与其他节点进行通信,即发送或者接收信息,供电模块则负责提供所需要的能量。 
    根据节点在传感网网络体系中所起作用的不同,节点在网络中可以充当数据采集者、数据处理中转站或簇头节点几种角色: 
    (1)数据采集者,这类节点的数据采集模块专门采集周围的环境数据(如温度、压力),然后通过通信路由协议直接或间接地将采集到的数据传输给远方基站(Base Station,BS)或汇聚节点(Sink); 
    (2)数据处理中转站,这类节点不仅要完成采集的任务,还要接收邻居节点的数据,一起转发给距离基站更近的邻居节点或者直接转发到基站或汇聚节点; 
    (3)簇头节点,这类节点负责收集节点采集的数据,经数据融合后,发送到基站或汇聚节点。
    传感器节点都分散在特定的感知区域,相互合作、实时监测、感知和采集网络周边环境或监测对象的温度、声波等各种信息。这些信息一经采集,就将通过嵌入式系统进行处理,最终通过随机自组织无线通信网络以多跳中继方式将所感知信息传送到用户终端,使人们无论在何时、何地、何种情况下都能获取大量详实可靠的信息,实现人、物和事件之间的无缝连接,从而真正实现“无处不在的计算”理念。 
    与传统的网络不同的是,传统网络以传输数据为目的,而无线传感器网络则是以数据为中心;与传统的Ad Hoc网络相比,无线传感器网络具有以下几点特征: 
    (1)网络节点密度高,传感节点数量多 
    (2)传感器节点由电池供电 
    (3)网络拓扑变化频繁 
    (4)网络具有容错能力 
    1.3.2 无线传感器网络数据压缩的必要性 
    因为在无线传感器网络中,每个传感节点体积很小,而且分布非常密集,若是对所有采集的数据直接进行传输,则所需传输的数据量将是非常惊人的,会导致网络拥塞,也会导致网络寿命缩短;又由于传感器节点由电池供电, 所以节点能量有限,而且无线传感器网络所布置的地方一般为人们不便于到达的地方,因此传感器节点中的的电池很难更换。为了节约能量,延长传感器网络的寿命,需要采用能效高的网络通信协议和数据局部处理策略(如数据融合技术、数据压缩技术)。 
    在这里,我们将说明利用压缩技术来减少传输的数据量的必要性和可行性。相对于数据采集、数据压缩这两项功能,数据传输所需要的能量是最多的,所以,如果要节约传感器节点的电池能量,必定要减少传输的数据量,因此在无线传感器网络中运用数据压缩技术来减少数据量一直是一个值得深入研究的问题。无线传感器网络中的感知数据能够进行压缩是因为它具备数据压缩的前提条件:首先,传感器节点密度很大,节点之间感知的范围相互重叠,这种高密度的节点分布一方面使得感知数据可靠性增强,另一方面也引起了数据冗余,使得相邻节点之间所采集的数据具有高度相关性,称为空间相关性;其次,由于传感节点感知的物理数据大多数随着时间变化很缓慢,所以同一个传感器节点所感知的数据之间也有相关性,称为时间相关性。利用这两种相关性,可以对感知数据采取相应的数据压缩技术。 
    图1-4中监测区域中有大量的无线传感节点,传感节点可以感知各种物理环境,包括声音、温度、压力、地震等。人们将传感器节点采集的大量数据采用某种压缩技术压缩,压缩后的少量数据传送到sink节点(或者是融合中心),再由sink节点按照对应的恢复算法恢复出采集的数据。这样,通过传输少量数据就可以得到整个监测区域内的详细情况。 
     

    1.4 本文主要工作和内容安排 
    本文在介绍压缩感知理论/分布式压缩感知理论的基础上,将它们应用到无线传感数据压缩领域,用于压缩传感节点采集的信号,降低传输能耗,节约电池能量。 
    本文内容安排如下: 
    第一章 简单介绍了课题的研究背景,包括现有的数据压缩技术和有关无线传感网络的基本知识。 
    第二章 详细阐述了压缩感知理论,深入介绍了压缩感知理论的核心思想— 可压缩信号(信号稀疏化)、测量矩阵和重构算法,总结了压缩感知理论的优势及不足。 
    第三章 进一步介绍由压缩感知理论发展而来的分布式压缩感知理论,分别描述了三种联合稀疏模型及其应用范围,最后,将其与压缩感知理论作了仿真性能比较。 
    第四章 将传感网中数据传输与压缩感知理论结合,分别利用压缩感知和分布式压缩感知框架下的信号压缩、重构方法对实际的感知数据进行处理,给出了实际的应用效果,并重点研究了量化对于算法的影响。 
    第五章 对全文进行总结并展望下一步的研究工作。 

    第2章 压缩感知理论 
    传统通信系统中的采样遵循的是奈奎斯特抽样定理,该定理指出,为防止在获得信号时损失信息,抽样速率必须大于信号带宽的两倍。在许多应用中,包括数字图像和视频摄像中,奈奎斯特抽样速率太高,不利于数据存储和传输;在其他应用,包括图像系统(医疗浏览和雷达)、高速模数转换中,增加抽样速率代价也很昂贵。压缩感知则是保存原始信号结构的线性投影,然后再从这些投影中将信号重构出来,其速率远远低于奈奎斯特抽样率。CS理论系统与传统通信系统的类似关系如图2-1所示:
     


    由图2-1可知,在CS系统中,信源和信道编码被CS测量(即一个矩阵与信号矢量相乘的形式)代替;信道和信源解码则用CS恢复(即依赖于优化准则的恢复算法)替代。 
    压缩感知理论主要由三部分构成:稀疏信号、观测矩阵和重构算法。下面将从这三个方面详细讲述压缩感知的关键技术。 
    2.1压缩感知的前提条件—稀疏性和不相干性
    CS隐含的两个基本前提:稀疏性和不相关性。前者属于信号的性质,后者和感知(观测)形式有关。
    稀疏性:稀疏性表达了这样一个思想,一个连续时间信号的“信息速率”可能比由带宽所决定的香农采样率要低很多,或者,一个离散时间信号所依赖的自由度数目远远低于它的长度。更准确地说,CS利用了这样一个事实,即许多自然信号在某个合适的基Ψ下具有简洁的表达。
    不相关性:不相关性说明用于采样信号的波在基Ψ下有很稠密的表达。不相关性表达了这样的思想,正如时间域的Dirac或者冲击信号可以在频域展开那样,在基Ψ下具有稀疏表示的信号一定可以在获得它们的某个域中展开。


    1 稀疏性
    众所周知,任意长度为N 的离散信号X 都可以表示为一系列基函数的叠加,
    即可以在任何正交基下用下式表示:
    (式2.1)

    其中 由一组基向量 构成的正交基,例如,sinusoids,尖峰spikes、B-splines,wavelets。 为展开系数。展开系数大,说明信号和基足够相似。如果信号在基 下的展开系数在很小的集合上有值,我们就说该信号在 域是稀疏的,如果有值序列集中在一个小范围内,那么我们就说该信号是可以压缩的。本章我们将集中研究具有稀疏表示的信号,其中X是K个基向量的线性组合,K<<N。也就是说, 中仅有K个非零 ,另外N -K个都是零。
    许多自然信号在一些基下有简洁的表达。图3.3(a)是一幅具有N(N =512×512)个像素点的coins图像向量 ,我们在9/7小波基 下展开该向量,如(式3.4),其中 是 为列向量构成的 的矩阵,是正交基。图3.3(b)是coins图像的9/7小波系数在一维下的表示。图2.3(c)展示了这样一个事实:将图像在9/7小波变换域丢掉93.75%的小系数后得到的逼近图像尽管PSNR只有29.09dB,但肉眼很难察觉到失真。由此可见,尽管原图中几乎所有的像素都是非零值,它在9/7小波域中却是稀疏的:大部分小波系数都很小,少数的大系数(1/16)就可以捕获信号的大部分信息。
    本例中仅仅保留展开(式3.4)中 的 个大系数得到 ,其中 表示系数向量的除K个大系数外其余置0的向量。该向量从严格意义上说是稀疏的,因为K<<N ,即除了极少数项外其余均为0。
    现在稀疏的含义很清楚了:如果x在某个变换域下是稀疏或者可压缩的,就意味着将x的系数 按幅值大小排列衰减很快,那么x可以由K个大系数很好地逼近 。图3.3(c)所示告诉我们,可以丢弃除了少数几个系数外的所有小系数而不会带来视觉上的损失。我们称至多有K个非零项的向量为K -稀疏,且有 。稀疏性原理是大部分现代有损压缩编码算法和许多其它应用的基础。不过在传统编码中,这K个大系数的位置必须事先确定。更一般地,稀疏性是一个基本的建模工具,可以进行信号的精确统计估计和分类、有效的数据压缩等等。而近几年来Candès等人提出的压缩感知理论使得稀疏性有了更加令人惊奇的深远含义,即信号稀疏性对采样本身有重要意义,稀疏性决定了我们可以摆脱奈奎斯特采样频率的约束,并可以做到高效地非自适应地采样信号。


     


    2 不相关性
        Candès, Romberg等人已经证明一个降维的投影集合包含了重构稀疏信号的足够信息。这就是压缩感知(CS)理论的核心内容。在CS中,假定信号在某个变换域的系数是K项稀疏的,我们不直接对K个重要的系数 直接编码,而是将信号的系数向量投影到另一个基函数集合 上,观测得到M (<<N)个投影 然后再编码。用矩阵表示,则有, 。其中Y 是一个 的列向量,观测矩阵 是一个以每个基向量 作为行向量的 矩阵。由于M<<N,从观测向量y中重构信号x是一个欠定问题,然而信号稀疏的附加假设使得恢复成为可能也是可行的。
    CS理论告诉我们,当满足一定条件时,也即是基 不能稀疏表示 (该条件被称为两组基不相关)并且观测值个数M足够大,那么就可以从一个相似规模的集合 中恢复大系数集合 ,继而也就可以得到信号X。许多对基都满足不相关性质,例如,三角尖峰和傅里叶基中的正弦波不相关,傅里叶基和小波基不相关。重要的是,任意一个固定的基和一个随机产生的基也以高概率满足这种不相关。因此在CS理论中随机矩阵被广泛应用于CS观测中。在框架下或者基下可以找到稀疏表示的信号都可以以同样的方式从不相关观察中恢复。
    文献[3]给出了相关性度量的具体定义,如下。
    定义3.2:观测系统 和表示系统 之间的相关性度量用 表示,则有如下式子成立:
        (式2.2)

    简单来讲,相关性度量的是两个矩阵 和 的元素之间的最大相关性。如果 和 包含了相关的元素,则相关性很大;否则,就很小。相关系数取值范围为 。压缩采样研究的是具有低相关性的两个系统。下面给出一些例子。
    (1) 是尖峰基 , 为傅立叶基 ,则有 。进一步讲,尖峰信号和正弦信号不仅在一维而且在任何维,例如2D,3D空间都具有最大的不相关性。
    (2) 为小波基, 是noiselet。这里,noiselet和Haar小波基间的相关系数是 ,noiselet和Daubechies db4及db8小波基间的相关性分别是2.2和2.9。这也可以扩展到高维情况。noiselets也和尖峰信号及傅立叶基高度不相关。人们对noiselets感兴趣基于以下两个事实:1)它们和为图像数据和其它类型的数据提供稀疏表示的系统不相关;2)它们具有快速算法。noiselet变换的时间复杂度为O(N),而且类似于傅立叶变换,noiselet矩阵不需要存储。这一点对于高效的数字计算是至关重要的。如果没有高效的计算,CS的实用性就会大打折扣。
    (3) 为随机矩阵,则 可以是任何固定的基。此时它们之间具有极大不相关。例如, 可以通过在单位球面上独立均匀地采样并做规范正交化得到,此时, 和 间的相关性以很高的概率为 。各项服从独立同分布的随机波形 ,例如高斯分布或者 ,也表现出和任何固定基 具有很小的相关性。
    研究者们通过大量的实验分析,得出如下结论:精确重构所需要的观测值个
    数依赖于稀疏变换基和观测基之间的不相关性。不相关性越强,所需的个数越少;反之,相关性越强,例如 ,则需要采样所有的系数才能保证精确重构。
    2.2 三个关键技术
    从以上压缩感知理论的介绍中我们可以看出,压缩感知理论主要包括以下三个方面的内容:
    (1)信号稀疏表示;
    (2)信号的编码测量即观测矩阵的设计;
    (3)信号重构算法的设计。
    信号的稀疏表示是指当将信号投影到某个正交变换基时,一般情况下绝大多数的变换系数的绝对值都是很小的,得到的变换向量也是稀疏的或者是近似稀疏的,这是原始信号的一种简洁的表达方式,也是压缩传感理论的先验条件。信号必须得在某种变换下才可以进行稀疏表示。通常我们可以选取的变换基有离散傅里叶变换基(DFT)、离散余弦变换基(DCT)、离散小波变换基(DWT)、Curvelet 变换基、Gabor 变换基还有冗余字典等。在信号的编码测量即观测矩阵的设计过程中,要选择稳定的观测矩阵,观测矩阵的选取必须满足受限等距特性(Restricted Isometry Property,RIP)准则,才能保证信号的投影能够保持原始信号的结构特征。通过原始信号与观测矩阵相乘我们可以获得原始信号的线性投影值。最后设计合适的重构算法从所得到的观测值和原来的观测矩阵来重构原始始号。
    所以对压缩感知理论的研究也主要是基于这三个方面的内容:
    (1)信号的稀疏表示。即对于信号  ,如何找到一个合适的正交基或者紧框架Ψ,以使得原始信号在Ψ上的表示是稀疏的。
    (2)观测矩阵的设计。即如何设计一个平稳且满足受限等距特性条件或者与变换基Ψ 满足不相关约束条件的M × N 维观测矩阵Φ,以保证信号稀疏表示后的向量Θ能从原来的N 维降到M 维时所包含的重要信息没有受到破坏,从而保证原始信号的准确重构。这个过程也就是压缩感知理论中信号的低速采样过程。
    (3)重构算法的设计。即如何设计快速有效且稳定的重构算法,从所得到的低维观测向量中准确地恢复原始信号。
    下面我们对压缩感知理论的这三个关键技术做一个详细的总结和分析,以为后文对压缩感知理论在图像重构方面的研究打下基础。
    2.3信号的稀疏表示
    从傅立叶变换到小波变换再到后来兴起的多尺度几何分析(Ridgelet,Curvelet,Bandelet,Contourlet),科学家们的研究目的均是为了研究如何在不同的函数空间为信号提供一种更加简洁、直接的分析方式,所有这些变换都旨在发掘信号的特征并稀疏表示它,进一步研究用某空间的一组基函数表示信号的稀疏程度或分解系数的能量集中程度。
    文献[23]给出稀疏的定义:信号X在正交基 下的变换系数向量为 ,假如对于0<p<2和R> 0,这些系数满足:
       
              (式2.3)

    则说明系数向量 在某种意义下是稀疏的。文献[34]给出另一种定义:如果变换系数 的支撑域 的势小于等于K,则可以说信号X 是K -项稀疏。
    如何找到信号最佳的稀疏域?这是压缩感知理论应用的基础和前提,只有选择合适的基表示信号才能保证信号的稀疏度,从而保证信号的恢复精度。在研究信号的稀疏表示时,可以通过变换系数衰减速度来衡量变换基的稀疏表示能力。Candès 和Tao通过研究发现,满足幂定律衰减的信号,可利用压缩感知理论进行恢复,并且重构误差满足:
          (式2.4)
    其中r=1/p-1/2,0<p<1。
    文献[30]指出光滑信号的Fourier系数、小波系数、有界变差函数的全变差范数、振荡信号的Gabor系数及具有不连续边缘的图像信号的Curvelet系数等都具有足够的稀疏性,可以通过压缩感知理论恢复信号。如何找到或构造适合一类信号的正交基,以求得信号的最稀疏表示,这是一个有待进一步研究的问题。Gabriel Peyré把变换基是正交基的条件扩展到了由多个正交基构成的正交基字典。即在某个正交基字典里,自适应地寻找可以逼近某一种信号特征的最优正交基,根据不同的信号寻找最适合信号特性的一组正交基,对信号进行变换以得到最稀疏的信号表示。
    最近几年,对稀疏表示研究的另一个热点是信号在过完备字典下的稀疏分解。
    字典的选择应尽可能好地符合被逼近信号的结构,其构成可以没有任何限制。从
    从过完备字典中找到具有最佳线性组合的K项原子来表示一个信号,称作信号的稀疏逼近或高度非线性逼近。
    过完备库下的信号稀疏表示方法最早由Mallat和Zhang于1993年首次提出, 并引入了MP算法。文献以浅显易懂的表达说明了过完备字典对信号表示的必要性,同时还指出字典的构成应尽量符合信号本身所固有的特性。
    目前信号在过完备字典下的稀疏表示的研究集中在两个方面:(1)如何构造一个适合某一类信号的过完备字典;(2)如何设计快速有效的稀疏分解算法。这两个问题也一直是该领域研究的热点,学者们对此已做了一些探索,其中,以非相干字典为基础的一系列理论证明得到了进一步改进。
    从非线性逼近角度来讲,信号的稀疏逼近包含两个层面:一是根据目标函数从一个给定的基库中挑选好的或最好的基;二是从这个好的基中挑选最好的K项组合。
    从过完备字典的构成角度来讲,文献[38]中提出使用局部Cosine基来刻画声音信号的局部频域特性;利用bandlet基来刻画图像中的几何边缘。还可以把其它的具有不同形状的基函数归入字典,如适合刻画纹理的Gabor基、适合刻画轮廓的Curvelet基等等。
    从稀疏分解算法角度来讲,在音视频信号处理方面,基于贪婪迭代思想的MP算法表现出极大的优越性,但不是全局最优解。Donoho等人另辟蹊径,提出了BP算法。BP算法具有全局最优的优点,但计算复杂度极高,例如对于长度为8192的信号,采用小波字典分解,等价于求解一个长度为8192*212992的线性规划。MP算法虽然收敛速度较BP快,但不具备全局最优性,且计算复杂度仍然很大。之后又出现了一系列同样基于贪婪迭代思想的改进算法,如正交匹配追踪算法(OMP),树形匹配追踪(TMP),分段匹配追踪(StOMP)算法等。
    2.4 观测矩阵设计
    观测部分的设计其实就是设计高效的观测矩阵,换句话说,就是要设计一个
    能捕捉稀疏信号中有用信息的高效的观测(即采样)协议,从而将该稀疏信号压
    缩成少量的数据。这些协议是非自适应的,仅仅需要用少量的固定波形和原信号
    联系起来,这些固定波形和为信号提供简洁表示的基不相关。此外,观测过程独
    立于信号本身。进一步讲,使用优化方法可以收集到的少量的观测值中重构信号。
    压缩感知理论中,通过变换得到信号的稀疏系数向量 后,需要设计观测部分,它围绕观测矩阵 展开。观测器的设计目的是如何采样得到M个观测值,并保证从中能重构出长度为N的信号X或者基 下等价的稀疏系数向量 。显然,如果观测过程破坏了X中的信息,重构是不可能的。观测过程实际就是利用 观测矩阵 的M个行向量 对稀疏系数向量进行投影,即计算 和各个观测向量 之间的内积,得到M个观测值,
     ,记观测向量 ,即

          (式2.5)

         

    图3.4(a)是(式3.7)的形象描述。这里,采样过程是非自适应的,也就是说, 无须根据信号X 而变化,观测的不再是信号的点采样而是信号的更一般的线性泛函。
    图3.4(a)随机高斯矩阵作为观测矩阵 ,稀疏域选择DCT变换域,对信号X进行DCT变换后再进行观测。(b)是(a)图的另一种表达,变换后的系数向量 是稀疏的,K=3,观测得到的Y是非零系数 对应的四个列向量的线性组合。
    对于给定的Y从(式3.7)中求出 是一个线性规划问题,但由于M<< N,即方程的个数少于未知数的个数,这一欠定问题一般来讲无确定解。然而,如果具有K -项稀疏性(K<<M),则该问题有望求出确定解。此时,只要设法确定出 中的K个非零系数 的合适位置,由于观测向量Y是这些非零系数 对应 的K个列向量的线性组合,从而可以形成一个 的线性方程组来求解这些非零项的具体值。对此,有限等距性质(restricted isometry property, RIP)给出了存在确定解的充要条件。这个充要条件和Candès、Tao等人提出的稀疏信号在观测矩阵作用下必须保持的几何性质相一致。即,要想使信号完全重构,必须保证观测矩阵不会把两个不同的K-项稀疏信号映射到同一个采样集合中,这就要求从观测矩阵中抽取的每M个列向量构成的矩阵是非奇异的。从中可以看出,问题的关键是如何确定非零系数的位置来构造出一个可解的 线性方程组。
    然而,判断给定的 是否具有RIP性质是一个组合复杂度问题。为了降低
    问题的复杂度,能否找到一种易于实现RIP条件的替代方法成为构造观测矩阵 的关键。
    文献[24]指出如果保证观测矩阵 和稀疏基 不相干,则 在很大概率上满足RIP性质。不相干是指向量 不能用 稀疏表示。不相干性越强,互相表示时所需的系数越多;反之,相关性则越强。通过选择高斯随机矩阵作为 即可高概率保证不相干性和RIP性质。例如,可以生成多个零均值、方差为1/ N 的随机高斯函数,将它们作为观测矩阵 的元素 ,使得 以很高的概率具有RIP性质。随机高斯矩阵 具有一个有用的性质:对于一个 的随机高斯矩阵 ,可以证明当 时在很大概率下具有RIP性质(其中c是一个很小的常数)。因此可以从M个观测值 中以很高的概率去恢复长度为N的K-项稀疏信号。总之,随机高斯矩阵与大多数固定正交基构成的矩阵不相关,这一特性决定了选它作为观测矩阵,其它正交基作为稀疏变换基时, 满足RIP性质。为进一步简化观测矩阵 ,在某些条件下,以随机 为元素构成的Rademacher矩阵也可以证明具有RIP性质和普适性。
        目前,对观测矩阵的研究是压缩感知理论的一个重要方面。在该理论中,对
    观测矩阵的约束是比较宽松的,Donoho在文献[23]中给出了观测矩阵所必需具备的三个条件,并指出大部分一致分布的随机矩阵都具备这三个条件,均可作为观测矩阵,如:部分Fourier集、部分Hadamard集、一致分布的随机投影(uniform Random Projection)集等,这与对RIP条件进行研究得出的结论相一致。但是,使用上述各种观测矩阵进行观测后,都仅仅能保证以很高的概率去恢复信号,而不能保证百分之百地精确重构信号。对于任何稳定的重构算法是否存在一个真实的确定性的观测矩阵仍是一个有待研究的问题。文献[56]则从信息论角度描述了信息论与CS之间的联系。它指出,在模拟系统中,观测噪声也是影响观测次数的重要因素,为说明这一点,作者从信息论的角度研究了稀疏信号的率失真函数,给出了观测噪声对信号重建效果的影响。
    2.5 稀疏信号的重构
    压缩感知理论的核心问题是从观测得到的有限的M<<N个观测样本中重构出N长的原信号,即未知量个数比观测量要多得多。由于观测数量M 远小于信号长度N,因此不得不面对求解欠定方程组 的问题,需要列举出 空间的 个稀疏空间,在计算上是相当复杂的。乍一看,我们几乎不可能期望从Y 恢复每个 。然而,文献[23-26,28]的近期研究结果表明如果信号X 是稀疏的,那么(1)精确恢复是可能的;(2)真实信号实际上就是一个简单凸优化问题的解。但是,文献[30]和[23]均指出由于信号X 是稀疏的或可压缩的,这个前提从根本上改变了问题,使得问题可解,而观测矩阵具有RIP性质也为从M 个观测值中精确恢复信号提供了理论保证。
    为更清晰地描述压缩感知理论的信号重构问题, 首先定义向量 的p-范数为
                            (式2.6)
    当p=0时得到0-范数,它实际上表示X中非零项的个数。
    在信号X 稀疏或可压缩的前提下,求解欠定方程组 的问题转化为最小0-范数问题:
        s.t.                  (式2.7)
         但是,它需要列出X中所有非零项位置的 种可能的线性组合,才能得到最优解。因此,求解(式3.9)式的数值计算极不稳定而且是NP难问题。可见,压缩感知和稀疏分解问题从数学意义上讲是同样的优化问题。于是稀疏分解的已有算法可以应用到CS重构中。
    Chen,Donoho和Saunders指出,求解一个更加简单的1-范数最小优化问题会
    产生同等的解(要求 和 不相关):
        s.t.                  (式2.8)
    稍微的差别使得问题变成了一个凸优化问题,于是可以方便地化简为线性规划问题,典型算法代表:BP算法。
    不过,1-范数最小化不是寻找稀疏解的唯一方法;其它方法,例如贪婪算法也已被提出。
    由以上讨论我们可以得出结论:(1)相关性在CS中起着至关重要的作用: 和 相关性越小,需要采样的数目就越少。(2)仅仅观测比信号长度小得多的任何M 个系数的集合,不会损失信息。(3)最小化带线性方程约束的1-范数可以很容易地被转化为线性规划问题,于是可以找到更高效的求解算法。已经证明,如果 ,那么重构成功的概率超过 。
    2.6 重构算法
    由前面的分析可知,过完备库下的稀疏分解问题和压缩感知理论的重构问题都是线性约束下的0-范数求解问题。因此这两类问题的求解本质上是一样的。于是用于过完备库下稀疏分解的方法都可以用于求解压缩感知理论的重构计算。
    定理2已证明:对于一个K项-稀疏(K<<N)长度为N的信号仅仅需要投影到另一个不相关基上的K+1个系数就可以以高概率被重构。然而,求得最小的0-范数解需要进行组合搜索,计算复杂度相当高。Candès 和Donoho 近来提出一种可行的基于线性规划的重构方法,论证了只使用对信号的cK(c =3或者4)个观测值,利用线性规划的方法就可以得到和组合搜索相同的解。尽管BP算法可行,但在实际应用中存在两个问题:第一,即使对常见的图像尺寸,算法的计算复杂度也难以忍受,在采样点个数满足 , 时,重构计算复杂度的量级在 ;第二,由于1-范数无法区分稀疏系数尺度的位置,所以尽管整体上重构信号在欧氏距离上逼近原信号,但存在低尺度能量搬移到了高尺度的现象,从而容易出现一些人工效应,如一维信号会在高频出现振荡。
    针对上述问题,2005 年1 月Candès 和Romberg 提出了不同的信号恢复方法,该方法要求对原信号具有少量的先验条件,同时也可以对所求结果施加适当的限制,以约束重构信号的特性。通过在凸集上交替投影(Projections onto Convex Sets)的方法,可以快速求解线性规划问题。
    另一类基于贪婪思想的迭代算法以更多的观测数量作为代价达到了更加快速重构的目的。
    J.Tropp和A.C.Gilbert提出利用匹配追踪(MP)和正交匹配追踪(OMP)算法来求解优化问题重构信号,大大提高了计算的速度,且易于实现。树形匹配追踪(TMP)算法是2005年Chinh La 和Minh N.Do提出的。该方法针对BP、MP和OMP方法没有考虑信号的多尺度分解时稀疏信号在各子带位置的关系,将稀疏系数的树型结构加以利用,进一步提升了重构信号的精度和求解的速度。匹配追踪类算法都是基于贪婪迭代算法,以多于BP算法需要的采样数目换取计算复杂度的降低。例如OMP算法,需要 , 个采样点数才能以较高的概率恢复信号,信号重构的计算复杂度为 。2006年Donoho等人提出了分段正交匹配追踪(StOMP,stagewise OMP)算法。它将OMP进行一定程度的简化,以逼近精度为代价进一步提高了计算速度(计算复杂度为O(N)),更加适合于求解大规模问题。E. Hale, W. Yin基于分裂算子和同伦算子提出了求解最小1-范数大规模问题的方法,适合于纠错编码、磁共振成像、NMR波谱研究等领域的大规模问题求解。
        在上述各种方法中,观测矩阵中的所有值都非零,这样信号采样过程的计算量是O(MN),在大规模的数据面前,这个量级还是非常大的。因此一类利用稀疏矩阵作为观测矩阵进行采样的方法出现了。Graham Cormode等人,提出利用分组测试和随机子集选取来估计稀疏信号的非零系数的位置和取值,该方法需要的采样数为 ,信号重构的计算复杂度为 ,得到重构信号的速度更快。
    Gilbert等人在2006 年4 月提出了链式追踪(CP,Chaining Pursuit)方法来恢复可压缩信号。利用 个采样观测重构信号,需要计算量为 ,该方法对特别稀疏信号的恢复计算性能较高,但当信号的稀疏度减少,需要的采样点数会迅速增加,甚至超过信号本身的长度,这就失去了压缩采样的意义。
    总之,目前为止出现的重构算法都可归入以下三大类:
    (1)贪婪追踪算法:这类方法是通过每次迭代时选择一个局部最优解来逐步逼近原始信号。这些算法包括MP算法,OMP算法,分段OMP算法(StOMP)和正则化OMP(ROMP)算法。
    (2)凸松弛法:这类方法通过将非凸问题转化为凸问题求解找到信号的逼近,
    如BP算法,内点法,梯度投影方法和迭代阈值法。
    (3)组合算法:这类方法要求信号的采样支持通过分组测试快速重建,如傅
    立叶采样,链式追踪和HHS追踪等。
    总之,每种算法都有其固有的缺点。凸松弛法重构信号所需的观测次数最少,
    但往往计算负担很重。贪婪追踪算法在运行时间和采样效率上都位于另两种算法
    之间。
    由上面的分析可知,重构算法和所需的观测次数密切相关,当前,压缩感知
    理论的信号重构问题的研究主要集中在如何构造稳定的、计算复杂度较低的、对
    观测数量要求较少的重构算法来精确地恢复原信号。
    2.7 压缩感知优势及不足 
    相对于传统的信息处理方式,压缩感知理论毫无疑问是具有优势的,这体现在以下几个方面: 
    (1)采集数据的时候只需要采集一部分数据(包含了原信号的全局信息),一开始就可以传输长度较短的信号。这样做的好处就是将信号压缩这一端的过程简单化,而将复杂的部分交给数据还原的这一端来做。这种优势在医学图像领域体现的愈为明显,因为采集数据的过程往往是对病人带来很大麻烦甚至身体伤害的过程。以 X 光断层扫描为例,众所周知 ,X 光辐射会对病人造成身体损害,而压缩感知的特点使得我们可以用比经典少得多的辐射剂量来进行数据采集,这在医学上的意义是不言而喻的。 
    (2)由于直接感知压缩后的数据,所以不受奈奎斯特采样定律的局限,降低了对采样系统硬件设备的要求,这对于宽带信号非常实用。 
    (3)具有抗干扰能力。由于感知到的测量值中的任何一项都是重要的,或者说不重要的, 所以如果测量值丢失了其中的某几项,仍然可以完美重构信号。 
    当然,目前的压缩感知理论还不是特别完善, 尚存在一些问题需要研究,在这里将列出其中几个问题: 
    (1)实际应用领域中,测量到的数据可能无法包含信号的全局信息,例如最传统的摄像问题,每个感光器件所感知到的只是一小块图像而不是什么全局信息。 
    (2)感知到的测量值的长度一般是重要分量长度的4倍,才能近乎完美地重构。 
    (3)重构算法是NP问题。即使将0-范数转化为1-范数,由于不可微性(indifferentiable),算法的计算复杂度仍然很高。而且,目前的重构算法对含噪信号或者采样过程中引入噪声的信号重构效果不够理想。 
    (4)压缩感知理论是采用非自适应线性投影来保持信号的原始结构,不够灵活,需要研究自适应传感技术,根据不同的信号类型采用不同的数据采样和重构策略。 
    2.8 压缩感知在传感网中的观测方式 
    之前已经提及将压缩感知运用到传感网中,即在节点处得到观测值数据并传给sink节点(或者融合中心)。现在将分别讲述压缩感知在传感网中的两种观测方式。 
    (1)第一种:模拟通信方式 
    模拟通信,即传输的测量值是模拟数据,具体步骤如下(假设有个传感节点): 
    1)对于个节点而言,每一个节点都要利用其节点网络地址(或者编号)作为产生伪随机的种子(seed),得到随机投影矢量 的个K元素。sink节点在知道种子和节点在网络中的地址后,也能够很容易的为每个传感节点j(j=1,...,n)重建出随即矢量 
    2))编号为j的传感节点将所感知数据 与, 相乘得到个元组
           (式2.9)
    所有的节点在k个时隙内(次传输)连贯的将相应的 以模拟方式传至融合中心。由于无线电波的累加性质,在k次传输后sink节点最终得到的接收信号为 
           (式2.10)
    其中ω为通信过程中产生的噪声。 
    以上步骤是以完全分散的形式将感知数据的k个随机投影在k次传输中传给sink节点。
    (2)第二种:数字通信方式 
    数字通信方式,即传输的测量值是量化后的值。这种方式可以达到同样的目的。假设节点能够进行本地通信,并能建立一条路由,从而与某个确定的簇头节点之间形成生成树。具体步骤如下:
    1)首先传感节点能够计算测量值 ; 
    2)然后这些测量值可以经过聚合在簇头节点得到所有测量值V=Ax,然后对这些值进行编码传至sink节点。
    这两种方法主要的不同就在于第一种方式不需要复杂的路由信息。但考虑到数字通信的抗噪声能力强,远距离传输能保证信号质量,在本文中将选取第二种方式。


    第3章 压缩感知理论应用概述
    压缩传感理论带来了传统信号采样理论的变革,而且具有很广阔的应用前景和场合。现有的应用主要包括压缩感知成像、模拟信息的转换、生物传感等方面。
    3.1 压缩成像
    运用压缩感知原理,美国RICE大学已经成功研制了“单像素”压缩数码照相机,设计的原理是首先通过光路系统将成像目标投影到一个数字微镜器件上,然后其反射光由透镜聚焦到单个光敏二极管上,光敏二极管两端的电压值即为一个测量值y,将此投影操作重复M次,得到测量向量y,然后用最小全变分算法构建的数字信号处理器重构原始图像f。数字微镜器件由数字电压信号控制微镜片的机械运动以实现对入射光线的调整,相当于随机观测矩阵Φ。由于该相机直接获取的是M次随机线性测量值,而不是获取原始信号的N (M << N)个像素值,为低像素相机拍摄高质量的图像提供了可能。而且压缩感知技术也可以应用于雷达成像领域,与传统雷达成像技术相比,压缩感知雷达成像主要实现了两个重要改进:在接收端省去了脉冲压缩匹配滤波器;同时因为避开了对原始信号的直接采样,降低了接收端对模数转换器件带宽的要求。设计的重点由传统的设计昂贵的接收端硬件转化成为设计新颖可靠的信号恢复算法,从而简化了雷达成像系统。Bhattacharya等人将压缩感知理论应用到合成孔径雷达图像数据获取上,从而解决了海量数据的采集和存储问题,显著降低了卫星图像处理的计算代价。另外,压缩传感技术也可以应用于医学成像领域,如稀疏核磁共振成像、压缩感知三维磁共振波谱成像等等。
    3.2 模拟信息转换
    对于带宽非常高的信号,比如雷达和通信信号处理系统涉及的射频信号,根据奈奎斯特定理,要获得完整的信号信息,所采用的模数转换器必须具有很高的采样频率。然而由于传感器及转换硬件性能的限制,获得的信号的带宽要远远低于实际信号的带宽,存在较大的信息的丢失。对此Kriolos等人设计了基于压缩感知理论的模拟/信息转换器,利用压缩感知理论中测量信息可以得到完整信号的原理。首先获得原始信号的线性测量,再利用后端数字信号处理器重构原始信号或者直接计算原始信号的统计数据等信息。Laska等人进一步发展了基于随机采样系统的模拟/信息转换器,并给出了随机抽样系统的两种实现模型:第一种模型采用多个并行低采样率的模数转换器,每个模数转换器之间有等间隔的位移,通过随机控制来自不同的模数转换器的采样,实现随机采样。然而这种方法却需要多个模数转换芯片,每个芯片利用率不太高。第二种模型采用一组电容和数字控制换向器随机采样,该系统只需要一个模数转换芯片即可。
    3.3 生物传感
    生物传感中的传统DNA芯片能平行测量多个有机体,但是只能识别有限种类的有机体,Sheikh等人运用压缩感知和群组检测原理设计的压缩感知DNA芯片克服了这个缺点,压缩感知DNA芯片中的每个探测点都能识别一组目标,从而明显减少了所需探测点数量。此外,基于生物体基因序列稀疏特性,Sheikh等验证了可以通过置信传播的方法实现压缩感知DNA芯片中的信号重构。
    除此之外,压缩感知理论还被应用于信号的检测分类、数据的通信、无线传感器网络应用和地球物理数据的分析等众多的领域。
    3.4 本章小结
    本章详细描述了压缩感知理论基本框架。压缩感知理论是一个非常简单有效的信号采集协议,它以较低采样速率和独立于信号的采样方式采样信号,然后又用强大的计算能力从看上去不完整的观测集合中重构原信号。对压缩感知理论实现的两个前提要求——信号稀疏性及观测矩阵和稀疏表示基之间满足不相干性进行了详细的论述,着重介绍了信号稀疏变换、观测矩阵设计和重构算法三个方面的最新研究进展情况。

    压缩感知理论是近几年刚刚兴起的理论,但却展现了强大的生命力引起了广泛的关注,下面我们将对该理论的历史和发展历程做出介绍。

    第4章 CS在无线传感网中的应用 
    前文我们已经对压缩感知(CS)理论做了叫详细的介绍,下面我将介绍将压缩感知应用于无线传感的优势以及采用OMP算法,实现对一维信号和二维信号图像的CS重构。
    4.1 研究背景 
    前面绪论中已经提到无线传感网中的一些感知数据具有时间相关性和空间相关性,利用这种数据特点,人们可以对感知数据进行了压缩处理。下面将介绍已有的基于相关性的数据压缩技术,并阐明利用CS压缩数据的优势。 
    4.1.1 基于感知数据相关性的压缩 
    利用传感数据间的时间相关性,文献[13]提出了节省一个传感器节点内存和计算资源的无损压缩算法。利用传感数据间(相邻传感器节点在同一时刻所采集的数据之间)的空间相关性,文献[17]提出了在多层架构中,运用多重主成分分析法(Multiple Principal Component Analysis, MPCA)去除了普通节点间的数据相关性以及相邻簇头节点主成分之间的相关性,而文献[26]则将近年提出压缩感知算法运用到基于分簇的传感网数据压缩中,降低了传输能耗。文献[33]在时域和空间域提出了多分辨率和查询(Multiresolution Compression and Query, MCQ)架构,用离散余弦变换和差分编码技术来降低数据冗余度,延长网络寿命。但是这些算法并没有综合考虑时间相关性和空间相关性,文献[46]将融合了这两种相关性的分布式信源编码运用到传感网的数据压缩中。在一些分布式编码算法中,需要进行传感器节点间的信息交换,传输这些信息需要消耗能量,因此,文献[13,22]提出了基于联合稀疏模型的分布式压缩感知算法,既采用了两种相关性,又不需要传感器节点之间交换信息,而且能够大大降低所需要传输的测量值的数目,在此基础上,文献[21]还利用贝尔实验室所采集的实际数据进行了仿真验证。另外文献[26]在分布式架构的基础上利用小波提升算法来压缩数据,而文献[23]则优化了簇内信息的交换,此外,文献[25]也都各自阐述了相应的数据压缩技术。 
    4.1.2传统压缩重构方法
    信号压缩一般是通过改变信号的表示方式来实现的,所以压缩和编码也是分不开的。信号压缩的分类方法根据不同的原理大致可以分为两种。首先根据编码的原理和处理的空间域的不同可以将图像压缩方法分为在空间域和变换域编码表示这两大类。
    (1)空间域处理方法
    空间域处理方法是指直接在图像所在的空间对图像进行压缩处理。包括点处理方法(基于像素)和模块处理方法(基于模板)。空间域处理方法的特点是具有较强的实时处理能力,但缺点是压缩比不太高。
    (2)变换域处理方法
    变换域处理方法是指图像编码在图像的某个变换域中进行处理。将图像从空间域变换到一个变换域来进行描述。图像经过变换之后去掉了像素之间的相关性,而且此时能量比较集中,比较有助于后续进一步的压缩处理;在变换域对图像进行处理的效果会比直接在空间域处理的效果要好。变换域编码处理的优点是抗信道误码的能力较强,缺点是算法较复杂,对硬件设备技术要求较高,成本相对较高。常用的图像变换处理方式有:离散傅里叶变换(Discrete FourierTransfrom,DFT),离散余弦变换(Discrete Cosine Transform,DCT),离散沃尔什—哈达玛变换(Walsh-Hadamard),还有近些年来发展起来的小波变换等。
    变换域编码的流程图如图4.1所示:


    4.1.3 图像压缩重构质量的评价
    1.主观评价方法
    图像的最终接收者是人。所以,图像质量的好坏一般取决于人的主观判断。人眼是图像压缩重构后质量主观评价的工具。主观画质评价的实验方法有很多。例如:多用于图像阈值评价的调整法、极限法和恒值法。还有根据图像系统的各种物理心理因素有着一定关系的评价方法,如:排序法、评定尺度法、序列范畴法、配对比较法、谢菲配对比较法等。其中主观评价利用度较高、应用范围较广的是评定尺度法,该方法是给已排好顺序的范畴分别定一个相应的分数,用这个分数值来表达所评价对象的好坏程度。例如,将“非常不好”、“不好”、“一般”、“好”、“非常好”这五种范畴分别定为1,2,3,4,5 分,就可以以这个评价尺度上的数值为心理尺度来按照线性能否保证、能否估计等方式来评价。评价尺度如表4.1 所示:


    评价得分    画质好坏程度    画质失真效果
    5    非常好    感觉不到失真
    4    好    感觉到失真,但没有不舒服感觉
    3    一般    稍有感觉到不舒服
    2    较差    不舒服
    1    差    非常不舒服的感觉

    2.客观评价方法
    所谓的客观评价方法,就是先定义一个数学公式,然后通过运算,得到一个数字量作为评测结果,这个方法经常被用于评价图像的失真程度。图像压缩编码的好坏一般有这样几个量来表征:
    (1)压缩比CR(Compression Ratio)
                                                        (式4.1)
    其中B代表图像压缩前所含的比特数, 代表图像压缩后所含的比特数。
    每个像素所占的比特数又被称之为比特率,单位是bit/s,它是刻画压缩技术或系统的一个重要的性能指标。
    (2)图像压缩编解码速度和所需要的时间
    (3)峰值信噪比PSNR
                       (式4.2)
    式中L代表图像的灰度值的量化级数,例如对于8比特的量化,L=255,MSE 则代表归一化处理后的均方误差,它的定义形式为:
               (式4.3)
    其中M × N 代表图像的尺寸大小,Ψ(x, y)、Ψ’ (x, y)则分别代表原图像和压缩重建后图像在点(x, y)处的灰度值。
    一般来说,PSNR值是对图像重构质量客观评价的一个很重要的指标。通常情况下,当图像的PSNR值超过30dB 时,人们便很难从主观视觉感觉上找出重构后图像与原始图像之间的差异。应该注意的是,MSE和PSNR是从总体上来反映原始图像和重构图像的差别的,并不能反映局部的差别。有时候在同样的信噪比条件下,视觉效果还是会存在一定的差异,这主要还是由于误差的均匀程度所造成的。一般来讲,误差均匀时视觉效果较好,反之视觉效果不理想。所以大多数情况下,我们都可以用PSNR值来对图像的质量进行客观的评价,但有时候其结果可能会与主观评价结果不太相符。
    4.2 压缩感知理论算法对一维信号的实现
    正如本章引言中所提出,压缩感知理论突破了传统的乃奎斯特采样定理,将信号或图像的采样和压缩结合成一起,避免了传统的高速采样再压缩过程中大量采样资源的浪费。从而有效地减少了采样系统的复杂度,降低了系统成本,并且加快了信号和图像的重构速度。
    下面我们将重点介绍基于贪婪迭代思想的正交匹配追踪算法(OMP)是如何进行图像的压缩重构的。
    4.2.1 CS用于WSN的优势 
    对于无线传感器网络来说,压缩感知相对于普通的信息压缩技术的最大优势就在于压缩率高,所需要的传输数据量小。绪论中提到无线传感器节点的信息处理能力有限,使得无线传感器网络中的汇聚节点无法接收和处理太多的信息,从而导致汇聚节点只能处理少数传感器节点所传输的信息,压缩感知理论的应用,恰好使得汇聚节点能够从这些少量的传输信息中得到整个网络的情况。 
    文献中则详述了CS算法用于传感网络的优点: 
    (1)为任意的联合稀疏信号群提供了一个通用编码方法; 
    (2)传感节点之间完全不用合作,也就不需要有通信开销; 
    (3)由于计算复杂度几乎都转移到了收集点的解码端,所以该算法可以在传感节点上的最简单的通信硬件上实施应用; 
    (4)能够容错;对于测量和量化噪声具有鲁棒性,而且具有安全性;对于有损通信环节具有鲁棒性; 
    (5)能够应用于一组传感网络信号的处理,可以用于信号的压缩、预测、检测和分类。 
    4.2.2 观测重构模型 
    在本章中,将采用OMP算法进行传感网中感知数据的重构。首先,根据第二章的介绍,得到基于OMP的模型图,如图4.2所示。 

     

    在上图中,Xj(j {1,2,...J})是第j个节点的原始感知数据(长度为N),在各自的节点处经过计算得到相应的模拟测量值矢量Yj(j {1,2...J})(长度为M),这些模拟测量值经过无线传感网传输到簇头节点之后,在簇头节点集中进行量化编码得到量化的测量值矢量Yj’(j {1,2...J}),并再次通过无线传感网传输到sink节点,最后在sink节点利用OMP算法对每一个测量值矢量进行独立的解码恢复,得到重构后的信号Xj’(j {1,2,...J})。
    4.2.2 正交匹配追踪算法(OMP)
    匹配追踪算法是一种贪婪迭代算法,该算法的思想是在每次迭代过程中,首先从原子库中选择与信号最为匹配的原子,并同时求出原始信号并表示残差,再选择和信号残差最为匹配的原子,再经过一定数目的迭代过程之后,原始信号便可以由一些原子线性地表示出来。该算法的流程如图4.3所示。
     


    OMP算法法继续沿用匹配追踪算法中的原子选择的准则,然后通过递归地对原子集合进行正交化的处理从而保证了迭代的最优性,这样便大大减少了迭代的次数。对K稀疏N维离散时间信号x,采用M×N 维高斯矩阵观测,一般只需要M = O(K ln N)的代价。OMP算法能够高概率重构原始信号,而且该算法的速度比l 范数算法的速度更快。但是,该算法能够精确重构原始信号的理论保证却比l 范数算法要弱,而且并非对所有的信号都能够非常准确地重构,它对于观测矩阵的要求也比较严格。
    4.2.3 算法的实现及结果分析
    为了实现压缩感知理论对信号的重建, 本文选取一维正弦波叠加测试信号: ,采样频率 ,采样间隔 ,采样序列为 ,则原信号为: ,其中信号长度N选取256。首先对一维测试信号进行离散傅里叶正交变换,得到它在傅里叶变换域的稀疏表示形式。然后选取M × N 维的随机高斯分布的白噪声矩阵作为观测矩阵。因为压缩感知理论要求观测值的长度一般要达到信号重要分量即信号稀疏度大小的四倍才能近乎完美重构,即要求M ≈ 4K 或  。信号的重构算法选取压缩感知理论工程领域应用最多的正交匹配追踪算法。
    该算法的流程框图如图4.3所示。具体算法实现步骤如下所示:
    (1)在MATLAB 中生成M×N维的高斯随机分布白噪声观测矩阵Φ=randn(M, N),并通过与原信号相乘获得原信号的M个线性测量值s = Φx,其中 ;
    (2)在MATLAB 中生成傅里叶正交变换矩阵Ψ = fft(eye(N, N))/ sqrt(N) 其中
     ,原信号x通过傅里叶正交变换得到变换域向量y = Φx,反变换则得到重构信号 ,其中 是待求变换域向量,是K项稀疏的。令恢复矩阵 ,则约束等式 可改写成 。因为 中未知数有N 个,方程只有M 个,且M<<N。因此,该方程有无穷多解。而由于 是K 稀疏的,K<M,所以该方程有确定解;
    (3) 先假设稀疏度K=1,则在 向量中,唯一非零元素 在 中对应的位置为q,于是 便是恢复矩阵T的第q列 与 中的非零元素 的乘积, 即
     , 且 ,其中δ 是一个小的常数。换句话说,T 的
    第q列与s的相似程度最高,即可以得 
    ,所以只要求恢复矩阵T 的所有列与s的内积,找到内积绝对值最大的那列即可。该列对应的位置即为q;
    (4)根据最小二乘法,可得 ,此时, 最小。

    计算余量,始终与 正交;

    (5)对于本实验中K>1,再继续找到余量 与T 中所有列向量最大的值即可(但第一次找到的那列要排除,因为已将它保留),即找到使的那列要排除,因为已将它保留)。

    (6)令 ,则余量  被更新为:

    (7)重复以上步骤,直至找到变换域所有K 个重要的分量。其中迭代次数要求m ≥ K ,当满足条件: ,迭代终止,此时便得到重构的谱域向量y^。本实验中,为留有余量,迭代次数m从K至2K之间也选取了多个不同值进行测试。
    (8)做傅里叶逆变换重构得到时域向量 。
    由此可将主程序分以下为四个模块(图4.4):
    (1)信号输入模块,本模块完成一维信号的输入和参数的设定,参数有主要有稀疏度K和测量数M等;
    (2)稀疏表示模块,将信号x稀疏表示;
    (3)OMP重构信号模块,本模块完成对信号的降维投影和重构;
    (4)信号输出模块,本模块输出原始信号x和重构信号x^。

    程序流程图如图4.5:


    在 MATLAB7.0 实验平台下,为验证高概率重构原始信号所需观测值M的大小,本文选取了不同M值的观测矩阵对原信号进行观测采样,得到了不同的重构效果。不同M值的选取所得到重构误差如表4.2所示。


    M值    10    15    20    25
    重构误差    1.8051    1.2772    1.0908    0.6689
    M值    30    40    50    64
    重构误差    7.0638e-014    6.9980e-014    7.7848e-014    5.9400e-014


    从表4.2 可以看出当观测值M的大小超过30时,重构误差在e-14数量级,从图4.6 也可以看出重构信号与原始信号非常接近,重构效果较好。而当M值较小时,重构误差较大,从图4.7也可以看出重构效果不理想。这也验证了压缩感知理论要求观测值的长度一般要达到信号重要分量四倍左右才能近乎精确重构这一条件要求。
    在实验过程中,并不是每次相同的观测值都会重构出相同误差值的信号,因为我们采用的是高斯随机观测矩阵。而且会出现经过多次以较小的M值(如20)进行运算后也能得到高精度的信号,但经过多次的实验表明,对一维测试信号,当观测值的长度达到信号重要分量即信号稀疏度四倍(M ≈ 4K )或 时重构效果较为理想。算法性能较为稳定。这些也充分说明了该算法对维数较低的小尺度信号的重构效果较为理想,重构速度也较快。

     


     


    4.3 压缩感知理论算法对二维图像重构的实现
    4.3.1 基于小波变换的分块压缩感知理论
    由前面内容可以得知:压缩感知图像重建是利用图像在某个变换域具有稀疏表示的先验知识来完成的。而大部分图像本身却并不是稀疏的,一般都是通过某种稀疏变换进行稀疏表示的。现在的实际图像则常采用离散余弦变换和小波变换等非冗余的正交变换来进行表示。
    由于对图像进行小波变换之后小波系数的稀疏性,本文通过对测试图像进行小波稀疏变换,得到稀疏的小波系数矩阵;然后通过设计合适的观测矩阵对小波变换后的稀疏小波系数进行观测,得到数据量远小于原信号或图像维数N 的M 个观测值;最后通过采用合适的重构算法即求解一个基于严格的数学最优化问题来重构出小波变换域下的稀疏小波矩阵,从而得到重构后的图像。该方法的处理流程如图4.8所示:
     

    4.3.2 实现步骤
    本文分别选取不同特性的两幅标准测试图像:大小为256×256的lena 图像、大小为256×256的rice图像,采用上述压缩感知方法对分别在不同的采样率下对图像进行变化重构。具体实现步骤如下所示:
    (1)选取大小为N×N的测试图像X,根据测试图像的大小进行适当的分块,把原始图像数据分成适当大小的不同块,如8×8块,16×16块,32×32等;
    (2)对每个子块进行离散余弦变换,以得到它在变换域的变换系数;
    (3)然后对变换域的系数进行量化处理,构成一个系数矩阵;
    (4)对每个数据块单元的稀疏变换系数用Z(Zigzag)行扫描将其变成一维的数列,以有利于后面的熵编码步骤;
    (5)对系数矩阵的直流(DC)、交流(AC)系数进行编码。
    (6)解码重构图像,计算峰值信噪比psnr

    (式4.4)

    其中,MSE 代表归一化处理后的均方误差,其计算公式为:

    (式4.5)

    整个编解码流程可以归纳为以下几个步骤:
    (1)首先像素大小为X = N×N的图像均匀分成互不覆盖大小为B×B的子块 ,i=1,2,…,n, 
    (2)对每个块进行二维DCT 变换以得到它在变换域的系数表示形式,然后对变换域的系数进行量化Z行扫描以得到变换域系数稀疏矩阵的一维数列形式。
       (3)设计维数为 的高斯随机观测矩阵 ,对量化扫描后的变换域系数进行观测采样得到长度为 的观测值向量 。对i子块的整个采样过程可表示为:           

    (式4.6)
                                                                             
    式中 代表量化算子,Τ(⋅)是指二维离散余弦变换算子, 则是序列长度为
     的观测采样向量。
       (4)定义 为一个子块的采样算子,则整幅图像的等价采样矩阵可写成一个基于采样算子 的对角矩阵Φ


    (式4.7)

    (5)重构算法可以通过求解一个基于范数的最小优化问题解决:
    目标函数:      且满足等式约束:     (式4.8)
    其中 ,s′是s的近似估计。
    根据以上步骤,我们将程序分为五个模块(图4.9): 

    (1)输入模块。本模块完成图像的输入和参数的设定;
    (2)CS压缩感知模块。本模块将输入图像进行DCT稀疏变换,降维投影,压缩编码;
    (3)OMP解码重构模块。本模块将压缩后的信号解码重构;
    (4)误差计算模块。本模块计算重构图像与原始图像的psnr值和mse值;
    (5)输出模块。本模块完成重构图像和各结果参数的输出。


    主程序流程图如图4.10:
     

    CS压缩编码子程序流程图如图4.11:
     


    OMP重构子程序如图4.12: 


    4.3.3 重构结果及分析
    首先我们令分块都为8×8不变,通过选取大小不同的观测矩阵,即在不同的观测长度下,研究采样率对重构效果和重构时间的影响。本实验所选取的观测长度M分别为16、32、64、128。
    重构效果如图4.13和图4.14所示。
       
      

         

    过重构效果图可以看出,图像的质量随着采样率的增加而显著提高,当采样率较低时,采样信息不能包含图像的所有有效信息,重构会出现很多误差,甚至根本不能实现重构。在实验过程中对于不同稀疏度的图像重构的效果也是不一
    样的,重构的时间也相同。当采样率太低而重构算法不能有效进行时,重构时间会特别长,而重构效果也不好。表4.4 给出了在不同的测量值M下,该方法对两幅图像重构所用重构时间、PSNR(峰值信噪比)、MSE(均方差)的对比。


        观测长度M    Psnr(dB)    MSE    重构时间(s)
    lena    16    NaN    NaN    41.30
        32    24.3720    1.5572e+007    20.03
        64    33.2605    2.0114e+006    24.36
        128    37.2576    8.0131e+005    27.43

    coins    16    NaN    NaN    21.49
        32    24.2518    1.6010e+007    10.54
        64    33.0032    2.1342e+006    12.86
        128    37.5355    7.5164e+005    14.66
    从表4.3可以看出:当测量数增加时,重构图像的PSNR值有明显的提高,重构效果也相应增强,但当测量数偏低,如测量数为16时,PSNR值明显过低,重构效果很差。这也说明当采样率过低时,该算法的性能很低,达不到压缩感知重构算法的要求。但当采样率较高时,虽然重构图像的效果和PSNR值较高,但整个重构过程所花费的时间也随之增长。重构所需要的观测值数量较多的话,便体现不了压缩感知理论对信号重构所需要的低采样率的优势。所以该算法的性能还需得到进一步的改进和优化。
    上面我们只是在8×8分块的情况下运行算法进行图像重构,如果将图像分块为16×16时,会有什么效果呢?下面我们给出16×16分块下,图像cameraman和rice的重构效果图并做出结果分析。
    重构效果如图4.15和图4.16所示。
       
      

         


    通过实验分析可得采用不同分块重构效果的性能参数的比较如表4.4和表4.5所示:


    lena    分块(8×8)    分块(16×16)
    测量值M    PSNR(dB)    重构时间(s)    PSNR(dB)    重构时间(s)
    16    NaN    41.30    NaN    11.57
    32    24.3720    20.03    17.9850    6.03
    64    33.2605    24.36    20.9283    7.32
    128    37.2576    27.43    25.0834    8.72

    coins    分块(8×8)    分块(16×16)
    测量值M    PSNR(dB)    重构时间(s)    PSNR(dB)    重构时间(s)
    16    NaN    21.49    NaN    6.88
    32    24.2518    10.54    17.3982    3.38
    64    33.0032    12.86    21.1624    4.31
    128    37.5355    14.66    25.9449    5.03

    通过重构效果图可以很明显的看出,随着测量数的增加,重构效果明显增强,重构图像的信噪比PSNR值也随之提高。而从不同分块的效果图以及表4.5和表4.6中的数据可以得出,对于相同的采样数,随着分块大小的减小,图像的重构效果会有很大的提高,但重构时间则会随之增加。分块16×16的重构时间比分块8×8的重构时间少的多,但相应的其重构质量却大为下降。如何构造稳定的、计算复杂度较低的、对观测次数较少的重构算法来精确的恢复可压缩信号,将是未来压缩感知的一个重要的研究方向。
    4.4 本章小结
    本章说明了压缩感知/分布式压缩感知用于无线传感网的优势。重点对基于变换域处理的图像压缩方法做了详细的研究,在此基础上实现了小波变换编解码对一维信号和二维图像的变换重构。在离散傅里叶变换和小波变换的基础上,采用压缩感知理论框架的正交匹配追踪算法实现了对一维信号和二维图像的高概率重构,通过实验结果分析对其进行了重构效果的主客观评价。
    第5章 总结与展望
    5.1 工作总结 
    利用信号的稀疏特性,压缩感知理论将传统的基于奈奎斯特采样定理的信号采样过程转化为基于优化准则恢复信号的观测过程,省去了高速采样过程中获得大批冗余数据然后再舍去大部分无用数据的中间过程,从而有效缓解了高速采样实现的压力,减少了处理、存储和传输的成本,使得用低成本的传感器将模拟信息转化为数字信息成为可能。 在压缩感知理论上,结合分布式信源编码技术,得到适合分布式网络数据处理的分布式压缩感知理论。在分布式压缩感知理论的框架下,分析了适合不同特点的感知数据的三种模型。 本文的研究工作主要是在介绍上述理论的基础上,首先,将用于压缩感知理论的OMP算法与用于传统算法在处理多信号的测量速率、信号平均信噪比等性能上作了比较,并首次分析了在多信号情况下,这两种算法平均处理单个信号所需要的时间复杂度。接着,将上述两种算法用于无线传感网中的实际的感知数据,结果表明OMP算法在不增加终端编码复杂度的情况下,更能够显著降低传输的测量速率,从而节省传感器节点的能量消耗,但是它对于量化比特数的影响更为敏感。 
    5.2 后续展望 
    由于自身能力和时间的限制,本文所做的研究工作还不是十分完善,有待进一步改进,今后可以从以下几个方面进行深入的探讨和研究: 
    (1) 本文中直接采用了固定的稀疏基、测量矩阵以及信号重建算法,以后可以根据实 际感知数据的分布情况,选择最合适的搭配方式。 
    (2) 本文仅仅对OMP算法和传统小波算法的时间复杂度作了简单比较,下一步可以研究如何有效降低这两种算法复杂度(包括空间复杂度),并且可以在综合考虑测量速率和复杂度的基础上提出折中方案。 
    (3) 将压缩技术和路由策略相结合,进一步降低网络中的能量消耗。 


    参考文献

    [1] E Candes. Compressive sampling. Proceedings of the International Congress of Mathematicians. Madrid, Spain, 2006, 3: 1433~1452.
    [2] E Candes, J Romberg, Terence Tao. Robust uncertainty principles: Exact signal reconstruction from highly incomplete frequency information [J]. IEEE Trans. on Information Theory, 2006,52(2): 489~509.
    [3] E Candes and J Romberg. Quantitative robust uncertainty principles and optimally sparse decompositions [J]. Foundations of Comput Math, 2006, 6 (2): 227~254.
    [4] D L Donoho. Compressed sensing [J], IEEE Trans. on Information Theory. 2006,52 (4):1289~1306.
    [5] E J Candes, J Romberg. Practical signal recovery from random projections[OL].
    http://www.acm.caltech.edu/~ emmanuel/papers/Practical Recovery.pdf.
    [6] D L Donoho, Y Tsaig. Extensions of compressed sensing [J]. Signal Processing.
    2006,86(3):533~548.
    [7] B Kashin. The widths of certain finite dimensional sets and classes of smooth functions[J]. Izv Akad Nauk SSSR. 1977,41(2):334~351.
    [8] E J Candes and T Tao. Near optimal signal recovery from random projections: Universal encoding strategies[J]. IEEE Trans. Info. Theory.2006,53(12):5406~5425.
    [9] Mallat S. A Wavelet Tour of Signal Processing. San Diego: Academic Press,1996
    [10] Candes E, Donoho D L. Curvelets-A Surprisingly Effective Nonadaptive Representation for Objects with Edges, Technical Report 1999-28, Department of Statistics, Stanford University,USA, 1999.
    [11] Sun Yu-Bao, Xiao Liang, Wei Zhi-Hui, Shao Wen-Ze. Sparse representations of images by a multicomponent Gabor perception dictionary. Acta Automatica Sinica,2008,34(11): 1379~1387.
    [12] Aharon M, Elad M, Bruckstein A M. The K-SVD: an algorithm for designing of overcomplete dictionaries for sparse representations. IEEE Transactions on Image Processing, 2006,54(11):4311~4322.
    [13] Rauhut H, Schnass K, Vandergheynst P. Compressed sensing and redundant dictionaries. IEEE Transactions on Information Theory, 2008,54(5): 2210~2219.
    [14] Candes E, Romberg J. Sparsity and incoherence in compressive sampling. Inverse Problems,2007,23(3): 969~985.
    [15] G Peyre. Best Basis compressed sensing[J]. Lecture Notes in Computer Science, 2007,4485:80~91.
    [16] 彭玉华.小波变换与工程应用,第一版. 北京:科学出版社,1999.
    [17] 赵松年,熊小芸.子波变换与子波分析,第一版. 北京:电子工业出版社,1996.
    [18] 陈逢时子波变换理论及其在信号处理中的应用,第一版. 北京:国防工业出版社,1998.
    [19] 杨帆. 基于Contourlet 变换的图像去噪算法研究. 硕士学位论文. 北京交通大学信息科学研究所. 2007. P4~6: 27~30.
    [20]陈超.MATLAB应用实例精讲—图像处理与GUI设计篇.北京:电子工业出版社.2010.
    [21]胡学龙.许开宇.数字图像处理.北京:电子工业出版社.2006.20~153
    [22]王正林.精通MATLAB7.北京:电子工业出版社.2006.IEEE,2007.141~144.
    [23]董长虹.MATLAB图像处理与应用.北京:国防工业出版社.2003SPIE, Bellingham, WA: SPIE, 2008, 68140J-12. 
    [24] 沙威.压缩感知引论[OL].[2008]. http:// www. eee. hku/ ~wsha/ Freecode/ Files/ Compressive Sensing. Pdf. 
    [25] 胡海峰,杨震. 无线传感网中基于空间相关性的分布式压缩感知. 南京邮电大学学报(自然科学版, 2009, 29(6): 12-16. 
    [26] 魏永红, 李科杰. 层次拓扑结构的无线传感器网络能量模型. 计算机应用, 2010, 30(7): 1731-1735. 

    展开全文
  • 关于分数阶Fourier域的图像压缩感知研究,一篇不错的论文,你值得一看
  • 利用亚像素卷积生成对抗网络学习图像压缩感知

    原文《Learning image compressed sensing with sub-pixel convolutional generative adversarial network》

    论文分析

    这篇论文使用对抗神经网络来实现压缩感知重建,其结构非常简单清晰,只不过在生成器中用子像素卷积层代替了反卷积。
    结构如下:
    在这里插入图片描述在这里插入图片描述可以看到,生成器使用了多个子像素卷积层逐步提升图像的尺寸。
    在编码端,依然使用了传统的高斯随机矩阵来采样测量值。用这个测量值代替生成器中原本输入的随机向量。
    我认为本文最有意思的创新在于损失函数。因为正常的对抗生成网络的损失函数是保证概率分布相似而不是图像完全一样,所以是难以进行重构的,只会生成相似的图像。本文的损失函数为:
    J(D,G)=minGmaxD[lrec(G(y),x)+lmeans(y,ϕ(G(y))+lGAN(G(y),D)]J(D,G)=\mathop{min}\limits_{G}\mathop{max}\limits_{D}[l_{rec}(G(y),x)+l_{means}(y,\phi (G(y))+l_{GAN}(G(y),D)]
    其中lGAN(G(y),D)l_{GAN}(G(y),D)为生成对抗网络的对抗损失,而lrec(G(y),x)l_{rec}(G(y),x)为生成图像与原图的均方差损失,lmeans(y,ϕ(G(y))l_{means}(y,\phi (G(y))为原图的测量值与生成图像的测量值之间的均方差。后两项损失保证了重构图像与原图尽可能的近似,尤其是测量值的均方差,这是我第一次见到在损失函数中进行使用。
    作者做了三个对比实验,第一个是将子像素卷积层换成反卷积层,第二个是将生成器的输入变成随机向量而不是图像的测量值,第三个是只训练生成器而不是对抗训练。三者的结果均不好,证明了论文方法的有效性。

    我的看法

    这篇论文的创新点并不亮眼,且局限性比较大。
    首先编码端依旧是传统随机矩阵,没有实现端到端的训练,而目前很多方法的编码端也放入了深度学习模型中,效果更好。
    其次在模型中使用了全连接层,意味着模型将会很大,很占用空间,而且无法适用于不同尺寸的图像。
    本文中使用的都是64x64或28x28的公共数据集,都是很小的图像,很难拓展到大图上。一方面是对抗神经网络的训练有不稳定性,一方面是大图导致模型非常大(全连接层的缘故),一般的硬件设备训练不了。

    展开全文
  • 使用CNN对自然图像压缩重构【图像压缩感知

    千次阅读 热门讨论 2019-05-12 15:36:09
    分析论文:Shi W, Jiang F, Zhang S, et al. Deep Networks for Compressed Image Sensing[J]. 2017:877-882. 论文题目:Deep Networks for Compressed Image Sensing 自然图像压缩深度网络.

    基于深度学习的图像压缩感知

    针对图像的压缩感知有好多篇论文使用深度学习的方法实现图像压缩采样和重构,主要是复现论文的代码过程。
    分析论文:[1]Shi W, Jiang F, Zhang S, et al. Deep Networks for Compressed Image Sensing[J]. 2017:877-882.
    论文题目:Deep Networks for Compressed Image Sensing
    首先论文的框架是:
    在这里插入图片描述
    中心思想是通过卷积和步长实现图像的压缩,然后通过卷积的深度实现小块图像的重构和块图像的拼接,最后通过5层卷积神经网络实现最终图像的复原。这个过程和GANLU在2009年的块压缩感知的论文[2]过程差不多。结合两篇论文的过程,实现代码:
    [2].Gan L. Block Compressed Sensing of Natural Images[C]// International Conference on Digital Signal Processing. IEEE, 2007:403-406.
    准备数据集:利用BSDS500中的400张自然图像,通过平移旋转镜像等方法得到128*128大小的图像70000张左右,存储格式使用的是.h5用起来比较方便,测试集使用了100张图像作为测试集。

    path = '/home/train.h5'
    def read_data(path):   
        with h5py.File(path, 'r') as hf:
             orig_image = np.array(hf.get('orig_image'))
             sample_line = np.array(hf.get('sample_line'))
        return orig_image, sample_line
    orig_image, sample_line = read_data(path)
    #read validation data:
    path1 = '/home/test1.h5'
    def read_data1(path):
        with h5py.File(path, 'r') as hf:
             orig_image = np.array(hf.get('orig_image'))
             sample_line = np.array(hf.get('sample_line'))
        return orig_image, sample_line
    test_image, test_line = read_data1(path1)
    test_image = test_image.reshape((100, 256, 256, 1))
    # Load test data:
    read_dictionary = np.load('/home/lab30202/Juanjuan/images/h5/test_data.npy').item()
    #print(read_dictionary['baby']) # displays "world"
    image_test = tf.placeholder(tf.float32, [1, 512, 512, 1])
    

    整个过程代码:

    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    import tensorflow as tf
    import numpy as np
    from PIL import Image 
    import matplotlib.pyplot as plt
    from skimage import io, img_as_float, measure
    import os
    import h5py
    import collections
    #########################################################################
    #read train original data
    #read train original data
    path = '/home/train.h5'
    def read_data(path):
        
        with h5py.File(path, 'r') as hf:
             orig_image = np.array(hf.get('orig_image'))
             sample_line = np.array(hf.get('sample_line'))
        return orig_image, sample_line
    orig_image, sample_line = read_data(path)
    
    #read validation data:
    path1 = '/home/test1.h5'
    def read_data1(path): 
        with h5py.File(path, 'r') as hf:
             orig_image = np.array(hf.get('orig_image'))
             sample_line = np.array(hf.get('sample_line'))
        return orig_image, sample_line
    test_image, test_line = read_data1(path1)
    test_image = test_image.reshape((100, 256, 256, 1))
    # Load test data:
    read_dictionary = np.load('/home/lab30202/Juanjuan/images/h5/test_data.npy').item()
    image_test = tf.placeholder(tf.float32, [1, 512, 512, 1])
    #CNN
    learning_rate1 = 0.001
    learning_rate2 = 0.0001
    learning_rate3 = 0.00001
    
    #training_iters = 25
    batch_size = 64
    num_samples= len(orig_image)
    batch_index = num_samples/batch_size
    training_epochs = 50
    training_epochs1 = 80
    training_epochs2 = 100
    display_step = 1
    
    x = tf.placeholder(tf.float32, [None, 128, 128, 1])
    y = tf.placeholder(tf.float32, [None, 128, 128, 1])
    keep_prob = tf.placeholder(tf.float32)
    
    def tensor_concat(f, axis):
        x1 = f[0, :, :]
        for i in range(1, f.shape[0]):
            x1 = tf.concat([x1, f[i, :, :]], axis=axis)
        return x1
    
    def block_to_image(f, batch_size):
        x3 =[]
        f = tf.reshape(f, [batch_size, f.shape[1], f.shape[2], 1024])
        for k in range(int(f.shape[0])):
            x = f[k, :, :, :]
            q = f.shape[1]*f.shape[2]
            p = int(f.shape[2])
            x1 = tf.reshape(x, [q, 1024])
            x1 = tf.reshape(x1, [q, 32, 32])
            m2 = tensor_concat(x1[0:f.shape[1], :, :], axis=1)
            for i in range(1, f.shape[1]):
                m1 = tensor_concat(x1[i*p:(i+1)*p, :, :], axis=1)
                m2 = tf.concat([m2, m1], axis=0)
            x2 = tf.reshape(m2, [32*p, 32*p, 1])
            x3.append(x2)
            x4 = tf.stack(x3)
        return x4
    
    def conv2dcs1(name, x, W, strides):
       x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='VALID')
       return x
       #return  tf.nn.relu(x, name=name) 
       #return tf.nn.sigmoid(x, name=name)
    
    def conv2dcs2(name, x, W, strides):
       x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
       return x
       #return  tf.nn.relu(x, name=name) 
       #return tf.nn.sigmoid(x, name=name)
    
    def conv2d(name, x, W, strides=1):
       x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
       return  tf.nn.relu(x, name=name)
    
    weight1 = {
      'wcs1': tf.Variable(tf.random_normal([32, 32, 1, 102], stddev=0.02)),
      'wcs2': tf.Variable(tf.random_normal([1, 1, 102, 1024], stddev=0.02))
      }
      
    weight2 = {
      'wc1': tf.Variable(tf.random_normal([3, 3, 1, 64], stddev=0.1)), 
      'wc2': tf.Variable(tf.random_normal([3, 3, 64, 64], stddev=0.1)),  
      'wc3': tf.Variable(tf.random_normal([3, 3, 64, 64], stddev=0.1)),
      'wc4': tf.Variable(tf.random_normal([3, 3, 64, 64], stddev=0.1)),
      'wc5': tf.Variable(tf.random_normal([3, 3, 64, 1], stddev=0.1))
      }
    
    def cs_net(x, weight1, batch_size):
        x = tf.cast(x, dtype=tf.float32)
        #the sampling matrix 
        conv1 = conv2dcs1('conv1', x, weight1['wcs1'], strides=32)  
        #the reshape and concatenation layer:
        conv2 = conv2dcs2('conv2', conv1, weight1['wcs2'], strides=1)
        output = block_to_image(conv2, batch_size)
        return output
        
    def cs_cnn_net(x, weight1, weight2, batch_size):
      #sampling matrix network:
       x = tf.reshape(x, shape=([-1, x.shape[1], x.shape[2], 1]))
       x1 = cs_net(x, weight1, batch_size)
      #the deep reconstruction sub-betwork
       conv3 = conv2d('conv3', x1, weight2['wc1'])
       conv4 = conv2d('conv4', conv3, weight2['wc2'])
       conv5 = conv2d('conv5', conv4, weight2['wc3'])
       conv6 = conv2d('conv6', conv5, weight2['wc4'])
       conv7 = conv2d('conv7', conv6, weight2['wc5'])
       return conv7
    
    pred = cs_cnn_net(x, weight1, weight2, batch_size)
    y_true = x
    mse_loss = tf.reduce_mean(tf.pow(pred - y_true, 2))
    
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate1, beta1=0.9, beta2=0.999).minimize(mse_loss)
    optimizer1 = tf.train.AdamOptimizer(learning_rate=learning_rate2, beta1=0.9, beta2=0.999).minimize(mse_loss)
    optimizer2 = tf.train.AdamOptimizer(learning_rate=learning_rate3, beta1=0.9, beta2=0.999).minimize(mse_loss)
    
    #验证集的测试:
    pred1 = cs_cnn_net(test_image, weight1, weight2, batch_size=100)
    y_pred1 = test_image
    y_pred1_mse = tf.reduce_mean(tf.pow(pred1-y_pred1, 2))
    
    #测试集的测试:
    pred2 = cs_cnn_net(image_test, weight1, weight2, batch_size=1)
    y_pred2 = image_test
    y_pred2_mse = tf.reduce_mean(tf.pow(pred2-y_pred2, 2))
    
    #模型存储:
    model_save_path = '/home/model_cnn_rs/' 
    model_name = 'model.ckpt'
    saver = tf.train.Saver(tf.all_variables())
    init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
    with tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
                                          log_device_placement=True)) as sess:
        sess.run(init_op)
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(coord=coord)
        mse_loss1 = []
        mse_loss2 = []
        psnr_test = collections.defaultdict(list)
        mse_test = collections.defaultdict(list)
        ssim_test = collections.defaultdict(list)
    
        #开始训练
        #前 50次训练:
        for epoch in range(training_epochs):
            for i in range(batch_index):
                batch_orig = orig_image[i*batch_size:(i+1)*batch_size]
                _, c = sess.run([optimizer, mse_loss], feed_dict={x: batch_orig})
                if i % 100 == 0:
                    print "iter:", "%04d" %(i+1), 'mse=', '{:.9f}'.format(c)
                    mse_loss1.append(c)
    
            #每一轮打印一次
            if epoch % display_step == 0:
                print "epoch:", "%04d" %(epoch +1), "mse=", "{:.9f}".format(c)
                checkpoint_path = os.path.join(model_save_path, model_name)
                saver.save(sess, checkpoint_path, global_step=epoch)
                mse = sess.run([y_pred1_mse])
                mse_loss2.append(mse)  #验证集
                
               # keys = ['butterfly', 'pepper', 'baby', 'bird', 'lenna']
                keys = ['pepper', 'baby', 'lenna']
                for key in keys:
                    print key
                    image = read_dictionary[key]
                    image_test1 = image.reshape((1, image.shape[0], image.shape[1], 1))
                    y, mse1 = sess.run([pred2, y_pred2_mse], feed_dict={image_test: image_test1})
                    y = y.reshape((y.shape[1], y.shape[2]))
                    y = np.where(y>=-1, y, -1)
                    y = np.where(y<=1, y, 1)
    
                    psnr = measure.compare_psnr(image, y, data_range=1)
                    ssim = measure.compare_ssim(image, y, data_range=1)
                    mse = measure.compare_mse(image, y)
                    print psnr
                    mse_test[key].append(mse)
                    psnr_test[key].append(psnr)
                    ssim_test[key].append(ssim)
    
                    print "validation_image:", 'mse=', '{:.9f}'.format(mse1)
                    print "test_image:", key, 'mse=', '{:.9f}'.format(mse), 'psnr=', '{:.9f}'.format(psnr), 'ssim=', '{:.9f}'.format(ssim)
                   # y = y.reshape((y.shape[1], y.shape[2]))
                    error = y - image
                    io.imsave(model_save_path+key+'pred'+np.str(epoch)+'.jpg', y)
                    io.imsave(model_save_path+key+'error'+np.str(epoch)+'.jpg', error)
         
        #前 50-80次训练:
        for epoch in range(training_epochs, training_epochs1):
            for i in range(batch_index):
                batch_orig = orig_image[i*batch_size:(i+1)*batch_size]
                _, c = sess.run([optimizer1, mse_loss], feed_dict={x: batch_orig})
                if i % 100 == 0:
                    print "iter:", "%04d" %(i+1), 'mse=', '{:.9f}'.format(c)
                    mse_loss1.append(c)
    
            #每一轮打印一次
            if epoch % display_step == 0:
                print "epoch:", "%04d" %(epoch +1), "mse=", "{:.9f}".format(c)
                checkpoint_path = os.path.join(model_save_path, model_name)
                saver.save(sess, checkpoint_path, global_step=epoch)
                mse = sess.run([y_pred1_mse])
                mse_loss2.append(mse)  #验证集
                
               # keys = ['butterfly', 'pepper', 'baby', 'bird', 'lenna']
                keys = ['pepper', 'baby', 'lenna']
                for key in keys:
                    image = read_dictionary[key]
                    image_test1 = image.reshape((1, image.shape[0], image.shape[1], 1))
                    y, mse1 = sess.run([pred2, y_pred2_mse], feed_dict={image_test: image_test1})
                    y = y.reshape((y.shape[1], y.shape[2]))
                    y = np.where(y>=-1, y, -1)
                    y = np.where(y<=1, y, 1)
    
                    psnr = measure.compare_psnr(image, y, data_range=1)
                    ssim = measure.compare_ssim(image, y, data_range=1)
                    mse = measure.compare_mse(image, y)
                    mse_test[key].append(mse)
                    psnr_test[key].append(psnr)
                    ssim_test[key].append(ssim)
    
                    print "validation_image:", 'mse=', '{:.9f}'.format(mse1)
                    print "test_image:", key, 'mse=', '{:.9f}'.format(mse), 'psnr=', '{:.9f}'.format(psnr), 'ssim=', '{:.9f}'.format(ssim)
                    # y = y.reshape((y.shape[1], y.shape[2]))
                    error = y - image
                    io.imsave(model_save_path+key+'pred'+np.str(epoch)+'.jpg', y)
                    io.imsave(model_save_path+key+'error'+np.str(epoch)+'.jpg', error)    
           
        #前 80-100次训练:
        for epoch in range(training_epochs1, training_epochs2):
            for i in range(batch_index):
                batch_orig = orig_image[i*batch_size:(i+1)*batch_size]
                _, c = sess.run([optimizer2, mse_loss], feed_dict={x: batch_orig})
                if i % 100 == 0:
                    print "iter:", "%04d" %(i+1), 'mse=', '{:.9f}'.format(c)
                    mse_loss1.append(c)
    
            #每一轮打印一次
            if epoch % display_step == 0:
                print "epoch:", "%04d" %(epoch +1), "mse=", "{:.9f}".format(c)
                checkpoint_path = os.path.join(model_save_path, model_name)
                saver.save(sess, checkpoint_path, global_step=epoch)
                mse = sess.run([y_pred1_mse])
                mse_loss2.append(mse)  #验证集
                
               # keys = ['butterfly', 'pepper', 'baby', 'bird', 'lenna']
                keys = ['pepper', 'baby', 'lenna']
                for key in keys:
                    image = read_dictionary[key]
                    image_test1 = image.reshape((1, image.shape[0], image.shape[1], 1))
                    y, mse1 = sess.run([pred2, y_pred2_mse], feed_dict={image_test: image_test1})
                    y = y.reshape((y.shape[1], y.shape[2]))
                    y = np.where(y>=-1, y, -1)
                    y = np.where(y<=1, y, 1)
                    psnr = measure.compare_psnr(image, y, data_range=1)
                    ssim = measure.compare_ssim(image, y, data_range=1)
                    mse = measure.compare_mse(image, y)
    
                    mse_test[key].append(mse)
                    psnr_test[key].append(psnr)
                    ssim_test[key].append(ssim)
                    print "validation_image:", 'mse=', '{:.9f}'.format(mse1)
                    print "test_image:", key, 'mse=', '{:.9f}'.format(mse), 'psnr=', '{:.9f}'.format(psnr), 'ssim=', '{:.9f}'.format(ssim)
                   # y = y.reshape((y.shape[1], y.shape[2]))
                    error = y - image
                    io.imsave(model_save_path+key+'pred'+np.str(epoch)+'.jpg', y)
                    io.imsave(model_save_path+key+'error'+np.str(epoch)+'.jpg', error)
        
        print "Optimaization Finished"
        np.savetxt(model_save_path+'mse_loss1', mse_loss1)
        np.savetxt(model_save_path+'mse_loss2', mse_loss2)
        np.save(model_save_path+'psnr_test.npy', psnr_test)
        np.save(model_save_path+'mse_test.npy', mse_test)
        np.save(model_save_path+'ssim_test.npy', ssim_test)
      
        coord.request_stop()
        coord.join(threads)
    

    训练对应的验证集的损失函数的变化:
    在这里插入图片描述
    图像的测试结果:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这个通过卷积神经网络实现图像压缩重构的方法真实的效果非常好!赞叹!复现整个论文代码的过程也非常有趣!

    展开全文
  • 系统采用DE1-SoC开发板,在FPGA中设计了D5M摄像头、SDRAM、VGA的IP核,在QSYS中利用AXI和Avalon总线连接IP核,利用Linux C编程在HPS中实现了图像压缩感知(CS)编码和传输,在MATLAB上位机中接收压缩数据并实现图像...
  • 本文提出了一种计算有效的算法,用于使用二级总变化量(HDTV2)正则化进行图像压缩感测重建。 首先,推导出HDTV2功能的优选等同的公式,其可以被公式化为在频谱分解框架下的二阶图像导数的加权L-1-L-2混合范数。 ...
  • 该存储库包含标题为“用于图像压缩感知的深度学习稀疏三元投影”的论文的源代码。 先决条件 - Tensorflow - Numpy - h5py - opencv (cv2) 该代码已经在Ubuntu 14.04和MacOSX中进行了测试, - Tensorflow v.1.2.1...
  • 为了克服传统的压缩感知重构中正交小波方向选择性差的局限性,针对图像信号方向性决定了需要 在不同纹理区域选择滤波器以使变换后信号能量更加稀疏,提出一种基于自适应方向提升稀疏表示的重构方法。 重构时,...
  • 本文提出了一种混合一阶和二阶总变化量混合模型,用于从有限数量的噪声压缩样本中重建图像。 受主要化-最小化方案的启发,我们开发了一种有效的算法,通过依次最小化二次代理惩罚的序列来寻求所提出模型的最佳解决...
  • 压缩感知框架下的图像重建

空空如也

空空如也

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

图像压缩感知