2014-06-07 10:46:19 zhuangxiaobin 阅读数 2437
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29985 人正在学习 去看看 张中强

这是利用数学算法,进行高难度图像处理的一个例子。事实上,图像处理的数学算法,已经发展到令人叹为观止的地步。

Scriptol列出了几种神奇的图像处理算法,让我们一起来看一下。

一、像素图生成向量图的算法

数字时代早期的图片,分辨率很低。尤其是一些电子游戏的图片,放大后就是一个个像素方块。Depixelizing算法可以让低分辨率的像素图转化为高质量的向量图。

二、黑白图片的着色算法

让老照片自动变成彩色的算法

三、消除阴影的算法

不留痕迹地去掉照片上某件东西的阴影的算法

四、HDR照片的算法

  

 

 

 

所谓"HDR照片",就是扩大亮部与暗部的对比效果,亮的地方变得非常亮,暗的地方变得非常暗,亮暗部的细节都很明显。

实现HDR的软件有很多,这里推荐G'MIC。它是GIMP图像编辑软件的一个插件,代码全部开源。

五、消除杂物的算法

所谓"消除杂物",就是在照片上划出一块区域,然后用背景自动填补。Resynthesizer可以做到这一点,它也是GIMP的一个插件。

六、自动合成照片的算法

根据一张草图,选择原始照片,然后把它们合成在一起,生成新照片。这是清华大学的科研成果

七、美容算法

自动对容貌进行"美化"的算法

 

转载自:http://www.ruanyifeng.com/blog/2011/08/amazing_algorithms_of_image_processing.html

2019-05-21 14:31:19 jiangsgyx 阅读数 210
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29985 人正在学习 去看看 张中强

基本原理

该算法的核心为大气退化模型,亮点为暗原色先验理论的局部应用

具体计算公式如下,

其中,I(x)表示退化图像,J(x)为原始图像,t(x)为透射率图像,A为全球大气光成分。

由此可知,去雾的过程便是在已知退化图像(有雾图像)的情况下,利用上述公式,反向推导原始图像的过程。

具体推导如下,

暗通道图的计算方法

通过计算某个像素邻域范围内的最小值(最小分量值),生成暗通道图。

具体计算公式如下,

A值的计算方法

  1. 从暗通道图中按照亮度的大小,取前0.1%的像素。
  2. 选取这些像素在退化图像I(x)中对应的点的最大亮度值作为A值。

透射率图t(x)的计算方法

假设,在当前像素的某个邻域大小范围内,有较大概率会出现暗原色中低通道值等于0的情况,

该假设与邻域窗口的尺寸具有相关性。

在实际生活中,造成暗原色中存在低通道值的因素主要有:

a) 汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;

b) 色彩鲜艳的物体或表面,在RGB的三个通道中某个通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面);

c) 颜色较暗的物体或者表面,例如灰暗色的树干和石头。

总之,自然景物中到处都是阴影或者彩色,这些景物的图像的暗原色总是很灰暗的。

利用该先验假设条件,可以推导出如下结果,

 

算法的改进方向

可以使用导向滤波(Guide Filter)获取更为精细的透射率图t(x)。

2016-04-12 22:50:52 k_shmily 阅读数 3089
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29985 人正在学习 去看看 张中强

本文转自:http://www.wtoutiao.com/p/17bqT6G.html

图像处理知识库:http://www.wtoutiao.com/author/imageKB.html


导读

图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。

Scriptol列出了几种神奇的图像处理算法,让我们一起来看一下。

http://www.scriptol.com/programming/graphic-algorithms.php

一、像素图生成向量图的算法

数字时代早期的图片,分辨率很低。尤其是一些电子游戏的图片,放大后就是一个个像素方块。Depixelizing算法可以让低分辨率的像素图转化为高质量的向量图。

http://research.microsoft.com/en-us/um/people/kopf/pixelart/

上面的图就是像素图和转换后的向量图,可见,生成的向量图/矢量图的效果更好

