2017-05-20 17:18:36 Joczu 阅读数 1755
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2091 人正在学习 去看看 贾志刚
Matlab中图像函数大全图像增强
1. 直方图均衡化的 Matlab 实现

1.1 imhist 函数
功能:计算和显示图像的色彩直方图
格式:imhist(I,n)
        imhist(X,map)
说明:imhist(I,n) 其中,n 为指定的灰度级数目,缺省值为256;imhist(X,map) 就算和显示索引色图像 X 的直方图,map 为调色板。用
stem(x,counts) 同样可以显示直方图。

1.2 imcontour 函数
功能:显示图像的等灰度值图
格式:imcontour(I,n),imcontour(I,v)
说明:n 为灰度级的个数,v 是有用户指定所选的等灰度级向量。

1.3 imadjust 函数
功能:通过直方图变换调整对比度
格式:J=imadjust(I,[low high],[bottom top],gamma)
        newmap=imadjust(map,[low high],[bottom top],gamma)
说明:J=imadjust(I,[low high],[bottom top],gamma) 其中,gamma 为校正量r,[low high] 为原图像中要变换的灰度范围,[bottom top]
指定了变换后的灰度范围;newmap=imadjust(map,[low high],[bottom top],gamma) 调整索引色图像的调色板 map 。此时若 [low high] 和
[bottom top] 都为2×3的矩阵,则分别调整 R、G、B 3个分量。

1.4 histeq 函数
功能:直方图均衡化
格式:J=histeq(I,hgram)
        J=histeq(I,n)
        [J,T]=histeq(I,...)
        newmap=histeq(X,map,hgram)
        newmap=histeq(X,map)
        [new,T]=histeq(X,...)
说明:J=histeq(I,hgram) 实现了所谓“直方图规定化”,即将原是图象 I 的直方图变换成用户指定的向量 hgram 。hgram 中的每一个元素
都在 [0,1] 中;J=histeq(I,n) 指定均衡化后的灰度级数 n ,缺省值为 64;[J,T]=histeq(I,...) 返回从能将图像 I 的灰度直方图变换成
图像 J 的直方图的变换 T ;newmap=histeq(X,map) 和 [new,T]=histeq(X,...) 是针对索引色图像调色板的直方图均衡。

2. 噪声及其噪声的 Matlab 实现
        imnoise 函数
格式:J=imnoise(I,type)
        J=imnoise(I,type,parameter)
说明:J=imnoise(I,type) 返回对图像 I 添加典型噪声后的有噪图像 J ,参数 type 和 parameter 用于确定噪声的类型和相应的参数。

3. 图像滤波的 Matlab 实现

3.1 conv2 函数
功能:计算二维卷积
格式:C=conv2(A,B)
        C=conv2(Hcol,Hrow,A)
        C=conv2(...,'shape')
说明:对于 C=conv2(A,B) ,conv2 的算矩阵 A 和 B 的卷积,若 [Ma,Na]=size(A), [Mb,Nb]=size(B), 则 size(C)=[Ma+Mb-1,Na+Nb-1];
C=conv2(Hcol,Hrow,A) 中,矩阵 A 分别与 Hcol 向量在列方向和 Hrow 向量在行方向上进行卷积;C=conv2(...,'shape') 用来指定 conv2
返回二维卷积结果部分,参数 shape 可取值如下:
        》full 为缺省值,返回二维卷积的全部结果;
        》same 返回二维卷积结果中与 A 大小相同的中间部分;
        valid 返回在卷积过程中,未使用边缘补 0 部分进行计算的卷积结果部分,当 size(A)>size(B) 时,size(C)=[Ma-Mb+1,Na-Nb+1]


3.2 conv 函数
功能:计算多维卷积
格式:与 conv2 函数相同

3.3 filter2函数
功能:计算二维线型数字滤波,它与函数 fspecial 连用
格式:Y=filter2(B,X)
        Y=filter2(B,X,'shape')
说明:对于 Y=filter2(B,X) ,filter2 使用矩阵 B 中的二维 FIR 滤波器对数据 X 进行滤波,结果 Y 是通过二维互相关计算出来的,其大
小与 X 一样;对于 Y=filter2(B,X,'shape') ,filter2 返回的 Y 是通过二维互相关计算出来的,其大小由参数 shape 确定,其取值如下

        》full 返回二维相关的全部结果,size(Y)>size(X);
        》same 返回二维互相关结果的中间部分,Y 与 X 大小相同;
        》valid 返回在二维互相关过程中,未使用边缘补 0 部分进行计算的结果部分,有 size(Y)<size(X) 。

3.4 fspecial 函数
功能:产生预定义滤波器
格式:H=fspecial(type)
        H=fspecial('gaussian',n,sigma)         高斯低通滤波器
        H=fspecial('sobel')                          Sobel 水平边缘增强滤波器
        H=fspecial('prewitt')                       Prewitt 水平边缘增强滤波器
        H=fspecial('laplacian',alpha)             近似二维拉普拉斯运算滤波器
        H=fspecial('log',n,sigma)                 高斯拉普拉斯(LoG)运算滤波器
        H=fspecial('average',n)                   均值滤波器
        H=fspecial('unsharp',alpha)             模糊对比增强滤波器
说明:对于形式 H=fspecial(type) ,fspecial 函数产生一个由 type 指定的二维滤波器 H ,返回的 H 常与其它滤波器搭配使用。

