显示标签为“数字图像处理”的博文。显示所有博文
显示标签为“数字图像处理”的博文。显示所有博文

2015年5月11日星期一

使用Emgu CV不要忘记加入OpenCV Libs

记录一个小经验。使用的是Emgu CV 2.410版本,如果编译CameraCapture这样的小程序,我们需要Emgu.CV.dll,Emgu.CV.UI.dll和Emgu.Util.dll加入Project的Reference中去。这样就可以执行这个小程序。



有时候在VS2012中运行编译后的程序有可能会出现上图所示这个问题,可能的原因 1. 没有OpenCV Libs,如果编译成x86,我们就需要把x86的目录放入Debug和Build生成exe的文件夹里面,可以x86这个文件夹从C:\Emgu\bin里面找到。2 也有可能设置Debug和Build的路径问题,只需要确认是否正确设置就可以了。

2014年9月8日星期一

OpenCV放大或者缩小图像的速度

使用OpenCV放大或者缩小图像,我们比较熟悉的是下面的function:
cv::resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )¶
http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html
关于它的Interpolation method(插值方法),其中:

INTER_NEAREST 最近邻插值,是最快的method并且创建blocky images并选择1个pixel去替代几个pixels,这样做得到图像的结果效果比较差。
INTER_AREA 也是一个快速计算方法,它取几个pixels的平均值,所以它比较适合缩小图像,而不是放大图像。
INTER_LINEAR 使用双线性的插值去改变图像尺寸,组成几个pixels在一起(在很多情况下是比较好的选择,但是计算速度比较慢)。
INTER_CUBIC 使用的是双三次的插值,但是计算机量比较大,所以运行速度慢,而且有时候结果看起来比较好,有时候比较差。

非常简单地,不完全正确地说,在速度上:
INTER_NEAREST > INTER_AREA > INTER_LINEAR > INTER_CUBIC
但是放大或者缩小图像后的效果上一般而言INTER_LINEAR是相对最好的。

其实,也可以使用Opencv的cv::pyrUp(使用Gaussian 金字塔分解对输入图像向上采样)和cv::pyrDown(使用 Gaussian金字塔分解对输入图像向下采样),关于使用这两个function去放大或者缩小图像,具体信息可查阅下面链接:
http://docs.opencv.org/doc/tutorials/imgproc/pyramids/pyramids.html
但是cv::pyrUp和cv::pyrDown的运算速度其实也并不高。

2014年9月7日星期日

libVLC进行memory stream延迟问题

最近我使用libVLC进行在server端进行memory stream,出现了一个问题,client端得到的视频有7秒的延迟。类似以下帖子提到的问题:
http://stackoverflow.com/questions/19604815/main-input-error-and-delays-when-libvlc-stream-images-in-memory

为了找到错误我打开以下的参数:
"--verbose=2", // Be much more verbose then normal for debugging purpose
这样可以得到更多的debug信息。
我得到这样的信息:main warning: late buffer for mux input

经过查阅发现,正确的解决方法就是,在transcode里设置venc=x264{preset=ultrafast,tune=zerolatency}这样的参数:

sprintf(smem_options_transcode,"#transcode{venc=x264{preset=ultrafast,tune=zerolatency},acodec=none}:rtp{mux=ts,dst=127.0.0.1,port=5004}");

这样延迟可以控制在3秒以内,当然了,可以使用其他的方法进一步减少延迟,譬如在client端减少caching的数值等等。

解决方法参考:
https://forum.videolan.org/viewtopic.php?f=4&t=95364

2012年2月14日星期二

图像Preprocessing使用FPGA, CPU, GPU

很久没有写“数字图像处理”系列的文章,今天非常简单的介绍一下Preprocessing使用FPGA, CPU, GPU的效能。

几乎所有的标准的Preprocessing函数都可以归入以下5个主要的类别中:

  • Pixel operations: (in)homogeneous
  • Histogram or LUT based functions
  • Neighbor operations
  • Random access operations
  • Geometrical transformations

Performance(效能)是我们这里所关心的,不同的architectures(架构)适用于不同的operations(运算),例如下表所示:

Operation CPU GPU FPGA
Pixel + ++ ++
Histogram / LUT ++ - ++
Neighbor / Kernel - ++ ++
Random Access ++ - -
Geometrical Transformations + ++ -
Architecture SISD SIMD SIMD MISD

2011年2月10日星期四

数字图像处理笔记(2)

继续记录Digital Image Processing一些重要的概念,关于图像解析度,以实用知识为主。

逐行扫描(Progressive scan):每一帧图像由电子束顺序地一行接着一行连续扫描而成,这种扫描方式称为逐行扫描。
隔行扫描(Interlaced scan):每一帧图像通过两场扫描完成则是隔行扫描,两场扫描中,第一场(奇数场)只扫描奇数行,而第二场(偶数场)只扫描偶数行。隔行扫描技术在传送信号带宽不够的情况下起了很大作用,逐行扫描和隔行扫描的显示效果主要区别在稳定性上面,隔行扫描的行间闪烁比较明显,逐行扫描克服了隔行扫描的缺点,画面平滑自然无闪烁。在电视的标准显示模式中,i表示隔行扫描,p表示逐行扫描。[1]

 

有用小常识:
a) 视觉惰性(视觉暂留特性):每秒换帧24次,人会产生连续感。
b) 图像的闪烁感:人在较低频率的光脉冲刺激下,会产生一明一暗的闪烁感,这是有光和无光在亮度感觉上的差别所致。把闪烁的频率提高到临界闪烁频率(45.8Hz)以上,由于视觉惰性的作用就感觉不到闪烁了。电影的帧频为24,其实也写成24p(电影胶片),利用光活门,使每帧画面闪亮两次,达到每秒闪亮48次,超过临界闪烁频率。
c) 场频率:如使用隔行扫描,就会有场频率一说,就是一帧图像分两场传输,常见的60Hz,50Hz对应的帧频率就是30,25。
d) 我们常见的1080i50就是1920×1080像素,每秒50个场的速度交织编码(25帧)[3]。
e) PAL和NTSC
50i(PAL):全名为逐行倒相 (Phase Alternating Line)。每秒25帧,隔行扫描的电视广播格式。[4]
60i(NTSC):属于同时制,每秒60/1.001场。但存在相位容易失真、色彩不太稳定的缺点。NTSC标准的帧幅为每秒30帧。[5]
f) 数字电视,传统的PAL和NTSC陆续被淘汰,取而代之的是数字电视,数字电视其实就是将画面信号经数位化处理后,变成一串数据资料,再经数位调变传送到家。
简单的说,数字电视的成功,主因是视频压缩技术的发展。国际统一的压缩标准是MPEG-2,在传统无线电视台600万赫兹频宽的电视频道中,可传送1080条水平扫描线的高画质电视(HDTV高清晰度电视)。它同时也提供杜比的AC3级高级音响效果。

 

高清的播放分辨率有 3 种:
768i (i 表示隔行扫描)
1080i(i 表示隔行扫描)
1080p(P 表示逐行扫描)

 

HDTV高清晰度电视(High Definition Television)的扫描格式共有 3 种[2]:
1280×720p
1920×1080i
1920×1080p
中国采用的 1920×1080i/50Hz。
全高清分辨率为1920×1080的高清信号。

例如,不做任何压缩:
高清640*480的彩色图像,每秒30帧,则一秒钟的数据量为:
640*480*24*30 = 221.12 M
NTSC视频信号720*480,每秒30帧,则一秒钟的数据量为:
720*480*24*30 = 248.83 M
高清1920x1080的彩色图像,每秒30帧,则一秒钟的数据量为:
1920*1080*24*30 = 1492992000 bit =  1.5 G
-->
必须对视频信号进行编码压缩[2]。

 

注意,我们有可能搞混的是
a)在描述数据传输时的计算如下(In some cases when used to describe data transfer rates bits/bytes are calculated as in the metric system as follows):
1 MB = 1,000,000 bits/bytes
1 kb = 1,000 bits/bytes
1 bit/byte

