MATLAB GUI设计入门与实战
上QQ阅读APP看书,第一时间看更新

1.10 图像处理

图像处理是借助于计算机对摄像机采集的图像进行分析和处理的一种方法。图像处理在视频监控、交通路况信息监测等领域广泛应用,本节主要讲解基本的图像处理知识,包括图像采样、图像数据类型、图像颜色空间(RGB格式、HSI格式和YUV格式)以及图像基本运算等。

1.10.1 图像采样

理论上讲,图像是一种二维的连续函数,然而在计算机上对图像进行数字处理的时候,首先必须对其在空间和亮度上进行数字化,这就是图像的采样和量化的过程。空间坐标(xy)的数字化称为图像采样,而幅值数字化称为灰度级量化。

MATLAB程序如下:

    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all  % 清理命令区、清理工作区、关闭显示图形
    warning off       % 消除警告
    feature jit off      % 加速代码运行
    ps=imread('bag.png');  % 读图
    figure(1)              % 先建图像窗口
    imshow(ps)      % 画图
    background=imopen(ps,strel('disk',4));   % 形态学开运算
    figure(2)        % 先建图像窗口
    imshow(background);
    figure(3)        % 先建图像窗口
    surf(double(background(1:4:end,1:4:end))),zlim([0 256]);   % 画图
    set(gca,'Ydir','reverse');  % 设置Y轴反向

运行程序,得到图形如图1-61和图1-62所示。

图1-61 原始图像

图1-62 图像的三维视图

图像是对图像空间坐标的离散化,它决定了图像的空间分辨率。图像采样可以这样形象地理解:用一个网格把待处理的图像覆盖,然后把每一个小格上模拟图像的各点亮度取平均值,作为该小方格中点的值,如图1-63所示。

图1-63 图像采样

对一副图像采样时,若每行(横向)像素为M个,每列(纵向)像素为N个,则图像大小为M×N个像素,fxy)表示点(xy)处的灰度值,则Fxy)构成一个M×N实数矩阵,如下式所示。

1.10.2 图像数据类型

MATLAB支持以下几种图像文件格式:

PCX(Windows Paintrush)格式;

BMP(Windows Bitmap)格式;

HDF(Hierarchical Data Format)格式;

JPEG(Joint Photographic Experts Group)格式;

TIFF(Tagged Image File Format)格式;

XWD(X Windows Dump)格式;

PNG(Portable Network Graphics)格式。

MATLAB强大的矩阵运算功能完全可以用于图像,在默认的情况下,MATLAB将图像中的数据存储为双精度类型(double),即64位的浮点数。这种存储方法的优点在于使用时不需要进行数据类型转换,因为几乎所有的MATLAB函数都可以使用double作为参数类型。然而,对于图像存储来说,用64位来表示图像将导致巨大的存储量,因此MATLAB还支持图像数据的另一种类型——无符号整型,其中数据矩阵中uint8数据类型的图像称为8位图,uint16数据类型的图像称为16位图,图像矩阵中的每个数据占据一个字节。

利用MATLAB函数image可以直接显示8位图和16位图,而不必将其转换成双精度浮点类型。然而,当运算图像时,则需要将8位图和16位图转化为64位双精度浮点型进行图像处理。

(1)8位和16位索引图像。数据信息包括一个数据矩阵和一个双精度色图矩阵,数据矩阵中的值直接指定该点的颜色为色图矩阵中的某一种。色图矩阵中,每一行表示一种颜色,每行有三个值,分别表示该种颜色的红、绿、蓝的比例情况,所有的元素值都在[0,1]中。

(2)8位和16位灰度图像。双精度浮点类型的图像数组的数值取值范围通常为(0,1),而8位和16位无符号整数类型的图像数组的数值取值范围分别为(0,255)和(0,65535)。