4. 彩色增强的 Matlab 实现
4.1 imfilter函数
功能:真彩色增强
格式:B=imfilter(A,h)
说明:将原始图像 A 按指定的滤波器 h 进行滤波增强处理,增强后的图像 B 与 A 的尺寸和类型相同
图像的变换
1. 离散傅立叶变换的 Matlab 实现
      Matlab 函数 fft、fft2 和 fftn 分别可以实现一维、二维和 N 维 DFT 算法;而函数 ifft、ifft2 和 ifftn 则用来计算反 DFT 。
这些函数的调用格式如下:
         A=fft(X,N,DIM)
      其中,X 表示输入图像;N 表示采样间隔点,如果 X 小于该数值,那么 Matlab 将会对 X 进行零填充,否则将进行截取,使之长度为
N ;DIM 表示要进行离散傅立叶变换。

        A=fft2(X,MROWS,NCOLS) 
其中,MROWS 和 NCOLS 指定对 X 进行零填充后的 X 大小。

        A=fftn(X,SIZE)
其中,SIZE 是一个向量,它们每一个元素都将指定 X 相应维进行零填充后的长度。

      函数 ifft、ifft2 和 ifftn的调用格式于对应的离散傅立叶变换函数一致。

例子:图像的二维傅立叶频谱

% 读入原始图像
I=imread('lena.bmp');
imshow(I)
% 求离散傅立叶频谱
J=fftshift(fft2(I));
figure;
imshow(log(abs(J)),[8,10])


2. 离散余弦变换的 Matlab 实现

2.1. dCT2 函数
功能:二维 DCT 变换
格式:B=dct2(A) 
        B=dct2(A,m,n) 
        B=dct2(A,[m,n]) 
说明:B=dct2(A) 计算 A 的 DCT 变换 B ,A 与 B 的大小相同;B=dct2(A,m,n) 和 B=dct2(A,[m,n]) 通过对 A 补 0 或剪裁,使 B 的大
小为 m×n。

2.2. dict2 函数
功能:DCT 反变换
格式:B=idct2(A) 
        B=idct2(A,m,n) 
        B=idct2(A,[m,n]) 
说明:B=idct2(A) 计算 A 的 DCT 反变换 B ,A 与 B 的大小相同;B=idct2(A,m,n) 和 B=idct2(A,[m,n]) 通过对 A 补 0 或剪裁,使 B
的大小为 m×n。

2.3. dctmtx函数
功能:计算 DCT 变换矩阵
格式:D=dctmtx(n)
说明:D=dctmtx(n) 返回一个 n×n 的 DCT 变换矩阵,输出矩阵 D 为 double 类型。


3. 图像小波变换的 Matlab 实现

3.1 一维小波变换的 Matlab 实现
(1) dwt 函数
功能:一维离散小波变换
格式:[cA,cD]=dwt(X,'wname')
        [cA,cD]=dwt(X,Lo_D,Hi_D)
说明:[cA,cD]=dwt(X,'wname') 使用指定的小波基函数 'wname' 对信号 X 进行分解,cA、cD
分别为近似分量和细节分量;[cA,cD]=dwt(X,Lo_D,Hi_D) 使用指定的滤波器组 Lo_D、Hi_D 对信号进行分解。
(2) idwt 函数
功能:一维离散小波反变换
格式:X=idwt(cA,cD,'wname')
        X=idwt(cA,cD,Lo_R,Hi_R)
        X=idwt(cA,cD,'wname',L)
        X=idwt(cA,cD,Lo_R,Hi_R,L)
说明:X=idwt(cA,cD,'wname') 由近似分量 cA 和细节分量 cD 经小波反变换重构原始信号 X 。
        'wname' 为所选的小波函数
        X=idwt(cA,cD,Lo_R,Hi_R) 用指定的重构滤波器 Lo_R 和 Hi_R 经小波反变换重构原始信号 X 。
        X=idwt(cA,cD,'wname',L) 和 X=idwt(cA,cD,Lo_R,Hi_R,L) 指定返回信号 X 中心附近的 L 个点。

3.2 二维小波变换的 Matlab 实现

          二维小波变换的函数
-------------------------------------------------
     函数名                函数功能
---------------------------------------------------
     dwt2            二维离散小波变换
   wavedec2       二维信号的多层小波分解
     idwt2           二维离散小波反变换
   waverec2        二维信号的多层小波重构
   wrcoef2          由多层小波分解重构某一层的分解信号
   upcoef2          由多层小波分解重构近似分量或细节分量
   detcoef2         提取二维信号小波分解的细节分量
   appcoef2        提取二维信号小波分解的近似分量
   upwlev2         二维小波分解的单层重构
   dwtpet2         二维周期小波变换
   idwtper2        二维周期小波反变换
-------------------------------------------------------------

(1) wcodemat 函数
功能:对数据矩阵进行伪彩色编码
格式:Y=wcodemat(X,NB,OPT,ABSOL)
        Y=wcodemat(X,NB,OPT)
        Y=wcodemat(X,NB)
        Y=wcodemat(X)
说明:Y=wcodemat(X,NB,OPT,ABSOL) 返回数据矩阵 X 的编码矩阵 Y ;NB 伪编码的最大值,即编码范围为 0~NB,缺省值 NB=16;
       OPT 指定了编码的方式(缺省值为 'mat'),即:
                 OPT='row' ,按行编码
                 OPT='col' ,按列编码
                 OPT='mat' ,按整个矩阵编码
       ABSOL 是函数的控制参数(缺省值为 '1'),即:
                 ABSOL=0 时,返回编码矩阵
                 ABSOL=1 时,返回数据矩阵的绝对值 ABS(X)

(2) dwt2 函数
功能:二维离散小波变换
格式:[cA,cH,cV,cD]=dwt2(X,'wname')
        [cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D)