像素图,也就是我们通常讲的1280*720什么的,就是每行多少个像素,每列多少个像素图片的像素数越多,颜色就越连贯美,图像就越清晰。这种图片被实际广泛应用于1990年代中期以前所有的电脑和电子游戏。另外,较老的桌面环境里的图标、小显示屏设备例如手机,都应用这类图片。由于那时的硬件条件限制,美工们被强迫用只有很少颜色分类的画板作图,并且要机械地手工设定每个像素的位置,而不是从更高分辨率作品自动缩放。

这些像素图实际上成为了一整代人的文化符号,如今虽然已经很少出现,但是由于每个像素手工布局使得每个像素都承载丰富的意义,是值得怀念的,情怀啊。如果能够将其重现至现在的各个分辨率的电子设备,岂不是也是一种乐趣?

这就引出了另外一种图:矢量图,也称为面向对象的图像或绘图图像。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,具有颜色、形状、轮廓、大小和位置等属性。

也就是说,矢量图是由很多独立的图像拼接起来的。放大后图像不会失真,和分辨率无关。

我们平常拍摄的图像,如果放大就会模糊。而一些条码里面的文字,logo打印出来的图像非常大,仍然非常清晰,就是因为我们拍摄的图像是位图,而一些设计出来的图像是矢量图。需要说明的是,矢量图只能通过软件设计来生成,因为设备拍照获取的图像是一个整体,不可能是相互独立分离的一些元素拼接成一幅图像。

矢量图是通过多个对象的组合生成的,对其中的每一个对象的纪录方式,都是以数学函数来实现的,也就是说,矢量图实际上并不是象位图那样纪录画面上每一点的信息,而是纪录了元素形状及颜色的算法,

当你打开一幅矢量图的时候,软件对图形象对应的函数进行运算,将运算结果[图形的形状和颜色]显示给你看。无论显示画面是大还是小,画面上的对象对应的算法是不变的,所以,即使对画面进行倍数相当大的缩放,其显示效果仍然相同[不失真]。

矢量图的主要格式有EPS,CDR,WMF,emf等,通常用到的jpg,bmp,png通通不是矢量图,而写论文杂志社肯定是要求矢量图的。


换言之:你只要知道矢量图可以任意放大,不变色,不模糊就行了。而位图是由无数的色彩点组成的图案,当被无限放大时会看到一块一块的像素色块,效果会失真。

   那怎么从像素图导出一张光滑、与分辨率无关的矢量图,它可以任意放大而不会失真。先来看看效果吧,就是这样的。有没有觉得很神奇?其实原理就一句话,检测边界并曲线拟合,但是过程是非常具有挑战性的。


此处简要介绍一下算法的原理,结合例子来简要说明,特意将英文子图说明注释保留。


上图从左至右就是基本的流程,中间四幅图展现的是放大的耳朵部位。有几个部分需要注意:

1 保留有意义的像素。当有些像素与周围像素的颜色信息不同时,它是图像的典型特征,需要保留,如找出图中的耳朵部位。

2 区分需要进行连续处理的部分,与不需要进行连续处理的部分。如图嘴巴是不需要进行连续处理的,要保持波动。而脑袋的轮廓需要进行连续光滑处理。

3 区分哪些相似像素应该被联系起来,哪些不需要。如图嘴巴处,考虑2*2四个像素,比如嘴巴部位下面的四个像素,红色应该被连接起来构成特征曲线的部分,而白色不应该。(具体是采用启发的方法,过于复杂不提)

解决了上面的问题后,就得到了一些线条,对这些线条进行样条插值可以得到最终的结果。(中间省略N多技术难题)。

二、黑白图片的着色算法

让老照片自动变成彩色的算法

http://www.cs.huji.ac.il/~yweiss/Colorization/index.html

当年一张黑白照片就珍贵的不行,现在手机拍出来的都是高清彩色图了。

好吧,那就当那当年的黑白图片,重新着个色可好?《Colorization using Optimization》。

该文章基于最简单的原理,那就是灰度值差不多的像素,应该具有差不多的颜色。既然在灰度空间相似,在彩色空间也应该相似。





有没有觉得很神奇,几乎是全自动的,用户只需要一些很简单的交互,就能将各个区域分割开来,然后分别上色。