(3)8位和16位RGB图像。8位RGB图像的颜色的数据为(0,255)内的整数,而不是(0,1)之间的浮点数。所以在8位图像中,颜色值(255,255,255)的像素显示为白色。

1.10.3 图像颜色空间

图像彩色空间主要有RGB格式(红、绿、蓝)、HSI格式(色度、饱和度、亮度)和YUV格式等。

1.RGB格式

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

如图1-64所示为RGB彩色图像。

图1-64 RGB图像

    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all              % 清理命令区、清理工作区、关闭显示图形
    warning off                       % 消除警告
    feature jit off                  % 加速代码运行
    a=imread('coloredChips.png');    % 读图
    figure(1),imshow(a)                % 先建窗口画图
    a1=rgb2gray(a);                   % 转化为灰度图像
    figure(2),imshow(a1)              % 先建窗口画图
    a2=a(:,:,1);                       % R通道
    figure(3),imshow(a2)               % 先建窗口画图
    a3=a(:,:,2);                        % G通道
    figure(4),imshow(a3)               % 先建窗口画图
    a4=a(:,:,3);                        % B通道
    figure(5),imshow(a4)              % 先建窗口画图

运行程序输出结果如图1-65所示。

(a)灰度图像

(b)R通道图像

(c)G通道

(d)B通道

图1-65 RGB分解图像

2.HSI格式

HSI用色调、饱和度和亮度来描述物体的颜色,其中H定义颜色的波长,称为色调;S表示颜色的深浅程度,称为饱和度;I表示强度或亮度,在处理彩色图像时,可仅对I分量进行处理,结果不改变原图像中的彩色种类。

从RGB色彩空间到HSI色彩空间的转换公式如下:

MATLAB主程序如下:

    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all                  % 清理命令区、清理工作区、关闭显示图形
    warning off                           % 消除警告
    feature jit off                      % 加速代码运行
    rgb=imread('coloredChips.png');     % 读图
    r = rgb(:, :, 1);                      % R通道
    g = rgb(:, :, 2);                      % G通道
    b = rgb(:, :, 3);                   % B通道
    subplot(241),imshow(rgb), title('RGB');       % 先建窗口画图
    subplot(242),imshow(r);title('R');            % 先建窗口画图
    subplot(243),imshow(g);title('G');              % 先建窗口画图
    subplot(244),imshow(b);title('B');            % 先建窗口画图
    hsi=rgb2hsi(rgb);                           % 转化为HSI颜色空间
    H = hsi(:, :, 1);                           % H
    S = hsi(:, :, 2);                           % S
    I = hsi(:, :, 3);                           % I
    % colorshsiPlot(hsi,H,S,I)
    subplot(245),imshow(hsi),title('HSI');     % 显示画图HSI
    subplot(246),imshow(H);title('H');        % 显示画图H
    subplot(247),imshow(S);title('S');        % 显示画图S
    subplot(248),imshow(I);title('I');        % 显示画图I

MATLAB程序如下:

    function hsi=rgb2hsi(rgb)
    rgb=im2double(rgb);
    r = rgb(:, :, 1);                      % R
    g = rgb(:, :, 2);                      % G
    b = rgb(:, :, 3);                      % B
    num=0.5*((r-g)+(r-b));                  % 分子运算
    den=sqrt((r-g).*(r-g))+(r-b).*(g-b);    % 分母计算
    theta=acos(num./(den+eps));            % 夹角余弦
    H=theta;                      % H
    H(b>g)=2*pi-H(b>g);                 % 钝角判断
    H=H/(2*pi);                     % 弧度归一化设置
    num=min(min(r,g),b);               % 分子,求最小值
    den=r+g+b;                     % 分母叠加求和
    den(den==0)=eps;                  % 分母等于0则置极小值eps
    S=1-3.*num./den;                  % S计算
    H(S==0)=0;                     % 当S=0时,H=0
    I=(r+g+b)/3;                     % 求平均值
    hsi=cat(3,H,S,I);  % 合成HSI颜色空间图像