说明:[cA,cH,cV,cD]=dwt2(X,'wname')使用指定的小波基函数 'wname' 对二维信号 X 进行二维离散小波变幻;cA,cH,cV,cD 分别为近似分
量、水平细节分量、垂直细节分量和对角细节分量;[cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D) 使用指定的分解低通和高通滤波器 Lo_D 和 Hi_D 分
解信号 X 。

(3) wavedec2 函数
功能:二维信号的多层小波分解
格式:[C,S]=wavedec2(X,N,'wname')
        [C,S]=wavedec2(X,N,Lo_D,Hi_D)
说明:[C,S]=wavedec2(X,N,'wname') 使用小波基函数 'wname' 对二维信号 X 进行 N 层分解;[C,S]=wavedec2(X,N,Lo_D,Hi_D) 使用指定
的分解低通和高通滤波器 Lo_D 和 Hi_D 分解信号 X 。

(4) idwt2 函数
功能:二维离散小波反变换
格式:X=idwt2(cA,cH,cV,cD,'wname')
        X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R)
        X=idwt2(cA,cH,cV,cD,'wname',S)
        X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S)
说明:X=idwt2(cA,cH,cV,cD,'wname') 由信号小波分解的近似信号 cA 和细节信号 cH、cH、cV、cD 经小波反变换重构原信号 X
;X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R) 使用指定的重构低通和高通滤波器 Lo_R 和 Hi_R 重构原信号 X ;X=idwt2(cA,cH,cV,cD,'wname',S)
和 X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S) 返回中心附近的 S 个数据点。

(5) waverec2 函数
说明:二维信号的多层小波重构
格式:X=waverec2(C,S,'wname')
        X=waverec2(C,S,Lo_R,Hi_R)
说明:X=waverec2(C,S,'wname') 由多层二维小波分解的结果 C、S 重构原始信号 X ,'wname'
为使用的小波基函数;X=waverec2(C,S,Lo_R,Hi_R) 使用重构低通和高通滤波器 Lo_R 和 Hi_R 重构原信号。

图像处理工具箱
1. 图像和图像数据
   缺省情况下,MATLAB将图像中的数据存储为双精度类型(double),64位浮点
数,所需存储量很大;MATLAB还支持另一种类型无符号整型(uint8),即图像矩
阵中每个数据占用1个字节。
   在使用MATLAB工具箱时,一定要注意函数所要求的参数类型。另外,uint8
与double两种类型数据的值域不同,编程需注意值域转换。
          从uint8到double的转换
   ---------------------------------------------
       图像类型        MATLAB语句
   ---------------------------------------------
     索引色             B=double(A)+1
     索引色或真彩色 B=double(A)/255
     二值图像          B=double(A)
   ---------------------------------------------

         从double到uint8的转换
   ---------------------------------------------
       图像类型        MATLAB语句
   ---------------------------------------------
    索引色               B=uint8(round(A-1))
    索引色或真彩色    B=uint8(round(A*255))
    二值图像            B=logical(uint8(round(A)))
   ---------------------------------------------

2. 图像处理工具箱所支持的图像类型

2.1 真彩色图像
    R、G、B三个分量表示一个像素的颜色。如果要读取图像中(100,50)处的像素值,
可查看三元数据(100,50,1:3)。
    真彩色图像可用双精度存储,亮度值范围是[0,1];比较符合习惯的存储方法是用无
符号整型存储,亮度值范围[0,255]
   
2.2 索引色图像
   包含两个结构,一个是调色板,另一个是图像数据矩阵。调色板是一个有3列和若干行
的色彩映象矩阵,矩阵每行代表一种颜色,3列分别代表红、绿、蓝色强度的双精度数。
   
   注意:MATLAB中调色板色彩强度[0,1],0代表最暗,1代表最亮。
          常用颜色的RGB值
   --------------------------------------------
    颜色    R   G   B      颜色    R   G   B 
   --------------------------------------------
     黑     0   0   1      洋红    1   0   1
     白     1   1   1      青蓝    0   1   1
     红     1   0   0      天蓝 0.67 0   1
     绿     0   1   0      橘黄    1 0.5 0
     蓝     0   0   1      深红   0.5 0   0
     黄     1   1   0       灰    0.5 0.5 0.5       
   --------------------------------------------
         产生标准调色板的函数
   -------------------------------------------------
    函数名       调色板
   -------------------------------------------------
     Hsv       色彩饱和度,以红色开始,并以红色结束
     Hot       黑色-红色-黄色-白色
     Cool      青蓝和洋红的色度
     Pink      粉红的色度
     Gray      线型灰度
     Bone      带蓝色的灰度
     Jet        Hsv的一种变形,以蓝色开始,以蓝色结束
     Copper    线型铜色度
     Prim       三棱镜,交替为红、橘黄、黄、绿和天蓝
     Flag       交替为红、白、蓝和黑
--------------------------------------------------
   缺省情况下,调用上述函数灰产生一个64×3的调色板,用户也可指定调色板大小。
   
   索引色图像数据也有double和uint8两种类型。
   当图像数据为double类型时,值1代表调色板中的第1行,值2代表第2行……
   如果图像数据为uint8类型,0代表调色板的第一行,,值1代表第2行……

2.3 灰度图像
   存储灰度图像只需要一个数据矩阵。
   数据类型可以是double,[0,1];也可以是uint8,[0,255]

2.4 二值图像
   二值图像只需一个数据矩阵,每个像素只有两个灰度值,可以采用uint8或double类型存储。
   MATLAB工具箱中以二值图像作为返回结果的函数都使用uint8类型。