比如下图,在需要上相同颜色的区域,用相同的笔触简要画出,就能识别各个区域,然后分别上色,毫无失真感有没有?!

当然,如果将各个区域平滑地分割出去,避免出现不连续的颜色边界,是问题的难点。那是图像分割的问题,堪称图像处理领域最难的几个方向之一。

三、图像自动合成

可以把许多图自动拼接成一幅图:《Sketch2Photo: Internet Image Montage》,绝逼的黑科技。

根据一张草图,选择原始照片,然后把它们合成在一起,生成新照片。这是清华大学的科研成果

http://cg.cs.tsinghua.edu.cn/montage/main.htm

四、消除阴影的算法

不留痕迹地去掉照片上某件东西的阴影的算法

Pyramid-Based Shadow Removal

http://www.cs.huji.ac.il/~danix/ShadowRemoval/index.html

五、HDR照片的算法

所谓"HDR照片",就是扩大亮部与暗部的对比效果,亮的地方变得非常亮,暗的地方变得非常暗,亮暗部的细节都很明显。

实现HDR的软件有很多,这里推荐G'MIC。它是GIMP图像编辑软件的一个插件,代码全部开源。

http://gmic.sourceforge.net/

六、消除杂物的算法

所谓"消除杂物",就是在照片上划出一块区域,然后用背景自动填补。Resynthesizer可以做到这一点,它也是GIMP的一个插件。

http://www.logarithmic.net/pfh/resynthesizer

七、美颜的算法

自动对容貌进行"美化"的算法

http://www.leyvand.com/beautification2008/


2019-05-21 10:46:45 qq_26967067 阅读数 347
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29985 人正在学习 去看看 张中强


“关于”Lena美女图像

在图像处理、计算机视觉领域,Lena数字图像被大多数的键盘侠广泛使用,Lena可以说是一张司空见惯的标准图。

国外某期刊的主编,曾经说明过以下原因:1.Lena图像混合了各种细节、纹理特征、平滑区域和阴影部分,能够很好的测试图像处理的各种算法;2.Lena是个迷人的美女,做图像处理的研究者或工程师,大部分都是男的,不奇怪他们被Lena美女所吸引。

可以想象,各位Coder每天的工作是多么的烦躁,能够顺便的看看Lena无疑是有效的放松。

或者说,996可以接受,但是,工作的心情一定要愉悦!

更多的关于Lena图像背后的故事,或是完整版的Lena美女(国外某杂志的封面),各位老铁可以自行了解,相信大家会有别样的收获。

图像处理界的不完整版的Lena标准图如下:
在这里插入图片描述

本次Demo目的及实现功能

有一帧,分辨率是800*600大小的Lena静态图像,存储/缓冲在ARM的DDR内存上,

FPGA的VDMA需要访问这块内存,“搬运”ARM的Lena美女到FPGA,然后根据视频时序要求,送至FPGA的HDMI接口,完成图像信号的“差分转换”并显示出来。

HDMI接口的佛系介绍

支持视频、图像传输的接口协议,通常有HDMI、DVI和VGA,其中的高清晰度多媒体接口HDMI(High Definition Multimedia Interface)是现在比较流行的,最新的HDMI协议已经支持4K的分辨率(比如,4k超高清的家庭电视)。不过,Coder或者FPGAer,平时最常用的,应该还是19201080、12801024,800*600等分辨率。

HDMI接口协议包括两个部分:编码端(板子)和解码端(电脑显示器),如下图所示,每个部分都有四个相互独立的通道(RGB三个数据通道和一个clock时钟通道),每个独立的通道,传输的都是TMDS差分信号。

在这里插入图片描述
由于HDMI传输的信号是数字化的(VGA是模拟信号),而且,HDMI接口通常是跟ZYNQ的FPGA相连的(高速),所以,在板子没有HDMI驱动芯片的情况下,可以在FPGA内部使用Verilog实现HDMI传输协议(VGA通常要使用外部的驱动芯片),或者调用第三方公司的软核IP,比如Digilent公司的rgb2dvi,rgb2dvi直接封装好了HDMI接口协议,支持RGB888或者其他颜色空间的图像信号,到HDMI协议所要求的TMDS差分信号的转换,如下图所示:

在这里插入图片描述

软核VDMA的佛系介绍

XILINX公司的VDMA(Video DMA)是一个专门的在ZYNQ内部(FPGA、ARM之间)搬运视频、图像等“大数据”的软核IP,刚好封装了AXI的三种协议,VDMA框图如下:
在这里插入图片描述
从VDMA框图可以看出,其内部包括了控制寄存器、状态寄存器、数据搬运和行缓冲等模块,以及顶层的AXI4-Lite、AXI-Stream和AXI4等通信协议。

ARM可以通过顶层的AXI-Lite协议完成VDMA内部的控制寄存器、状态寄存器的配置和访问,通过配置寄存器可以指定,数据搬运模块具体如何工作,数据搬运的过程需要经过行缓冲模块进行缓存;

AXI-Stream流协议,完成VDMA与其他的外部IP(比如FPGA的摄像头、HLS IP等)的数据流通信,换言之,只有在FPGA这个PL端,才有“流”的说法;

AXI4协议负责VDMA读写DDR的操作(ARM),所以VDMA在FPGA和ARM之间搬运视频图像数据,实际上是AXI4这个子协议完成的,而AXI-Stream负责在PL端的VDMA与其他FPGA模块的数据流通信。

所以,也有前辈说过,ZYNQ视频图像处理系统,VDMA是必须的。

但菜鸟个人认为,如果不考虑数据通信的效率问题,这不是必须的,因为可以在HLS IP添加一个M-AXIS(Master)接口,然后整个HLS IP直接的连到ZYNQ的HP口进行DDR的访问,只是自定义的HLS IP未必有VDMA高效(VDMA实际是二维的DMA)。

介绍完VDMA的框图,下面介绍VDMA内部的寄存器:

VDMA内部的偏移地址,映射列表如下图,分为MM2S读通道和S2MM写通道两组寄存器:
在这里插入图片描述
偏移地址00h、30h:MM2S、S2MM读写通道的控制寄存器(稍后详细介绍);

偏移地址04h、34h:MM2S、S2MM读写通道的状态寄存器,ARM应用程序通过访问这个寄存器,可以获取VDMA的工作状态,比如通道是否启动、通道是否响应每次传输的中断、帧延时和帧计数等中断;

偏移地址5Ch至98h、ACh至E8h:分别配置MM2S、S2MM读写通道的每一帧缓存的起始地址,需要根据VIVADO例化VDMA IP的时候,指定的缓存帧数进行软件上的配置(比如,VDMA常用的是1帧或3帧缓存);

偏移地址50h、A0h:分别配置MM2S、S2MM读写通道的垂直方向尺寸,即指定传输的图像实际高度(行数),这个寄存器一般在最后一步进行配置,以便启动整个通道的传输;

偏移地址54h、A4h:分别配置MM2S、S2MM读写通道的水平方向尺寸,但它不是指定传输的图像实际宽度(列数),它指定的是每一行需要传输多少个字节的数据,比如640*3,图像每行的宽度是640列,每个像素占用3个字节的内存;

偏移地址58h、A8h:分别配置MM2S、S2MM读写通道的跨度,即指定每两行的第一个像素之间在内存上间隔多少个数据。比如,当前分辨率下的图像,每一行实际有6403个字节,待传输显示。但考虑程序的通用性,有可能使用宏定义指定了不同的显示分辨率下,都是19203固定大小的跨度;

下面“详细”介绍前面提到的控制寄存器(00h、30h):

考虑到MM2S、S2MM读写通道是独立的,互不影响,下面选择MM2S通道的控制寄存器进行“详细”的介绍(S2MM通道是同样的道理):

如下图,是VDMA读通道的控制寄存器,该寄存器用于控制整个VDMA的运行方式,包括复位、时钟使能(锁相/动态锁相)、帧缓存的切换模式、VDMA的读/写通道的启动等等。
在这里插入图片描述
下面对低4位的作用进行介绍,低4位也是最常用的最重要的(其他比特位的作用,可以参阅pg020官方文档)。

低0位,控制VDMA读/写通道的运行和停止,其中,赋值1表示运行,赋值0表示停止;