b)在描述数据储存是的计算如下(In the cases when used to describe data storage bits/bytes are calculated as follows):
1 byte = 8 bits
1 kilobyte (K / Kb) = 2^10 bytes = 1,024 bytes
1 megabyte (M / MB) = 2^20 bytes = 1,048,576 bytes
1 gigabyte (G / GB) = 2^30 bytes = 1,073,741,824 bytes
1 terabyte (T / TB) = 2^40 bytes = 1,099,511,627,776 bytes
1 petabyte (P / PB) = 2^50 bytes = 1,125,899,906,842,624 bytes
1 exabyte (E / EB) = 2^60 bytes = 1,152,921,504,606,846,976 bytes

附注:在数据通信中, 1 kilobit 是 1000 bits。它通常用于测量是在一秒钟两个通信点之间传输的数据量。千比特每秒,通常缩写为Kbps。

 

下一篇笔记将关于,数据冗余,编码压缩。

 

参考资料:
[1] 逐行扫描与隔行扫描: http://baike.baidu.com/view/115294.htm
[2] 数字图像处理(第2版),Rafael C.Gonzalez / Richard E.Woods,电子工业出版社
[3] 高清晰度电视: http://zh.wikipedia.org/zh-cn/高清晰度电视
[4] PAL制式:http://zh.wikipedia.org/zh/PAL制式
[5] NTSC制式:http://zh.wikipedia.org/zh/NTSC制式

2011年2月8日星期二

数字图像处理笔记(1)

最近的一些研究涉及了数字图像处理。这里我准备开一个小小的系列,放入我最近的一些学习的笔记。


Digital Image Processing是一个很有趣的领域。接下来我按照我的喜好,记录一些重要的概念。

我们大概都知道,在计算机中,静态的图像有两种表达形式:
矢量图,vector based image
位图,bit mapped image,(位图里又有灰度图(grap scale image),彩色图(color image))

矢量图,顾名思义,也就是可以用计算机的指令来描述的,图像中的每一的元素都可以使用数学表达式来实现。所有一个矢量图会由很多的数学表达式来进行描述。我们常常使用最简单的visio就可以做矢量图,当然了adobe illustrator是一个做矢量图的利器。
矢量图有很多优点,1.可以进行不失真的缩放,2.可以容易的移动复制,甚至旋转,3.矢量图产生的数据量比较小。
矢量图的一个很明显的缺点是使用场合有所限制,因为很多复杂的图像无法使用数学表达式来描述。

位图,计算机中最广泛使用,其实就是一幅图由很多的像素(也可以说是由像素矩阵)组成的。
每一个像素pixel其实在计算机里就是由一定长度的数字值来表示它的颜色和亮度。如果单位面积内的像素越多,那么分辨率就越高,所显示的图像就会接近于真实物体。
如果图像的深度越高,或是图像的分辨率越高,那么位图的大小就越大。
色彩深度,色彩深度又叫色彩位数,即位图中要用多少个二进制位来表示每个点的颜色,是分辨率的一个重要指标,例如16位(增强色),24位和32位等。
例子:
例如一个图像,RGB三个分量,每个8位,一共就是24位,像素的深度为24,每个像素就是2的24次方就是16777216的一种,其实人是无法分辨这么多颜色的。

位图常用的编码方式有:
RGB,红、绿、蓝三原色的光学强度。
CMYK,用青、品红、黄、黑四种颜料含量来表示一种颜色

常常还有Alpha通道,也就是增加像素的透明度信息。

 

我们常常见到的图像格式有:
BMP(Bitmap Image File or Device Independent Bitmap (DIB) file format or simply a Bitmap)
GIF(Graphics Interchange Format)
PNG(Portable Network Graphics)
JPEG(Joint Photographic Experts Group),附带提一下它是基于Discrete Cosine Transform离散余弦变换,转换到频率空间,JPEG有选择地选择数据来压缩文件,会丢弃一些数据,使用是有损压缩。

参考资料:
http://zh.wikipedia.org/zh-cn/%E5%83%8F%E7%B4%A0
http://zh.wikipedia.org/zh/%E4%BD%8D%E5%9B%BE

http://zh.wikipedia.org/zh/Jpeg
http://zh.wikipedia.org/zh/Bmp
http://zh.wikipedia.org/zh/Png
http://zh.wikipedia.org/zh/GIF