2.5 图像序列
   MATLAB工具箱支持将多帧图像连接成图像序列。
   图像序列是一个4维数组,图像帧的序号在图像的长、宽、颜色深度之后构成第4维。
   分散的图像也可以合并成图像序列,前提是各图像尺寸必须相同,若是索引色图像,
调色板也必须相同。
   可参考cat()函数    A=cat(4,A1,A2,A3,A4,A5)

3. MATLAB图像类型转换
         图像类型转换函数
   ---------------------------------------------------------------------------
     函数名                      函数功能
   ---------------------------------------------------------------------------
     dither       图像抖动,将灰度图变成二值图,或将真彩色图像抖动成索引色图像
    gray2ind    将灰度图像转换成索引图像
    grayslice    通过设定阈值将灰度图像转换成索引色图像
     im2bw      通过设定亮度阈值将真彩色、索引色、灰度图转换成二值图
    ind2gray    将索引色图像转换成灰度图像
    ind2rgb      将索引色图像转换成真彩色图像
    mat2gray   将一个数据矩阵转换成一副灰度图
    rgb2gray    将一副真彩色图像转换成灰度图像
    rgb2ind      将真彩色图像转换成索引色图像
   ----------------------------------------------------------------------------

4. 图像文件的读写和查询

4.1 图形图像文件的读取
   利用函数imread()可完成图形图像文件的读取,语法:

     A=imread(filename,fmt)
     [X,map]=imread(filename,fmt)
     [...]=imread(filename)
     [...]=imread(filename,idx) (只对TIF格式的文件)
     [...]=imread(filename,ref) (只对HDF格式的文件)

   通常,读取的大多数图像均为8bit,当这些图像加载到内存中时,Matlab就将其存放
在类uint8中。此为Matlab还支持16bit的PNG和TIF图像,当读取这类文件时,Matlab就将
其存贮在uint16中。

   注意:对于索引图像,即使图像阵列的本身为类uint8或类uint16,imread函数仍将
颜色映象表读取并存贮到一个双精度的浮点类型的阵列中。

4.2 图形图像文件的写入
   使用imwrite函数,语法如下:

   imwrite(A,filename,fmt)
   imwrite(X,map,filename,fmt)
   imwrite(...,filename)
   imwrite(...,parameter,value)

   当利用imwrite函数保存图像时,Matlab缺省的方式是将其简化道uint8的数据格式。

4.3 图形图像文件信息的查询   imfinfo()函数

5. 图像文件的显示

5.1 索引图像及其显示

   方法一:
          image(X)
          colormap(map)

   方法二: 
          imshow(X,map)

5.2 灰度图像及其显示
   Matlab 7.0 中,要显示一副灰度图像,可以调用函数 imshow 或 imagesc (即 
imagescale,图像缩放函数)

   (1) imshow 函数显示灰度图像
    使用 imshow(I)    或 使用明确指定的灰度级书目:imshow(I,32)
    
    由于Matlab自动对灰度图像进行标度以适合调色板的范围,因而可以使用自定义
大小的调色板。其调用格式如下:
           imshow(I,[low,high])
    其中,low 和 high 分别为数据数组的最小值和最大值。

   (2) imagesc 函数显示灰度图像
   下面的代码是具有两个输入参数的 imagesc 函数显示一副灰度图像
       imagesc(1,[0,1]);
       colormap(gray);
    imagesc 函数中的第二个参数确定灰度范围。灰度范围中的第一个值(通常是0),
对应于颜色映象表中的第一个值(颜色),第二个值(通常是1)则对应与颜色映象表
中的最后一个值(颜色)。灰度范围中间的值则线型对应与颜色映象表中剩余的值(颜色)。

    在调用 imagesc 函数时,若只使用一个参数,可以用任意灰度范围显示图像。在该
调用方式下,数据矩阵中的最小值对应于颜色映象表中的第一个颜色值,数据矩阵中的最大
值对应于颜色映象表中的最后一个颜色值。

5.3 RGB 图像及其显示
   (1) image(RGB) 
   不管RGB图像的类型是double浮点型,还是 uint8 或 uint16 无符号整数型,Matlab都
能通过 image 函数将其正确显示出来。

   RGB8 = uint8(round(RGB64×255)); % 将 double 浮点型转换为 uint8 无符号整型
   RGB64 = double(RGB8)/255;            % 将 uint8 无符号整型转换为 double 浮点型
   RGB16 = uint16(round(RGB64×65535)); % 将 double 浮点型转换为 uint16 无符号整型 
   RGB64 = double(RGB16)/65535;      % 将 uint16 无符号整型转换为 double 浮点型

   (2) imshow(RGB) 参数是一个 m×n×3 的数组

5.4 二进制图像及其显示

   (1) imshow(BW)
   在 Matlab 7.0 中,二进制图像是一个逻辑类,仅包括 0 和 1 两个数值。像素 0 显示
为黑色,像素 1 显示为白色。
   显示时,也可通过NOT(~)命令,对二进制图象进行取反,使数值 0 显示为白色;1 显示
为黑色。 
   例如: imshow(~BW)

   (2) 此外,还可以使用一个调色板显示一副二进制图像。如果图形是 uint8 数据类型,
则数值 0 显示为调色板的第一个颜色,数值 1 显示为第二个颜色。
   例如: imshow(BW,[1 0 0;0 0 1])   

5.5 直接从磁盘显示图像
   可使用一下命令直接进行图像文件的显示: 
        imshow filename
   其中,filename 为要显示的图像文件的文件名。

   如果图像是多帧的,那么 imshow 将仅显示第一帧。但需注意,在使用这种方式时,图像