低1位,控制帧缓存的切换模式,其中,赋值1表示循环的切换显示(比如内存上有3帧的缓存);赋值0表示,一直停留在XSDK的应用程序所指定的当前帧,进行“搬运”和HDMI显示;

低2位,控制读/写通道的复位,其中,赋值1表示高电平复位有效,所以在VDMA正常工作的情况下,低2位要赋值为低电平;

低3位,控制时钟使能是否有效,其中,赋值1表示使能/开启当前模式的时钟,比如锁相同步模式或者动态锁相同步模式。

具体的关于时钟同步模式的介绍,可以通过DocNav工具查阅官方文档pg020,page38-42的页码。更多的关于其他寄存器的作用介绍,也可以参阅pg020

软核Video Timing Controller

Video Timing Controller,XILINX提供的视频时序控制器,支持AXI-Lite接口协议,即支持ARM对内部寄存器的动态配置。一般是在HDMI显示输出的分辨率,需要动态改变的情况下才使用AXI-Lite接口。比如,XSDK的应用程序每隔半分钟,改变HDMI显示输出的图像大小,这就要求视频时序随之改变,这时候就需要在VIVADO使能这个AXI-Lite控制接口了,如下图:

在这里插入图片描述
如果在应用程序,不需要动态的改变图像显示的分辨率大小,这时候可以不勾选“Include AXI4-Lite Interface”,直接选择某个常见的视频模式,如下图的800*600p,它会自动的配置好,符合HDMI协议的参数(行、场同步;行、场前消隐;行、场后消隐的像素时钟个数):
在这里插入图片描述

软核AXI4-Stream to Video Out

在前面的介绍,知道了,PL端调用rgb2dvi这个现成的IP,可以完成RGB888或其他颜色空间/数据格式的图像信号,到HDMI显示器的TMDS差分信号的输出。

前面也介绍了,VDMA通过AXI4协议,从ARM/PS的DDR搬运的帧图像数据,最终是以“流”的格式与PL端的其他模块进行通信的。

所以,这时候就需要一个“中介”,完成VDMA输出的AXI-Stream流格式的图像、视频到rgb2dvi所要求的RGB888图像格式的转换。如下图所示,XILINX直接提供了现成的软核AXI4-Stream to Video Out,完成上述的AXIS到RGB的格式转换。
在这里插入图片描述
上图的aclk是AXI-Stream流协议的时钟输入,vid_io_out_clk是这个软核输出每帧RGB图像的时钟来源

下面详细的介绍,配置软核AXI4-Stream to Video Out的Clock Mode和Timing Mode这两个参数的作用:

软核的Clock Mode,可以理解为aclk与vid_io_out_clk两个时钟的来源,是否直接共用AXI-Stream流协议的时钟aclk。一般不选择Common共用,选择的是Independent模式。

因为完成HDMI差分转换的rgb2dvi软核,它的输入时钟就是像素时钟。Independent模式下,软核AXI4-Stream to Video Out的vid_io_out_clk时钟,可以直接的连接到,整个ZYNQ系统的像素时钟,以保证AXIS到RGB输出,再到HDMI显示的同步。

软核的Timing Mode,有Slave、Master模式的选择,一般是“根据”视频时序控制器Video Timing Controller的配置,进行主从模式的选择。

比如,Video Timing Controller配置了AXI-LITE接口,这意味着,可以在应用程序动态的改变视频时序(根据不同的显示分辨率),那么这时候,软核的Timing Mode选择Slave模式。

如果Video Timing Controller没有配置AXI-LITE接口,意味着,图像输出的是固定的分辨率,视频时序也就是固定的了,那么Timing Mode可以选择Master模式,这表示Video Timing Controller的运行,可以完全的脱离AXI4-Stream to Video Out。

软核Clocking Wizard

相信每一位亲爱的FPGAer,对这个IP并不陌生。它就是一个时钟管理模块,或是一个锁相环,可以输出倍频、分频、单端转差分的时钟,等等。所以,不一定是图像处理,包括在信号处理和通信领域,clocking wizard应该是用的比较频繁的一个IP。