运行程序得到结果如图1-66所示。

图1-66 RGB与HSI转换图像

3.YUV格式

YUV是模拟彩色电视制式采用的颜色空间。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominanee或Chroma),U和V是构成彩色的两个分量,作用是描述影像色彩及饱和度,用于指定像素的颜色。

YUV与RGB相互转换的公式如下(RGB取值范围均为0~255):

写成矩阵是:

MATLAB程序如下:

    c% Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all              % 清理命令区、清理工作区、关闭显示图形
    warning off                       % 消除警告
    feature jit off                  % 加速代码运行
    % rgb=imread('1.jpg');
    ps=imread('YUV1.jpg');
    Im1=ycbcr2rgb(ps);
    % subplot(131),imshow(rgb);title('rgb')      % 显示原始图像画图
    subplot(121),imshow(ps);title('YUV')       % YUV颜色空间图像
    subplot(122),imshow(Im1);title('yuv2rgb')    % YUV转化为RGB颜色空间

程序运行结果如图1-67所示。

图1-67 RGB与YUV转换图像

1.10.4 图像运算

1.选定区域处理

(1)在MATLAB中提供了roicolor函数根据颜色选定区域。其调用格式如下。

BW=roicolor(A, low, high):色图范围为[low, high],返回这些像素选择区域。BW为内部区域的值为1,外边为0的矩阵。

BW=ROICOLOR(A, v):返回A中像素与向量v相匹配的区域,BW为二值化图像,若A中的像素值在向量v中存在则返回1,否则返回0。

图像区域选择示例编程如下:

    % 读取图像
    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all              % 清理命令区、清理工作区、关闭显示图形
    warning off                       % 消除警告
    feature jit off                  % 加速代码运行
    obj=imread('psb.png');          % 读图
    obj = rgb2gray(obj);           % 转化为灰度图像
    load woman                   % 加载MATLAB自带图像对应的MAP值
    BW = roicolor(obj,120,200);     % 抠图
    figure,imshow(obj,map)        % 显示图像
    figure,imshow(BW)              % 显示抠图

运行程序结果如图1-68及图1-69所示。

图1-68 原始图像

图1-69 区域选择效果

(2)MATLAB也提供了roipoly函数用于选择图像中的多边形区域。其调用格式如下。

BW=roipoly:直接对当前图像窗口进行交互选择操作。用户可以交互式选择多边形填充区域,单击选择顶点,按空格键或Del键取消选择,按Enter键或者双击鼠标左键确认。

BW=roipoly(I):为图像I生成交互式的处理界面。

BW=roipoly(I, c, r):用向量c,r指定多边形各点的x,y坐标。

BW=roipoly(x, y, I, xi, yi):用向量x和y建立非线性默认的坐标系,然后在指定的坐标系下选择由向量xi,yi指定的多边形区域。

对图像进行区域选择,编程如下:

    % 读取图像
    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all      % 清理命令区、清理工作区、关闭显示图形
    warning off               % 消除警告
    feature jit off          % 加速代码运行
    obj=imread('psb.png');
    r=obj(:,:,1);
    g=obj(:,:,2);
    b=obj(:,:,3);
    c=[314 272 199 135 171 276];       % 抠图图形节点横坐标
    r1=[163,268,276,171,43,32];        % 抠图图形节点纵坐标
    BW=roipoly(obj,c,r1);           % 抠图
    r1=immultiply(r,BW);           % 交运算
    g1=immultiply(g,BW);               % 交运算
    b1=immultiply(b,BW);               % 交运算
    obj2=cat(3,r1,g1,b1);           % 合成RGB图像
    subplot(121),imshow(obj)         % 显示画图
    xlabel('原始图像')
    subplot(122),imshow(obj2)
    xlabel('选择多边形区域的图像')

运行程序结果如图1-70所示。