数据没有保存在Matlab 7.0 工作平台。如果希望将图像装入工作台中,需使用 getimage 函
数,从当前的句柄图形图像对象中获取图像数据,
   命令形式为: rgb = getimage;


bwlabel 
功能: 
标注二进制图像中已连接的部分。 
L = bwlabel(BW,n) 
[L,num] = bwlabel(BW,n)
isbw 
功能: 
判断是否为二进制图像。 
语法: 
flag = isbw(A) 
相关命令: 
isind, isgray, isrgb 
74.isgray 
功能: 
判断是否为灰度图像。 
语法: 
flag = isgray(A) 
相关命令: 
isbw, isind, isrgb
11.bwselect 
功能: 
在二进制图像中选择对象。 
语法: 
BW2 = bwselect(BW1,c,r,n) 
BW2 = bwselect(BW1,n) 
[BW2,idx] = bwselect(...) 
举例 
BW1 = imread('text.tif'); 
c = [16 90 144]; 
r = [85 197 247]; 
BW2 = bwselect(BW1,c,r,4); 
imshow(BW1) 
figure, imshow(BW2)
47.im2bw 
功能: 
转换图像为二进制图像。 
语法: 
BW = im2bw(I,level) 
BW = im2bw(X,map,level) 
BW = im2bw(RGB,level) 
举例 
load trees 
BW = im2bw(X,map,0.4); 
imshow(X,map)
2010-06-09 15:49:00 Tangyongkang 阅读数 387
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2091 人正在学习 去看看 贾志刚

图像处理相关的教学资源

http://cis.k.hosei.ac.jp/~wakahara/

 

2015-12-29 11:21:24 u013088062 阅读数 30751
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2091 人正在学习 去看看 贾志刚

  最近有人问我图像处理怎么研究,怎么入门,怎么应用,我竟一时语塞。仔细想想,自己也搞了两年图像方面的研究,做个两个创新项目,发过两篇论文,也算是有点心得,于是总结总结和大家分享,希望能对大家有所帮助。在写这篇教程之前我本想多弄点插图,让文章看起来花哨一点,后来我觉得没必要这样做,大家花时间沉下心来读读文字没什么不好,况且学术和技术本身也不是多么花哨的东西。

  一、图像处理的应用

  这个其实没什么好说的,一种技术的应用价值不是靠嘴上说,而是要看有多少人去搞,很简单的道理。其实我觉得判断一项技术有没有价值、有多大价值的最简单最有效的方法就是看有多少人在研究它。如果大家都在研究,那必然说明它很火,至少目前很火,以后的几年里依然还会火。因此,如果你不确定图像处理是不是有价值,那就查查全国图像处理工程师的数量就行了。