本次Demo显示的静态图像,分辨率大小是800600,可以计算出所需要的像素时钟40MHz,可以由ZYNQ IP输出100Mhz的时钟到clocking wizard的输入端,经过内部的配置转换之后,得到像素时钟以及HDMI编码要用到的串行时钟(405=200MHz)的输出,配置如下图所示:

在这里插入图片描述
在这里插入图片描述
同时,40MHz的像素时钟也可以连接到前面介绍的Video Timing Controller、AXI4-Stream to Video Out和rgb2dvi等软核,以保证HDMI显示的“同步”。

当然了,这是在显示分辨率固定不变的情况下,配置的像素时钟和串行时钟输出,如果Video Timing Controller配置了AXI-lite接口,XSDK的应用程序也正好需要,改变HDMI输出的图像分辨率的时候,这就要求像素时钟随之改变了。

这时候,比较笨的方法,就是在VIVADO改变ZYNQ的块设计工程,重新的配置clocking wizard的时钟输出。

显然,这是一种低效的行为,比较科学的省时间的方法,应该是在最开始设计VIVADO工程的时候,调用支持动态配置的时钟IP(下次Demo再详细介绍)。

VIVADO搭建静态图像通路

在VIVADO工具,调用、例化上述的IP,最终的工程设计如下图:
在这里插入图片描述

XSDK编写Demo应用程序

导出硬件比特流之后,在XSDK编写应用的驱动程序,如下图:
在这里插入图片描述

Demo实验现象

ZYNQ板子供电之后,下载应用程序,测试结果如下图:



Others

更多详细介绍,关注公众号:

在这里插入图片描述

2019-09-29 21:30:44 m0_37763336 阅读数 66
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29985 人正在学习 去看看 张中强

 

前言:为什么图像处理学习最常用的图片是Lena?

标题

参考[1] 。Lena Söderberg 是瑞典模特,最初出现在《花花公子》1972年11月期的杂志中,原图是一张裸体图片(这并不是重点!!!)。其实还有一些原因[2]:

首先,Lenna图像包含了各种细节、平滑区域、阴影和纹理,这些对测试各种图像处理算法很有用。它是一副很好的测试图像!第二,图像处理工作的人都是些什么样的家伙大家都知道,看看Github被称为“全球最大的同性交友网站”就知道开发人员占比了。

2、MATLAB2018a安装

2.1 MATLAB环境配置

        MATLAB作为一种强大的数学计算软件,应用的领域也随着Tools的增加而逐步扩大,甚至有些工具包还会独立出来做成软件。而MATLAB的软件也日渐膨胀。目前最新版的MATLAB2019a已经支持深度学习相关的算法了,甚至在APP里面还有视频图像自动标签的功能。

        但是MATLAB的安装还是传统的套路,没什么坑。这里附上安装教程:

        https://www.cnblogs.com/shenxiaolin/p/9129618.html

        https://jingyan.baidu.com/article/0a52e3f4e3a8a7bf62ed72f0.html

        注意自己电脑系统的位数和MATLAB的相匹配,即64位的系统,安装64位的MATLAB。

2.2 MATLAB 读显图片

        上一章我们讲到,MATLAB中,图像的存储方式是以矩阵存储的,实际上,对图像的操作就是矩阵运算过程。MATLAB的绘制图片,都是描点的方式(描点绘图在中学就学过)。

这里一定要注意的是,你的工作空间,也就是左侧那个当前文件夹里面一定要有你要处理的图片,或者说一定要切换到工作目录下面。

clear    % 清除工作空间变量,防止变量互相干扰
clc      % 清空命令行
I = imread('lena.jpg');      % 读取当前目录下的lena.jpg图片,返回值为矩阵I
imshow(I)

        可以看到右侧工作区的变量 I 为512*512*3的矩阵,实际上存储的是RGB三个通道的数据,每个通道分别为512*512像素。如果我们想要查看各个通道的情况,可以直接imshow这些通道:

subplot(3,1,1);     % 绘制图片
imshow(I(:,:,1))    % 显示红色通道
title('红色分布情况');
subplot(3,1,2);
imshow(I(:,:,2));   % 绿色通道
title('绿色分布情况');
subplot(3,1,3);
imshow(I(:,:,3));   % 蓝色通道
title('蓝色分布情况');