图1-70 图像区域选择

2.图像离散余弦变换

通常一个图像的数学表示是具有两个空间变量的一个函数:fxy)。

该函数在某一特定点(xy)的函数值代表相应点图像的强度。而离散余弦变换(DCT)将一幅图像从空域变换为频域。离散余弦变换具有将一个典型图像的大部份重要信息集中在少数几个DCT系数上的特点,由此减少了大量的空间冗余。由于这个原因,离散余弦变换常常被使用在图像压缩的应用中。

在MATLAB图像处理工具箱中用dct2函数来计算一幅图像的二维离散余弦变换。

一个M×N的矩阵Amn的二维离散余弦变换被定义为:

其中,

Bpq被称为离散余弦变换系数,即DCT系数。

离散余弦变换是一个可逆变换,其对应的逆变换为:

其中,

在MATLAB图像处理工具箱中用idct2函数来计算二维离散余弦反变换。

离散余弦反变换可以解释为对任意M×N的矩阵A可以写成M×N函数和的形式:

这些函数被称为离散余弦变换的基函数。DCT系数Bpq可以看作是对每一个基函数的权重。

MATLAB程序如下:

    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all                  % 清理命令区、清理工作区、关闭显示图形
    warning off                           % 消除警告
    feature jit off                      % 加速代码运行
    rgb=imread('concordaerial.png');     % 读图
    % imshow(rgb)                          % 显示画图
    I = rgb2gray(rgb);                    % 转换为灰度图像
    J = dct2(I);                              % DCT变换
    % imshow(log(abs(J)),[]), colormap(jet(64)), colorbar     % 显示画图
    J(abs(J) < 10) = 0;                    % 小于10 的DCT变换能量值置为0
    K = idct2(J);                                           % IDCT逆变换
    subplot(121),imshow(I),title('original pic')         % 显示画图
    subplot(122),imshow(K,[0 255]),title('DCT pic')       % DCT显示画图

运行结果如图1-71所示。

图1-71 DCT图像

3.直方图增强

在曝光不足或过度的情况下,获得的图像的灰度值集中在一个小区间内,直方图均衡是以累积分布函数变换法为基础的直方图修正法。通过直方图均衡,可以产生一幅灰度级分布具有均匀概率密度的图像,即改变了图像的灰度值,提高了图像的对比度。

在图像的预处理中采用直方图均衡,可以部分地减小不同图像的亮度差别,同时,可以使灰度值充分地占据灰度值范围,提高图像对比度,因此在对图像的处理中是很有用的。

设原始图像的概率密度函数的定义为:,其中Hx)为直方图,A为图像的面积。

设转换前的图像概率密度函数为prr),转换后图像的概率密度函数为pss),转换函数为sfr),由概率论知识可以得到:,其中rs分别表示图像转换前后的灰度。

如果使转换后图像的概率密度函数为1,则有:,等式两边对r积分,即s被称为图像的累积分布函数,如果没有归一化,只要乘以灰度最大值即可,灰度均衡的转换公式变为:

其中IaIb分别为图像转换前后的灰度。

MATLAB程序如下:

    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all                  % 清理命令区、清理工作区、关闭显示图形
    warning off                           % 消除警告
    feature jit off                      % 加速代码运行
    I=imread('concordaerial.png');      % 读图
    i=1;                                      % 选择第i个通道
    I2=imadjust(I,[100/255,140/255],[0,1]);    % 图像增强——灰度级直接变换
    figure(1),                           % 先建窗口画图
    subplot(121),imshow(I)                % 显示原图
    subplot(122),imhist(I(:,:,i))          % 直方图
    figure(2),                          % 先建窗口画图
    subplot(121),imshow(I2)              % 画增强图像
    subplot(122),imhist(I2(:,:,i))         % 直方图

运行结果如图1-72及图1-73所示。

图1-72 原始图像直方图

图1-73 直方图均衡化