当然这里还是简单提一下。如果你真的只想问“图像处理有什么用?”,相信百度会给出比我更专业的答案。不过作为图像处理的行内人,我还是从几个基本的点来具体说一下。

  1、身份认证

  21世纪是刷脸的时代,这一点无可厚非。首先是银行,据说重庆的银行已经使用了人脸识别的验证系统来进行辅助的认证。其次是门禁系统,以前是指纹,虹膜,现在就是人脸。指纹、虹膜的识别虽然准确,但是有侵犯性,采集的过程中有侵犯性,验证的过程中也有侵犯性,反正让谁天天录指纹(采集指纹信息),用眼睛瞪摄像头(采集虹膜信息),谁都会觉得不舒服的,况且手还会脱皮。相比之下,人脸的识别就方便多了,拍张照片(采集人脸信息)谁都不会介意。最后是监控,一个摄像头所拍的监控能从不同的角度记录成百上千的人(比如车站等密集场所的监控),让警察去辨认将是一个浩大的工程,要是系统能够自动判别人员信息,无疑会给办案带来极大方便。

  2、监控安防

  安防监控可以说是图像处理领域最有潜力的应用领域。如今各个城市都在疯狂的安装监控摄像头,全国时刻都有无数的摄像头在录监控,但是安防监控的后端处理却没跟上。什么是后端处理,简单的说就是监控录像的视频处理。注意这里的视频处理可就不止包含人脸识别了,还有行人检测、异常检测、显著性检测、协同跟踪等。人脸识别之前说了,这里简单说说行人异常检测。图像处理中的行人异常检测在外行人眼中是一个非常有魔力的东西。毕竟让摄像头通过监控视频就能判断出当前画面中谁是好人谁是坏人(当然直接分为好人和坏人还是太武断了),在一般思维中貌似是不可能的。但是请不要忽略这样一个事实,就是目前大部分监控视频的分析处理都是由人工来完成的,警察破案时经常动不动就调出最近几天的监控视频,然后从头看到尾,其工程量之大可想而知。也正是这样才催生了人们对智能监控方面的研究,因为有这方面的实际需求。当然我们的视频分析程序不会直接给出诸如“好人or坏人”这样的武断而片面的判断结果。就当前的技术水平而言,能够统计当下监控画面中的人数(行人检测)、定位他们的人脸(人脸检测)、识别他们的身份(人脸识别)、判别他们的表情(表情识别)、检测他们的动作(异常检测),这就已经够了。这样以后人们就不会再面对长达几十甚至上百个小时的监控视频发呆,而是直接分析计算机给出的数据,当前画面中有多少人、都是谁、谁的动作可疑等。总之,接下来智能监控发展会很迅速,因为需求很迫切。

  3、深度学习(Deep Learning)

  通俗的说一句,“图像处理是深度学习应用的天堂”。深度学习这个概念可能有人不太熟悉,大家可以自行百度,我这里给出一个相对通俗的解释:“如果你不知道什么叫深度学习,就想想《终结者》中的T-800”。当然这句话不是我说的,是出自业界的一位大牛之口。当然这可能有点小片面,不过深度学习确实是公认的新一代人工智能的基础。

  这里举两个例子。一是谷歌的人工大脑项目。谷歌公司可以说是深度学习方面的牵头企业了,其在2012年公布的谷歌大脑项目,动用了1.6万个计算节点,训练数周,得到的人工智能模型能够自主识别猫脸图像,为新一代人工智能开辟了道路,之后微软深度学习研究院、百度深度学习研究院等机构都开始大量投入,各个高校也搞得风声水起,原因很简单,大家都知道它会火。

  第二就是图像识别方面的竞赛。最有权威的就是ImageNet竞赛。大家在一个拥有上千万张,上千类别的图像数据库上训练和测试自己的算法,比拼识别率。近几年来,摘得桂冠的一直都是深度学习模型,确切的说是卷积神经网络。更多有关ImageNet历年的竞赛信息大家可以自行百度。

  说道深度学习在图像处理的应用,不得不提中国的汤晓鸥教授,说他是国内深度学习的领头羊也不为过。他提出的DeepID人脸识别算法(一共分为三代),在一些大规模人脸数据库上的正确率(若LFW库)已经达到了99.75%,单纯从数字上讲的话可以说已经超越了人类的识别率,为此汤教授还开办了公司,开发FaceSDK(虽然还没有公布)。不过拿计算机和人脑相比本身就是不合理的,各有所长嘛。不过可见DeepLearning在图像识别领域的强大威力。至于深度学习与图像处理的关系这里就不用多说了,谷歌大脑识别的是图像,深度学习竞赛用的是图像,DeepID识别的还是图像人脸,虽然深度学习在其他方面诸如语音识别等也有应用,在图像处理依然是其主要的应用领域。

  二、图像处理研究工具

  图像处理的研究分为算法研究和应用两个部分。用到的主要编程语言有Matlab、C/C++、Python等,原因很简单,它们都有很多相应的第三方库,不用我们从零开始编程。

  1、Matlab

  MathWork公司的Matlab软件可以说是算法研究的利器,它的强大之处在于其方便快捷的矩阵运算能力和图形仿真能力,单从简洁性和封装性来说,确实完爆其他语言。但高度封装必然会相应的损失一部分灵活性,况且Matlab严格的讲更像是一个工具,而非一门编程语言。顺便提一句,它在2015年编程语言排行榜中位于第20名,仅次于IOS开发的Objective-C。

  对于算法研究人员(尤其是高校的硕士博士),首选工具自然是matlab,因为它简便快捷,封装性好,更重要的是全世界几乎所有的算法大牛、精英教授都会首先公布对应的Matlab源码,然后在逐步改写成其他语言进行实际应用。所以,如果你想做图像处理方面的研究,Matlab是必须掌握的,而且是熟练掌握。当你有一些想法需要验证时,最好明智的先用matlab编写出来测试。如果你上来就用看似高大上的C++来实验,不仅错误BUG一大堆,到头来可能效果还不佳,就算效果好,时间也会耽搁不少,毕竟算法开发还是要快的,这样才能赶在别人之前发论文。总之,只要是接触图像算法,终究逃不过Matlab,就算你是软件开发的,不研发算法,但总得能看懂别人的Matlab算法吧。

  对于之前没怎么接触过Matlab与图像处理的人,在这里推荐一本相关的书籍《MATLAB图像处理实例详解(附光盘)》。这本书对于Matlab图像处理入门还是很有帮助的。记得我当时刚上研究生时就靠两本书入门的,一是冈萨雷斯的《数字图像处理》,二是这本《MATLAB图像处理实例详解》。不过这里友情提示,在看这类教程(不仅仅是Matlab)时千万不要试图去记忆所有的工具函数,这种做法是十分愚蠢的。正确的做法是根据自己的情况快速翻阅这类工具书,可以找出里面的有实际意义的源码来敲一敲练练手感,至于具体的工具函数,只需要知道Matlab提供了这方面的功能就行了,以后用到了再回来查,或者谷歌百度。我觉得在入门阶段,最重要的不是看了多少书,听了多少课,而是尽快自己敲出一段代码,运行出结果,来建立自信和成就感,这才是支持我们走下去的最实在的动力。记得我当时看了没多久就自己敲了一个蹩脚的车牌检测的Matlab程序,现在看来真是漏洞百出,不过当时我真的很兴奋,很有成就感,觉得自己能干这行,对于初学者来说,这种感受弥足珍贵。

  2、OpenCv

  Opencv是Intel公司开发的C++图像处理工具包,形象的理解为就是C++版的Matlab。当初Intel公司开发这个工具包的初衷也是方便大家共享,希望大家能够在一个共同架构的基础上共同建造摩天大楼,而不是各自在自己的地基上盖平房。与Matlab不同,Opencv是面向开发的,稳定性好,异常处理机制周全,但有一点需要注意,由于Opencv是开源的,那么如果你在项目中直接调用了它的API,那就意味着你的项目也必须开源。因此在真正的产品开发过程中,往往需要从Opencv库里面挖代码,而不是直接调用,幸好Intel公司允许我们看源码,自己编译一把就可以了。

  说道C++和Opencv,有一个问题不得不提,那就是深度学习领域大名鼎鼎的Caffe框架。这是一个典型的基于C++和OpenCv的深度学习框架,由谷歌深度学习团队、“谷歌大脑”负责人之一贾扬清学者编写,并公布了源码。如今各个深度学习机构都在大量使用这个框架进行研究。

  这里同样对推荐两本关于Opencv方面的教程。一本是CSDN博客大牛毛星云写的《OpenCV3编程入门》,这是它根据自己多年的博客整理成的书,很详细,很典型的一本教程,介绍了OpenCv中相对前沿的知识。我翻看过这本教程,中规中矩,里面的代码通俗易懂,尤其适合初学者。当然大家同样要注意不要犯了死读书的毛病,只看它的功能,敲代码练手感即可,不要试图记忆API函数。重要的工具用多了自然会记住,不重要的工具记住了也没用。

  这里推荐的第二本书是《图像识别与项目实践――VC++、MATLAB技术实现》,这本书是一本偏向于工程应用的书,我之所以推荐它是因为它给出了很多有新意、能运行的代码。其中里面有一个项目让我印象很深,是一个车牌检测的实例。简单描述一下:由于车牌中的字符数是固定的,因此它通过判断横向区域笔画的跳变数以及笔画宽度来定位车牌区域。这个想法让人耳目一新,并且它还给出了详细代码,我也亲身试验过,效果还不错。

  这里同样再强调一下,就是一定要尽早入手写程序,建立自信和成就感。我当时学OpenCv正好用它开发了一个人脸性别识别的系统,是一个本科大学生创新计划的需求,效果还可以。

  3、Python

  Python在今年12月份的编程语言排行榜中名列第5,增长迅速。可以说Python已经逐渐成为当下脚本语言的新标准。Python在图像处理算法方面除了其自身简洁的编程优势外,还得益于两个重要的Python类库——Numpy和Theano。

  Numpy是Python的线性代数库,对于矩阵运算能提供很好的支持,并且能够在此基础上进行很多机器学习相关算法的开发仿真,这里推荐一本受到大家广泛认可的书《机器学习实战》,我最近也正在看这本书,里面对好多机器学习领域的经典算法,小到KNN,大到SVM,都给出了详细的介绍以及代码实现(Python版)。Theano是Python的机器学习库,能够方便的实现深度学习(例如卷积神经网络CNN)算法,网上很多对于DeepID算法的复现都是用的这个库。

  人觉得单从图像处理的角度评价的话,Python并没有前面两个工具(Matlab和OpenCv)应用广泛,不过作为通用的脚本语言,我觉得每个程序员都应该去了解了解它,毕竟俗话说没有烂的编程语言,只有烂程序员。我在学Python时第一个自己写的程序就是微信打飞机的小程序,在我的博客中有详细的教程,虽然是参照小甲鱼的《零基础入门学习Python》视频教程写的,但还是蛮有成就感的。

  三、图像处理研究方法

  我觉得,图像处理研究主要可以分为三个部分:基础概念、基本思想、算法研究。

  1、基础概念

  所谓基础概念,就是图像处理里最基本的知识,比如什么是图像?什么是像素?什么是彩色图像等等。没有一个明确的界限来划定什么是基础概念什么是高级知识,因人而异。了解图像处理的基础知识,有一本书是必读的,就是冈萨雷斯编写的、阮秋琦翻译的《数字图像处理》。这本书已经作为图像处理领域的经典教材使用了三十多年,我自己也把这本书看了好几遍,每一遍都会有新的体会。我觉得每一个搞图像的都应该熟读这本书。书中除了有几章内容在讲小波变换、模式识别等相对抽象的内容外,其他内容相对都是很基础的,本科生水平就能看懂。而且我建议要尽早看这本书,如果是研究生尽量在进入课题之前就看一遍,因为这样一本经典的书在进入课题之后可能就没时间看了,以后也顶多是查阅而已。我当初就是在大四的寒假看完了这本书,以后在图像入门的过程中就显得轻松很多。看完这本书,哪怕是只看前几章,明白了什么是图像(二维或者三维矩阵)、什么是像素、彩色图和灰度图、颜色空间、图像滤波、图像噪声、图像频域变换等概念,将来在进行更深一步的研究的话就会方便很多了。

  2、基本思想

  刚开始想把这部分内容命名为“基本算法”,意在介绍图像处理中的一些基本算法,后来仔细想想决定不这么写,因为图像处理是一个非常大的概念,图像处理不等于人脸识别,也不等于模式识别,直接介绍诸如图像处理基本算法之类的内容很容易写成空话,没有什么实际意义。读者有兴趣的话可以直接谷歌百度“图像处理十大经典算法”,上面有我想说的内容。

  万变不离其宗,算法是死的,重在思想。举个例子,我个人是主攻模式识别方向,在这个方向判断一个学生是否入门有一个非常简单的方法,就是“如果你能把图像很自然的想象成高维空间中的一个点”,那就说明在模式识别方面入门了,可以对图像进行分类了。当然标准不是唯一,在其他领域如目标检测也会有其他的判断标准,总之我们要对图像进行处理,那么图像就不再只是图像,它可能会演变成各种不同形式的概念,可能是点,可能是面,还可能是一个坐标空间。在目标跟踪的经典算法粒子滤波中,将一个个的小图像块看做一个个粒子;在子空间理论中,将一系列图像放在一起构建一个成分主空间(例如主成分分析PCA算法等等。,我不会详细介绍这些算法,说多了就显得抽象老套,但我要说的是我们一定要把图像本身理解好,它是一个图像,是一个矩阵,是一个信息的容器,是一种数据的表现形式,图像不一定都必须在视觉上有意义(比如频域的图像)。

  总之图像处理的基本思想还是要立足于图像本身,要深度到图像内部结构中,思维要灵活。我当时做本科毕设时,怎么也不知道图像和高维空间中的点之间有什么对应关系,后来总算有一天,突然就明白了,这也就是所谓的量变产生质变。总之一定要多想,多总结,主动去钻研,才能够真正领悟一些东西。最基本的东西往往蕴藏着深奥的道理,无论你现在多牛多厉害,都不能放掉最本源的东西。多想想图像是什么,有什么本质属性,你可能无法得到准确的答案,但肯定能得到一些有用的感悟(有点像哲学问题了)。

  3、算法研究

  算法研究应该是图像处理的核心工作,尤其是各大高校的博士硕士。这里我并不想谈那些高大上的算法,我更想说的是一些算法研究的一些基础的东西,比如说一些基础课程,比如说矩阵运算。

  研究图像处理的算法,离不开数学。在这里我建议图像处理方面的硕士一定要上两门课:《泛函分析》以及《最优化算法》,有的学校已经将这两门课列为了研究生阶段的必修课程。这两门可可以说是图像处理(至少是模式识别)的基础。我当初没上过最优化算法,但后来也自己补上了,不然真的是寸步难行。至于泛函我当时听课的时候也不是很懂,但是在之后的研究过程中发现很多图像处理的基本知识基本理论都和泛函分析中枯燥的定理如出一辙,没办法,有的东西本身就是枯燥的干货,学着费力,缺它不行。

  其次我想说的是矩阵运算。图像就是矩阵,图像处理就是矩阵运算。大家为什么都喜欢用Matlab,就是因为它的矩阵运算能力实在是太强大,在Matlab的世界中任何变量都是矩阵。同样OpenCv之所以能流行,不仅仅是因为它良好的封装性,也是因为它的矩阵格式,它定义了Mat基础类,允许你对矩阵进行各种操作。Python也不例外,它的Numpy就是一个专门的线性代数库。

  真正在图像编程过程中,那些看着高大上的API函数归根到底都是工具,查查手册就能找到,真正核心还是在算法,算法是由公式编写的,公式的单元是变量,而图像届的变量就是矩阵。所以,熟练去操作矩阵,求秩、求逆、最小二乘,求协方差,都是家常便饭。所以,如果你有幸能上《矩阵分析》这门课,一定要把它看懂,那里面都是干货。

  四、小结

  总之,图像处理就是一个典型的门槛低、厅堂深的领域。不需要太多基础,学过线性代数,会一点编程就够了;但是那些算法却深不可测,是个消耗功夫的活儿。在写这篇教程时我说的很直白,就像和大家对话一样,想到什么说什么。在最后我想说两句题外话,就是不仅仅针对图像处理,对于其他新技术的入门学习也是一样,尽快迈出第一步,尽快去建立自信和成就感,让自己有勇气走下去,然后缺什么补什么就行了。我觉得真正让人望而却步的往往不是技术本身,而是我们对自身的不自信。唯有果断开工,才能战胜心魔。


如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢。


2008-11-23 15:39:00 ccfboy 阅读数 674
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2091 人正在学习 去看看 贾志刚

图像处理教学网站(英文)
http://www.imageprocessingplace.com/

 

中国图像图像学会
http://www.csig.org.cn/

 

中国图像图形网
http://www.image2003.com/

 

中国图像图形学报
http://www.cjig.cn/

 

image processing (综合)
http://bbs.matwav.com/user/download/84430/Link.htm

 

中国科学院自动化研究所模式识别重点实验室
http://nlpr-web.ia.ac.cn/

 

图像处理联盟
http://club.heima.com/forum_display.aspx?forumid=164529&categoryid=31

 

小波向导
http://users.rowan.edu/~polikar/WAVELETS/WTtutorial.html

 

中国站长-图像处理类
http://code.cnzz.cn/softlist/410_10.aspx

 

阿须论坛
http://www.assuredigit.com/forum/

 

中国自动识别网
http://www.autoid-china.com.cn/index6.asp

 

Image Processing Fundamentals
http://www.ph.tn.tudelft.nl/Courses/FIP/noframes/fip.html

 

Image Processing and Analysis Group
http://noodle.med.yale.edu/

 

PEIPA, the Pilot European Image Processing Archive
http://peipa.es***.ac.uk/

 

efg's Image Processing
http://www.efg2.com/Lab/Library/ImageProcessing/

 

Fuzzy Image Processing
http://pami.uwaterloo.ca/tizhoosh/fip.htm

 

Digital Image Processing Laboratory of the Electrical Engineering Department at the University of Cape Town
http://www.dip.ee.uct.ac.za/

 

Image Processing Laboratory
http://www.med.uni-giessen.de/ipl/

 

UC Berkeley Video and Image Processing Lab
http://www-video.eecs.berkeley.edu/

 

MICCAI 2005 8th International Conference on Medical Image
Computing and Computer Assisted Intervention

http://www.miccai2005.org/

 

Image Processing Fundamentals - Contents
http://www.ph.tn.tudelft.nl/Courses/FIP/noframes/fip-Contents.html
对初学者很好!

 

Center for Image Processing Research
http://www.cipr.rpi.edu/

 

ICIP, 2005 - The IEEE International Conference on Image Processing
http://www.icip05.org/

 

Astroart 3.0 is a complete software for image processing, photometry, astrometry, CCD control and image stacking for CCD and film images
http://www.msb-astroart.com/
图像软件

 

Journal of Flow Visualization and Image Processing
http://begellhouse.com/journals/52b74bd3689ab10b.html
图像处理的期刊

2012-02-23 14:17:35 yang344024504 阅读数 155
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2091 人正在学习 去看看 贾志刚
谁有跟图像处理有关的中英文文献,毕业设计翻译要用,求发个谢谢!344024504@qq.com

图像处理相关问题

阅读数 228

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