所以,知道为什么选择这副图像了吧!!!

3、OpenCV+VS2013环境配置

3.1、OpenCV + VS2013 + Windows 10环境配置

VS2013的安装:https://jingyan.baidu.com/article/ab0b56305e8883c15bfa7d7a.html

正常配置,安装默认组件即可,无坑。但是要注意路径问题,不要含有中文名称,不要含有空格

VS2013+OpenCV的配置:http://blog.chinaaet.com/crazybird/p/5100054053

这里可能会有很多的坑,最常出现的就是我总结了以下几点配置时会遇到的问题:

(1)OpenCV 版本:OpenCV的版本和VS2013版本是有匹配关系的,这个一定要注意,尤其是OpenCV下的 *\opencv\build\x64\ 目录下面会有  vc10,vc11,vc12,vc14......

这些目录的匹配关系如下表:

OpenCV和VS的对应关系
*\opencv\build\x64\ 对应的Visual Stdio 
vc10 VS2010
vc11 VS2012
vc12 VS2013

具体的版本对应,还要自己找。

(2)环境变量的设置:环境变量本身是一个文件夹所在的路径,不同的博客上面会有不同的定义方式,但无非就是$符和绝对路径的区别,仔细观察就行。环境变量添加的时候看你要添加的是X86还是X64。如果你选择了X64,就一直下去。

这里一定要注意你到底配置的是X86机器还是X64机器,一定要注意这个问题!!!!!!!

(3)需要注意的事项:VS中需要配置的项目

这里一定要注意你到底配置的是X86机器还是X64机器,一定要注意这个问题!!!!!!!

       默认情况下是32位机器,即属性 Win32,如果你需要修改编译器,那么一定要先修改成X64,这时候对应的属性管理器也会不同。

假设我们设置的是X64机器。则

a. 属性管理器双击的是 Debug | x64 下面的 Microsoft.Cpp.x64.user

b. 后面的配置均在这个下面。

3.2、OpenCV图像读显

搞了一下午,终于弄完了。

另一个注意事项:工作目录是项目名目录!!!!

在VS生成项目时,会生成如下文件,第一个文件夹就是你的工作目录,如果还记得MATLAB的那部分,大家就知道这个问题的重要性了。

生成的项目目录
图片应放在这里

以下为图像的读取和显示测试代码

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
	Mat img = imread("test.jpg"); //  载入一张图片
	imshow("test", img);         //  在窗口中显示载入的图片
	waitKey();                      //  等待按键按下退出
	return 0;
}

 结果:

 

4、Python3 及图像相关模块配置

       为什么要推荐大家用 Python3 ?

       因为Python官网说:2020年将不再维护 Python2  !!!!!!

        python的环境配置就不说了,因为比较简单,并且基本不会遇到坑。

        目前主流的Python环境是 Anaconda 、Pychram、Python IDLE、Jupyter.

4.1 PIL 库和 matplotlib 介绍

PIL可以做很多和图像处理相关的事情[3]:

  • 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
  • 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
  • 图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。

Matplotlib 则是受到MATLAB的启发,并且完全仿照MATLAB的函数形式的绘图接口。

当然,Python也可以使用Opencv的方式来处理图像。

4.2、图像的读取与显示

这里我基于Ananconda下的Spyder来做图像处理。

# -*- coding: utf-8 -*-

from PIL import Image          # 导入PIL库
im = Image.open('test.jpg');   # 读取图片
bands = im.getbands()          # 显示该图像的所有通道
im.show()                      # 显示图像

显示结果

 这里是需要一个图片查看工具的。

参考

[1] https://cloud.tencent.com/developer/news/324419

[2] https://baike.baidu.com/item/%E8%8E%B1%E5%A8%9C%C2%B7%E7%91%9F%E5%BE%B7%E8%B4%9D%E9%87%8C/10916076?fr=aladdin

[3] https://www.cnblogs.com/lyrichu/p/9124504.html

[4] https://www.jianshu.com/p/da385a35f68d

没有更多推荐了,返回首页