2019-06-24 17:51:13 weixin_41683113 阅读数 36
  • 定义与预处理、函数和函数库-C语言专题第6部分

    本课程综合讲解了C语言的预处理和宏定义,详细讲述了宏定义的细节规则和头文件包含等常用预处理;然后讲述了函数的使用、函数库的使用,静态链接库和动态链接库等的制作和使用。本章的目标是提升大家对函数及函数库的认知,提升在实战中使用函数库解决问题的能力。

    8069 人正在学习 去看看 朱有鹏

概述

这份笔记是对冈萨雷斯《数字图像处理第三版》的学习整理,编程语言选择MATLAB,笔记中有大量MATLAB中IPT的API介绍

什么是数字图像处理

数字图像的定义

一幅图像可以定义为一个向量值函数 f(x,y)f(x,y) , 其中 (x,y)(x, y) 表示空间坐标(二维空间即为平面), f(x,y)f(x, y) 是一个向量,称为像素值,通常是一维或三维。如表示黑白图像时, f(x,y) 是一维的,此时也称为灰度,表示RGB图像时, f(x,y) 是三维,分量分别表示(红,绿,蓝)三个通道的值。

将一幅图像存储到计算机中时,需要对图像数字化,对空间坐标的数字化称为取样,对亮度的数字化称为量化,数字化后的图像仅由有限个离散值表示,称为数字图像。

数字图像处理就是用计算机处理图像。

数字图像处理的范围

图像处理与计算机视觉之间没有明显界限

粗略分类

  • 低级处理:输入输出均为图像。通常是一些原始操作,如:降低噪声的图像预处理,对比度增强图像锐化
  • 中级处理:输入是图像,输出是图像中提取的属性。如图像分割对象描述单个对象的分类识别
  • 高级处理:执行与人类视觉相关的感知函数,对识别的对象进行总体确认。

数字图像的表示

坐标约定

对一幅图像取样后,假设得到MMNN列的图像,称图像大小为 M×NM\times N.

通常采用如下两种约定:

书籍
2.1
IPT:
2.2

矩阵表示:

书籍:
2.3

MATLAB:
2.4

MATLAB与IPT基础

MATLAB的数据类型:

类型 名称 描述
数值型 double Matlab默认类型,双精度浮点数,-1030810^{308}~ 1030810^{308} (8字节每像素)
数值型 uint8 无符号8比特整数,[0, 255] (1字节每像素)
数值型 uint16 无符号16比特整数,[0, 65535] (2字节每像素)
数值型 uint32 无符号32比特整数,[0, 4294967295] (4字节每像素)
数值型 int8 有符号8比特整数,[-128, 127] (1字节每像素)
数值型 int16 有符号16比特整数,[-32768, 32767] (2字节每像素)
数值型 int32 有符号32比特整数,[-2147483648, 2147483647] (4字节每像素)
数值型 single 单精度浮点数,-103810^{38}~ 103810^{38} (4字节每像素)
字符型 char 字符(2字节每像素)
逻辑型 logical 值为0或1(1字节每像素)

IPT支持的图像类型:

灰度图像

一幅灰度图像是一个数据矩阵

像素的数据类型可以是uint8或uint16, 此时取值范围分别是[0,255]或[0, 65535]的整数值

也可以是double, single,此时像素值是浮点数,通常归一化为[0,1], 也可取其他范围值

二值图像

二值图像是取值只有0,1的逻辑数组。取值为0,1的数值型数组在Matlab中不认为是二值图像

索引图像

基本结构

  • 整数数据矩阵X
  • 彩色映射矩阵map

map是m×3m\times 3 的矩阵,元素是double类,取值在[0,1]之间,每行代表一个归一化的RGB三原值,m表示颜色总数

X存储颜色索引

如果X是double类,则小于或等于1的所有值对应map的第一行,所有等于2的值对应第二行,以此类推

如果X是uint8,uint16,则0对应第一行,1对应第二行,以此类推

RGB图像

基本结构

M×N×3M\times N\times 3 数组

数组每个元素的数据类型:

  • double: 取值范围[0,1]
  • uint8: 取值范围[0,255]
  • uint16: 取值范围[0,65535]

每个像素是一个三维向量[r,g,b],分别表示红,绿,蓝分量

色彩数:(2b)3(2^b)^3 ,b代表数组每个元素的比特数

术语:通常提到一幅图像时,是指 “data_class image_type 图像”。 data_class是MATLAB支持的数据类型,image_type是IPT支持的图像类型

数据类型转换

语法: B=data_class_name(A)B = data\_class\_name(A)

  • data_class_name可以是MATLAB支持的任意一种数据类型,如:

    B=double(A)B = double(A)

    会将A转换为double类型B

  • 任何数值型转换为逻辑型时,非0值转换为逻辑值1,0值转换为逻辑值0

  • double是MATLAB的默认类型,double转换为整型时,小于该整型取值范围最小值的均转换为最小值,大于该整型取值范围最大值的均转换为最大值,小数部分直接舍去。如:

    input:

     a = int8(-129)
     b = int8(3.23)
     c = logical([0 1 2;1 2 3;3.2 0.0 -1])
    

    output

     a =
     
       int8
     
        -128
     b =
     
       int8
     
        3
     c =
     
       3×3 logical 数组
     
        0   1   1
        1   1   1
        1   0   1
    

判断逻辑类型

语法:islogical(A)islogical(A)

  • 输入数据A,判断A的类型是否为logical,是则返回1,否则返回0。如:

input:

 a = 7;
 islogical(a)

output:

 ans =
 
   logical
 
    0

input:

 a = logical(7);
 islogical(a)

output:

 ans =
 
   logical
 
    1

图像读取

函数imread

语法: imread(filename)imread('filename')

  • filename是图像全名(包含扩展名)的字符串。当filename不含路径信息时,imread会在当前目录中寻找文件,若找不到,则会在MATLAB搜索路径中找。
  • 读取指定路径中的图像,可在filename中输入绝对路径或相对路径。如:
    input:
     f = imread('F:\Matlab\chapter1\rose_512.tif');
    
  • imread支持的图像格式:
    格式名称 描述 可识别扩展名
    TIFF 加表识的图像文件格式 .tif , .tiff
    JPEG 联合图像专家组 .jpg , .jpeg
    GIF 图形交换格式 .gif
    BMP windows位图 .bmp
    PNG 可移植网络图形 .png
    XWD X windows 转储 .xwd
  • 函数size:
    输入一个多维数组,返回数组的形状,相当于numpy中数组的shape
    input:
     A = [5 6 7;1 2 3];
     A(:,:,2) = [2 3 4; 5 6 7];
     size(A)
    
    output:
     ans =
     
          2     3     2
    
  • 函数whos:
    输入一个数组,返回数组的附加信息。
    input:
     f = [1 2 3; 4 5 6; 7 8 9];
     whos f
    
    output:
      Name      Size            Bytes  Class     Attributes
    
      f         3x3                72  double   
    

图像显示

函数imshow

语法一: imshow( f, G)

  • f 是一个图像数组,G是灰度级数,默认256.
  • 例:
    input:
     f = imread('rose_512.tif');
     imshow(f)
    
    output:
    3.9

语法二: imshow(f ,[low , high])

  • 将小于等于low的值显示为黑色,大于等于high的值显示为白色,中间像素值按比例显示为各个等级的灰度值
    如imshow(f, [0,58]),相当于0-58被线性拉伸到0-255显示

语法三: imshow(f, [ ])

  • 这个形式相当于语法二中low取f的最小值,high取f的最大值

  • 这个形式在显示一幅动态范围较小的图像或者既有正值又有负值的图像时有优势
    input:

     >> f = imread('D:\typora图片\Fig0203(a)(chest-xray).tif');
     >> figure
     >> subplot(1,2,1);imshow(f),title('imshow(f)');
     >> subplot(1,2,2);imshow(f,[]),title('imshow(f,[])');
    

    3.10

  • 如果f为double型,一定要用这个形式

图像保存

函数imwrite

语法: imwrite(f, ‘filename’)

  • filename必须包含可识别的文件格式扩展名,如:
      imwrite(f,'picture.tif')
      imwrite(f,'picture1','tif')
    
  • filename如不包含路径信息,则文件保存到当前工作目录
  • 只适用于jpg图像:
    imwrite(f , ‘filename.jpg’, ‘quality’ , q)
    • q是0-100之间的整数,q越小,图像压缩越厉害,图像退化越严重

    • 例:
      input:

       >> f = imread('D:\typora图片\Fig0204(a)(bubbles-q-100jpg).tif');
       >> imwrite(f,'bubbles50.jpg','quality',50)
       >> imwrite(f,'bubbles25.jpg','quality',25)
       >> imwrite(f,'bubbles15.jpg','quality',15)
       >> imwrite(f,'bubbles5.jpg','quality',5)
       >> imwrite(f,'bubbles0.jpg','quality',0)
       >> f100 = imread('bubbles-q-100.tif');
       >> f50 = imread('bubbles50.jpg');
       >> f25 = imread('bubbles25.jpg');
       >> f15 = imread('bubbles15.jpg');
       >> f5 = imread('bubbles5.jpg');
       >> f0 = imread('bubbles0.jpg');
       >> figure
       >> subplot(2,3,1);imshow(f100),title('原图');
       >> subplot(2,3,2);imshow(f50),title('q=50');
       >> subplot(2,3,3);imshow(f25),title('q=25');
       >> subplot(2,3,4);imshow(f15),title('q=15');
       >> subplot(2,3,5);imshow(f5),title('q=5');
       >> subplot(2,3,6);imshow(f0),title('q=0');
      

      output:

      3.11
      压缩图像是为了降低存储量,减少传输时间,但压缩过大就会失真,通常判断压缩是否合理,就看有没有明显的伪轮廓线。

      • 使用函数imfinfo保存图像信息
        语法一: imfinfo filename
        • filename是图像全名
        • 例:
          input:
           >> imfinfo bubbles25.jpg
          
          output:
           ans = 
           
             包含以下字段的 struct:
           
                      Filename: 'F:\Matlab\chapter1\bubbles25.jpg'
                   FileModDate: '07-Jun-2019 12:50:34'
                      FileSize: 13354
                        Format: 'jpg'
                 FormatVersion: ''
                         Width: 720
                        Height: 688
                      BitDepth: 8
                     ColorType: 'grayscale'
               FormatSignature: ''
               NumberOfSamples: 1
                  CodingMethod: 'Huffman'
                 CodingProcess: 'Sequential'
                       Comment: {}
          
        语法二: K = imfinfo(‘filename’)
        • 例:计算压缩比
          input:
           >> K = imfinfo('bubbles25.jpg');
           >> image_bytes = K.Width*K.Height*K.BitDepth/8;
           >> compressed_bytes = K.FileSize;
           >> compression_ratio = image_bytes/compressed_bytes
          
          output:
           compression_ratio =
           
              37.0945
          
  • 只适用于tif图像:
    imwrite(f,filename.tif,compression,parameter,...,resolution,[colres,rowres])imwrite(f , 'filename.tif' , 'compression' , 'parameter' , ... , 'resolution' , [colres , rowres])
    • parameter的主要值:
      • none 表示无压缩
      • packbits 比特包压缩(非二值图像的默认参数)
      • ccitt ccitt压缩(二值图像的默认参数)
    • [colres , rowres] 两个整数,默认[72, 72]。分别以每单位像素点的个数(dpi)表示列分辨率与行分辨率。
      换成标量res,等价于[res, res]
    • 例:
      以下原图是一块电路板的8比特X光图像,格式jpg,分辨率200dpi,图像大小 450×450450\times 450 ,尺寸 2.25×2.252.25\times 2.25 英寸。
      把这幅图以 tif 格式存为无压缩的名为 sf 的图像,尺寸减到 1.15×1.151.15\times 1.15 英寸,像素数仍保持 450×450450\times 450
       >> f = imread('D:\typora图片\2.10.jpg');
       >> imwrite(f,'sf.tif','compression','none','resolution',[300,300])
       >> g = imread('sf.tif');
       >> figure
       >> subplot(1,2,1);imshow(f),title('原图');
       >> subplot(1,2,2);imshow(g),title('sf.tif');
      
      2.11
    • imwrite支持的图像格式:
      格式名称 描述 可识别扩展名
      TIFF 加表识的图像文件格式 .tif , .tiff
      JPEG 联合图像专家组 .jpg , .jpeg
      XWD X windows 转储 .xwd
      BMP windows位图 .bmp
      PNG 可移植网络图形 .png

图像类型转换

2.12

  • im2uint8
    语法: g=im2uint8(f)g = im2uint8(f)

    • f为输入图像,im2uint8将小于0的值设置为0,大于1的值设置为255,其余值乘以255,若为小数则四舍五入为最接近的整数。
  • im2uint16
    同im2uint8,只是255改成65535.

  • mat2gray
    语法: g=mat2gray(A,[Amin,Amax])g = mat2gray(A, [Amin, Amax])

    • 输出为double类,范围[0,1]
    • [Amin, Amax]默认是A中元素实际的最小值与最大值。将小于Amin的值变为0,大于Amax的值变为1,中间值线性伸缩到[0.1]
    • 可用于将double类图像归一化
  • im2double

    • 将图像转化为double类,范围[0,1],若输入已经是double类,则输出与输入相同。
    • 不能对double类图像归一化
  • im2bw
    语法: g=im2bw(f,T)g = im2bw(f, T)

    • T取值[0,1],默认0.5
    • im2bw接收图像f,根据图像类型对f做归一化,然后将小于T的值变为逻辑值0,大于或等于T的值变为逻辑值1,返回一个二值图像

数组索引

向量索引

  • MATLAB的索引是从1开始的
  • a:b 表示取 [a,b] 之间的整数
  • end表示最后一个元素的索引值
  • v[:] 产生一个列向量,v[1:end] 产生一个行向量
  • a:step:b 表示在[a,b]间依步长step取相应元素
  • end:-k:1 表示按步长k的倒序取值
  • linspace
    语法: x=linspace(a,b,n)x = linspace(a, b, n)
    • 产生一个以a为首项,b为末项,项数为n的等差数列构成的向量
  • 一个向量可以作为另一个向量的指标向量,如:
     >> v =[2 4 6 8 10 12 14 16];
     >> v([2 4 6])
    
     ans =
     
          4     8    12
    

矩阵索引

  • 每个维度都支持向量索引的方式

  • 使用向量做索引值
    语法: A[u,v]

    • A是一个 矩阵,u,v是行向量,返回以u为行标,v为列标的A的子矩阵。
  • 使用矩阵寻址的方式
    例:用逻辑数组取出逻辑值1位置处的元素,返回一个列向量

  • A ( : ) 以逐列的顺序返回A所有元素构成 的列向量

  • 使用数组索引进行简单的图像操作

     >> f = imread('D:\typora图片\Fig0219(rose1024).tif');
     >> fp = f(end:-1:1,:);
     >> fc = f(233:666,233:666);
     >> fs = f(1:2:end,1:2:end);
     >> plot(f(512,:))
     >> figure
     >> subplot(1,4,1);imshow(f),title('原图');
     >> subplot(1,4,2);imshow(fp),title('翻转');
     >> subplot(1,4,3);imshow(fc),title('截取部分');
     >> subplot(1,4,4);imshow(fs),title('二次取样');
    

    2.14
    2.13

选择数组的维数

一类操作: operation(A,dim)operation(A,dim)

  • operation表示MATLAB的一种可用操作,A是数组,dim是标量
  • 例:
    • A是 M×NM\times N 的数组
      k = size(A,1)给出A的行数,MATLAB中1代表垂直方向,2代表水平方向。
  • ndims
    语法: d = ndims(A)
    • 类似于numpy的维度,但MATLAB中ndims不小于2
       >> A = 1;
       >> B = [2 2];
       >> C = [2 3;3 4];
       >> D(:,:,1) = [2 3 ;4 5];
       >> D(:,:,2) = [6 7;8 9];
       >> ndims(A),ndims(B),ndims(C),ndims(D)
      
       ans =
       
            2
       
       
       ans =
       
            2
       
       
       ans =
       
            2
       
       
       ans =
       
            3
      
      

一些重要的标准数组

  • zeros(M,N) 生成一个大小为 M×NM\times N 的double类矩阵,元素全为0
  • ones(M,N) 生成一个大小为 M×NM\times N的double类矩阵,元素全为1
  • ture(M,N) 生成一个大小为 M×NM\times N 的logical类矩阵,元素全为逻辑值1
  • false(M,N) 生成一个大小为 M×NM\times N 的logical类矩阵,元素全为逻辑值0
  • magic(M) 生成一个大小为 M×MM\times M的 ”魔术方阵“,每行每列两条主对角线元素之和相等,元素均为整数。
  • rand(M,N) 生成一个大小为 M×NM\times N 的矩阵,元素是[0,1]中均匀分布的随机数
  • randn(M,N) 生成一个大小为 M×NM\times N 的矩阵,元素是服从标准正态分布的随机数

M函数编程

M文件

  • 功能:可以是执行一列MATLB语句的脚本,也可以是函数
  • 文件格式:filename.m
  • 组成部分:
    • 函数定义行
      function [outputs] = name(inputs)
    • H1行
    • 帮助文本
    • 函数体
    • 命令

运算符

  • 算术运算符
    2.5

    • 注意:MATLAB不复制信息
      例:
       >> A = [1 2 3];
       >> B = A;
       >> A = [1 2 4];
       >> B 
      
       B =
       
            1     2     3
      
      第二行命令只是记录了B=A,并不把数据复制给B,但第三行A要改变时,才将数据复制给B
  • IPT支持的图像运算函数

2.6

  • 关系运算符
    2.7

    • 数组之间比较,必须形状相同,相同位置的元素进行比较
    • 数组与标量比较,是数组的每个元素分别和标量比较
  • 逻辑运算符
    2.8

    • 数组之间进行逻辑运算,必须形状相同,相同位置的元素进行逻辑运算
    • 数组与标量做逻辑运算,是数组的每个元素分别和标量做逻辑运算
  • 逻辑函数

    2.9
    2.15
    2.16

  • 一些重要的变量与常量
    2.17

    • eps经常用于加在分母中,防止因分母接近0而使计算溢出

流程控制

2.18

  • 条件分支
    通用形式语法:

      if expression1
          statements1
      elseif expression2
          statements2
      ...
          
      else expressionk
          statementsk
      end
    

    例:计算图像的平均亮度

     function ave = average(A)
     %AVERAGE computes the average value of an array
     % av=average(A) computes the average value of input array,A, which must be 
     % 1-D or 2-D array
     % check the validity of input
     
     if ndims(A) > 2
         error('The dimension of input can not exceed 2!')
     end
     
     %compute the average
     ave = sum(A(:))/length(A(:));
    
    • 函数numel可以统计数组的元素个数
  • for 循环
    语法:

     for index = start:step:endpoint
         statements
     end
    
    • 可以嵌套
  • while循环
    语法:

     while expresssion
         statements
     end
    
  • break
    退出包含它的最内层循环

  • continue
    直接进入包含它的循环的下一次迭代

  • switch

     switch switch_expresssion
         case case_expression1
             statement(s)
         case case_expression2
             statement(s)
         ...
         otherwise
             statement(s)
     end
    
    • 例:从给定图片中提取子图像
       function s = subim(f,m,n,rx,cy)
       %SUBIM extracts a subimage s from a given image f
       % The subimage is of size m_by_n, and the coordinates of its top_left
       % conner are (rx,cy)
       
       s = zeros(m,n);
       rowhigh = rx + m - 1;
       colhigh = cy + n - 1;
       xcount = 0;
       for r = rx:rowhigh
           xcount = xcount + 1;
           ycount = 0;
           for c = cy:colhigh
               ycount = ycount + 1;
               s(rcount, ycount) = f(r,c);
           end
       end
      

代码优化

  • 向量化循环

    • 原理:利用矩阵运算避免显式地使用循环

    • 例:生成一个一维函数,函数形式是:
      f(x)=Asin(x/2π)f(x)=Asin(x/2\pi)
      其中x=0,1,...,M1x=0,1,...,M-1

      • for循环
         for x = 1:M
             f(x) = A*sin(x/(2*pi));
         end
        
      • 向量化
         x = 1:M;
         f(x) = A*sin(x/(2*pi));
        
    • 二维函数情形
      meshgrid
      语法: [C,R] = meshgrid(c,r)

      • 输入c,r是行向量,输出数组C的行是向量c的副本,输出数组R的列是向量r的副本
      • 例:
        input:
         >> r = [0 1 2];
         >> c = [0 1];
         >> [C,R] = meshgrid(c,r), h = R.^2+C.^2
        
        output:
         C =
         
              0     1
              0     1
              0     1
         
         
         R =
         
              0     0
              1     1
              2     2
         
         
         h =
         
              0     1
              1     2
              4     5
        
        • h(i,j)=R(i,j)2+C(i,j)2h(i,j)=R(i,j)^2+C(i,j)^2
        • 注意:MATLAB的索引不能是0
    • 例:比较两种方式的计算速度
      编写一个M文件,比较for循环与向量化代码的运算速度,所实现的二维函数:
      f(x,y)=Asin(u0x+v0y)f(x,y)=Asin(u_0 x+v_0 y)
      x=0,1,...,M1,y=0,1,...,N1x=0,1,...,M-1 , y=0,1,...,N-1
      函数输入:A,u0,v0,M,NA,u_0,v_0,M,N
      函数输出:由两种方式生成的图像,以及所用时间之比

       function [tratio, f, g] = two_method_sin(A, u0, v0, M, N)
       %TWO_METHOD_SIN Compares for loops vs. vectorization
       %   The comparison is based on implementing the function 
       %   f(x,y)=Asin(u0*x+v0*y) for x=0,1,...,M-1 and y=0,1,...N-1
       %   The inputs to the function are M and N and the constants in the
       %   function
       
       % first implement using for loops
       tic % start timing
       for r = 1:M
           u0x = u0*(r-1);
           for c = 1:N
               v0y = v0*(c-1);
               f(r,c) = A*sin(u0x + v0y);
           end
       end
       t1 = toc; % end timing
       
       % now implement using vectorization
       tic % start timing
       r = 0:M-1;
       c = 0:N-1;
       [C,R] = meshgrid(c,r);
       g = A*sin(u0*R + v0*C);
       t2 = toc; % end timing
       
       % compute the ratio of the two times
       tratio = t1/(t2 + eps); % use eps in case t2 is close to 0
      
       >> [rt,f,g] = two_method_sin(1, 1/(4*pi), 1/(4*pi), 512, 512);
       >> rt
       
       rt =
       
          10.9560
      
    • 提取图片中某一矩形区域
      区域左上角坐标为(rx,ry)(rx,ry) , 大小为 m×nm\times n , f 是将要提取的图像。

       rowhigh = rx + m - 1;
       colhigh = ry + n - 1;
       s = f(rx:rowhigh, ry:colhigh);
      
  • 预分配数组

    • 例:为了处理1024×10241024\times 1024 的图像,先预分配一个全为0的数组
       >> f = zeros(1024);
      
    • 原理:处理大数组时,有时会出现没有足够的连续空间的情形,预分配数组阻止了这一情形

交互式I/O

  • disp
    语法: disp(argument)
    • argument是数组时,显示数组
    • argument是字符串时,显示字符串
      例:
        >> A = [1 2 3]
        
        A =
        
             1     2     3
        
        >> disp(A)
             1     2     3
        
        >> disp('Hello MATLAB!')
        Hello MATLAB!
      
  • input
    语法: t = input(‘message’ , ‘s’)
    • 用于将数据传入M函数
    • 输出message的内容,接收一个字符串,字符串的内容可以由逗号或空格隔开
      例:
       >> t = input('enter some data:','s')
       enter some data:1 2 3
       
       t =
       
           '1 2 3'
       
       >> class t
       
       ans =
       
           'char'
       
       >> size(t)
       
       ans =
       
            1     5
       
       >> n = str2num(t)
       
       n =
       
            1     2     3
       
       >> size(n)
       
       ans =
       
            1     3
       
       >> class(n)
       
       ans =
       
           'double'
      
  • strread
    语法: [a,b,c,…] = strread(cstr , ‘format’ , ‘param’ , ‘value’)
    • 用于处理既有字符串,又有数字的输入
    • format指定格式,如%f表示浮点数,%q表示字符串
    • param 通常是delimiter
    • value 通常是空格或逗号
      例:
       >> t = '2.3,hello,x';
       >> [a,b,c] = strread(t,'%f%q%q','delimiter',',');
       >> a,b,c
       
       a =
       
           2.3000
       
       
       b =
       
         1×1 cell 数组
       
           {'hello'}
       
       
       c =
       
         1×1 cell 数组
       
           {'x'}
      
    • strcmp比较字符串是否相同
    • lower/upper 将字符串改成小写/大写

单元数组与结构

  • 单元数组

    • 相当于将不同类型的对象组合在一起的容器
    • 例:
      input:
       >> c = {'gauss',[1.0 3.0],3},c{1}
      
      output:
       c =
       
         1×3 cell 数组
       
           {'gauss'}    {1×2 double}    {[3]}
       
       
       ans =
       
           'gauss'
      
    • 它包含的是参量的副本,参量在后续程序中改变,单元数组不变
  • 结构

    • 有点类似于C++中的结构体
    • 例:
      input:
       >> S.char_str = 'gauss';
       >> S.matrix = [1.0 3.0];
       >> S.scalar = 3;
       >> S.matrix
      
      output:
       ans =
       
            1     3
      

参考文献

《数字图像处理第三版》(冈萨雷斯)
《数字图像处理(matlab)》

2016-09-20 18:34:30 heyuchang666 阅读数 3590
  • 定义与预处理、函数和函数库-C语言专题第6部分

    本课程综合讲解了C语言的预处理和宏定义,详细讲述了宏定义的细节规则和头文件包含等常用预处理;然后讲述了函数的使用、函数库的使用,静态链接库和动态链接库等的制作和使用。本章的目标是提升大家对函数及函数库的认知,提升在实战中使用函数库解决问题的能力。

    8069 人正在学习 去看看 朱有鹏
数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。在计算机中,按照颜色和灰度的多少可以将图像争为二值图像、灰度图像、索引图像和真彩色RGB图像四种基本类型。目前,大多数图像处理软件都支持这四种类型的图像。

(1) 二值图像:

        一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。

(2) 灰度图像:

        灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。在某些软件中,灰度图像也可以用双精度数据类型(double)表示,像素的值域为[0,1],0代表黑色,1代表白色,0到1之间的小数表示不同的灰度等级。二值图像可以看成是灰度图像的一个特例。

(3) 索引图像:

        索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。

(4) RGB彩色图像:

        RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。
2018-12-04 21:36:26 u010608296 阅读数 298
  • 定义与预处理、函数和函数库-C语言专题第6部分

    本课程综合讲解了C语言的预处理和宏定义,详细讲述了宏定义的细节规则和头文件包含等常用预处理;然后讲述了函数的使用、函数库的使用,静态链接库和动态链接库等的制作和使用。本章的目标是提升大家对函数及函数库的认知,提升在实战中使用函数库解决问题的能力。

    8069 人正在学习 去看看 朱有鹏

图像处理入门:基本概念

2018年05月18日 15:25:39 M_Z_G_Y 阅读数:161

数字图像:每一个数字图像都是一个像素点矩阵,这个矩阵包含所有像素点的强度值

 

像素点:最小的图像单元,一张图像由好多的像素点组成。像素就是图像的尺寸

位图:也称点阵图,它是由许多点组成的,这些点称为像素。当许多不同颜色的点组合在一起后,便构成了一副完整的图像。 位图可以记录每一个点的数据信息,从而精确地制作色彩和色调变化丰富的图像。但是,由于位图图像与分辨率有关,它所包含的图像像素数目是一定的,若将图像放大到一定程度后,图像就会失真,边缘出现锯齿。

灰度:表示图像像素明暗程度的数值,也就是黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0。灰度值指的是单个像素点的亮度,灰度值越大表示越亮。灰度级表明图像中不同灰度的最大数量灰度级越大,图像的亮度范围越大。

通道:把图像分解成一个或多个颜色成分;①单通道:一个像素点只需一个数值表示,只能表示灰度,0为黑色; ②三通道:RGB模式,把图像分为红绿蓝三个通道,可以表示彩色,全0表示黑色;③四通道:在RGB基础上加上alpha通道,表示透明度,alpha=0表示全透明

深度:深度即位数(比特数)①位深:一个像素点所占的总位数,也叫像素深度、图像深度等,其中位深 = 通道数 × 每个通道所占位数  ②256色图:n位的像素点可以表示2^n种颜色,称2^n色图,n=8时为256色图 ③8位RGB与8位图:前者的位数指每个通道所占的位数,后者指整个像素点共占的位数,其中8位RGB是一个24位图,也称为真彩

对比度:指不同颜色之间的差别。对比度越大,不同颜色之间的反差越大,即所谓黑白分明,对比度过大,图像就会显得很刺眼。对比度越小,不同颜色之间的反差就越小。对比度=最大灰度值/最小灰度值

亮度:指照射在景物或图像上光线的明暗程度。图像亮度增加时,就会显得耀眼或刺眼,亮度越小时,图像就会显得灰暗。

色相:颜色,调整色相就是调整景物的颜色,例如,彩虹由红、橙、黄、绿、青、蓝、紫七色组成,那么它就有七种色相。顾名思义即各类色彩的相貌称谓,如大红、普蓝、柠檬黄等。色相是色彩的首要特征,是区别各种不同色彩的最准确的标准。事实上任何黑白灰以外的颜色都有色相的属性,而色相也就是由原色、间色和复色来构成的

色调:各种图像色彩模式下原色的明暗程度,级别范围从0到255,共256级色调。例如对灰度图像,当色调级别为255时,就是白色,当级别为0时,就是黑色,中间是各种程度不同的灰色。在RGB模式中,色调代表红、绿、蓝三种原色的明暗程度,对绿色就有淡绿、浅绿、深绿等不同的色调。

色调是指色彩外观的基本倾向。在明度、纯度、色相这三个要素中,某种因素起主导作有用,可以称之为某种色调

饱和度:指图像颜色的浓度。饱和度越高,颜色越饱满,即所谓的青翠欲滴的感觉。饱和度越低,颜色就会显得越陈旧、惨淡,饱和度为0时,图像就为灰度图像。可以通过调整电视机的饱和度来进一步理解饱和度的概念。

频率:灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。低频就是颜色缓慢地变化,也就是灰度缓慢地变化,就代表着那是连续渐变的一块区域,这部分就是低频。 高频就是频率变化快,即相邻区域之间灰度相差很大,这就是变化得快。图像中,一个影像与背景的边缘部位的频率高,即高频显示图像边缘。图像的细节处也是属于灰度值急剧变化的区域,正是因为灰度值的急剧变化,才会出现细节。另外噪声(即噪点)也是这样,在一个像素所在的位置,之所以是噪点,就是因为它与正常的点颜色不一样了,灰度有了快速地变化。固有“图像的低频是轮廓,高频是噪声和细节”。

空域:也叫空间域,即所说的像素域,在空域的处理就是在像素级的处理,如在像素级的图像叠加。通过傅立叶变换后,得到的是图像的频谱。表示图像的能量梯度。

频域: 也叫频率域,任何一个波形都可以分解成多个正弦波之和。每个正弦波都有自己的频率和振幅。所以任意一个波形信号有自己的频率和振幅的集合。频率域就是空间域经过傅立叶变换的信号

图像分辨率:每英寸图像内的像素点数。分辨率越高,像素的点密度越高,图像越逼真。

空间分辨率:图像中可辨别的最小细节的度量,如果一幅图像的尺寸为MxN,表明在成像时采集了MxN个样本,空间分辨率是MxN。

灰度分辨率:在灰度级中可分辨的最小变化,在数字图像处理教程中,灰度分辨率指的是色阶,色阶是表示图像亮度强弱的指数标准,也就是我们说的色彩指数。灰度分辨率指亮度,和颜色无关,但最亮的只有白色,最不亮的只有黑色。

颜色空间(颜色模型):描述颜色的三维空间坐标系,一个颜色定义为颜色空间的一个点。

1.灰度模式:“灰度”模式可以表现出丰富的色调,但是也只能表现黑白图像。“灰度”模式图像中的像素是由8位的分辨率来记录的,能够表现出256种色调,从而使黑白图像表现的更完美。灰度模式的图像只有明暗值,没有色相和饱和度这两种颜色信息。其中,0%为黑色,100%为白色,K值是用来衡量黑色油墨用量的。使用黑白和灰度扫描仪产生的图像常以灰度模式显示。

2.位图模式:“位图”模式的图像又叫黑白图像,它用黑、白两种颜色值来表示图像中的像素。其中的每个像素都是用1 bit的位分辨率来记录色彩信息的,占用的存储空间较小,因此它要求的磁盘空间最少。位图模式只能制作出黑、白颜色对比强烈的图像。如果需要将一副彩色图像转换成黑白颜色的图像,必须先将其转换成“灰度”模式的图像,然后再转换成黑白模式的图像,即“位图”模式的图像。

在OpenCV中,彩色图像使用OpenCV加载时是BGR模式。但是在Matplotlib中是RGB模式,所以彩色图像如果已经被OpenCV读取,那他将不会被Matplotlib正确显示。

3.HSV颜色模型:也称六角锥体模型(Hexcone Model)。、这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。在HSV颜色空间中要比在BGR空间中更容易表示一个特定颜色。

H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。相隔120度。互补色分别相差180度。

V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。(以下的HSI模型应该就是HSV模型)

 

图像描述:

 

距离度量:描述图像中像素之间的距离。

欧几里得距离:距离点(i,j)小于或者等于某一值是以点(i,j)为原点的圆

城市街区(小区)距离:距离点(i,j)小于或者等于某一值是以点(i,j)为中心的菱形

棋盘距离距离:;距离点(i,j)小于或者等于某一值是以点(i,j)为中心的正方形

 

2019-05-12 19:37:12 nanhuaibeian 阅读数 2928
  • 定义与预处理、函数和函数库-C语言专题第6部分

    本课程综合讲解了C语言的预处理和宏定义,详细讲述了宏定义的细节规则和头文件包含等常用预处理;然后讲述了函数的使用、函数库的使用,静态链接库和动态链接库等的制作和使用。本章的目标是提升大家对函数及函数库的认知,提升在实战中使用函数库解决问题的能力。

    8069 人正在学习 去看看 朱有鹏

一、数字图像处理的概念

  1. 图像:图像可以定义为一个二维函数f(x,y),其中x和y是空间坐标,而f在任意坐标(x,y)处的幅度称为图像在该点处的亮度(图像的明亮程度)或者灰度
  2. 数字图像:指图像f(x,y)在空间坐标和亮度的数字化,数字图像由有限的元素组成,每一个元素都有一个特定的位置和幅值,这些元素称为图片元素、图像元素或像素
  3. 数字图像处理:是指借用数字计算机处理数字图像,既包括输入输出都是图像的处理,也包括从图像中提取特征的过程。
  4. 灰度图像可以看成一个矩阵,也可以看成一个二维离散函数

二、认识 MATLAB

MATLAB桌面是MATLAB的主要工作环境,它是针对诸如运行MATLAB命令、观察输出、编辑和管理文件与变量、观察回话历史等任务的一个图形工具集。

  1. 命令窗口:输入MATLAB命令的地方,可以调用MATLAB函数,或者给变量赋值

  2. 常用命令:
    clear:从工作空间删除所有变量
    clc:清除命令窗口的内容
    edit:打开编辑器

  3. 获取帮助在这里插入图片描述
    需要注意的是需要注册账户才可以使用MATLAB的帮助文档。
    在这里插入图片描述

三、数字图像的表示

  1. 彩色图像:是由多幅单色图像组合而成,比如在RGB彩色系统中,一副彩色图像是由三幅单色图像组成的,这三幅图像分别称为
    红®、绿(G)、蓝(B)原色图像

  2. 图像关于x坐标、y坐标和幅度是连续的,将这样的一幅图像转换成数字形式,要求对坐标和幅度进行数字化。将坐标值数字化称为采样,将幅值数字化称为量化,因此当x,y和幅值f都是有限的、离散的量时,我们称该图像为数字图像
    其他解释:
    对于一幅图像,我们可以将其放入坐标系中,这里取图像左上定点为坐标原点,x 轴向右,和笛卡尔坐标系x轴相同;y 轴向下,和笛卡尔坐标系y轴相反。这样我们可将一幅图像定义为一个二维函数 f(x,y),图像中的每个像素就可以用 (x,y) 坐标表示,而在任何一对空间坐标 (x,y) 处的幅值 f 称为图像在该点的强度或灰度,当 x,y 和灰度值 f 是有限离散数值时,便称该图像为 数字图像

  3. 坐标约定:采样和量化得到的是一个实数矩阵
    (1)多数图像处理书籍中使用的坐标约定: 假设对一幅图像f(x,y)采样后得到一个M行、N列的图像,称这幅图像的大小为M x N,离散的坐标都取整数值,坐标原点在(0,0)处,其中x的范围(0 ~ M-1),y的范围(0 ~ N-1)
    在这里插入图片描述
    灰度图像可以看成一个矩阵,也可以看成一个二维离散函数

    (2)图像处理工具箱中所用的坐标约定:使用(r,c)来表示行和列,坐标原点在(1,1)处,其中r的范围(1 ~ M),c的范围(1 ~ N)
    在这里插入图片描述

(3)空间坐标的坐标约定:不太常用,以x表示列,y表示行

  1. 图像的矩阵表示
    提示:矩阵是二维的,阵列可以是任意有限维
    在这里插入图片描述
    等式的右边定义的是一幅数字图像,这个阵列的每个元素都称为图像元素、图画元素或者像素每一个元素都有一个位置和幅值
    例如:
    在这里插入图片描述
    其中f(1,1)等于f(0,0),符号f(p,q)表示第p行和第q列的元素
    一个1 x N 的矩阵称为一个行向量,一个M x 1 的矩阵称为一个列向量,一个1x1的矩阵被称为标量

  2. MATLAB中的矩阵存储在名如A、a、RGB等的变量中,变量必须以字母开头,只能有数字、字母和下划线组成

2017-12-29 14:49:39 IT_job 阅读数 695
  • 定义与预处理、函数和函数库-C语言专题第6部分

    本课程综合讲解了C语言的预处理和宏定义,详细讲述了宏定义的细节规则和头文件包含等常用预处理;然后讲述了函数的使用、函数库的使用,静态链接库和动态链接库等的制作和使用。本章的目标是提升大家对函数及函数库的认知,提升在实战中使用函数库解决问题的能力。

    8069 人正在学习 去看看 朱有鹏

数字图像处理之前需要先进行图像数字化:图像数字化图像数字化是计算机处理图像之前的基本步骤,目的是把真实的图像转变成计算机能够接受的存储格式,数字化过程分为采样和量化两个步骤。

数字图像处理的框架大体分为如下8个部分

 

1.    图像变换

有时候,直接对图像进行处理会遇到一些困难,为了有效和快速地对图像进行处理和分析,需要将原定义在图像空间的图像以某种形式转换到另外的空间,利用空间的特有性质方便地进行一定的加工,最后再转换回图像空间以得到所需的效果。经过变换后的图像往往更有利于特征提取、增强、压缩和编码。

 

常用技术

1.卷积

2.梯度和Sobel导数

3.拉普拉斯变换

4.Canny算子

5.霍夫变换

6.重映射

7.几何操作:拉伸、收缩、扭曲和旋转

8.离散傅里叶变换(DFT)

9.离散余弦变换(DCT)

10.哈儿变换

11斜变换

 

2.    形态学图像处理

数学形态学是一门20世纪60年代发展起来的理论,用于分析和处理离散图像。它定义了一系列运算,用预先定义的形状元素探测图像,从而实现图像的转换。这个结构元素与像素领域的相交方式决定了运算的结果。

 

常用技术

1.平滑处理

2.膨胀与腐蚀

3.开启操作与闭合操作

4.检测边缘和角点

 

3.    图像边缘检测

边缘检测的目标是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反应了属性的重要事件和变化,包括:(1)深度上的不连续(2)表面方向的不连续(3)物质属性变化(4)场景照明变化。

 

常用技术

1.Sobel算子

2.Isotropic Sobel算子

3.Roberts算子

4.Prewitt算子

5.Laplacian算子

6.Canny算子

 

4.     图像增强和复原

利用数字图像处理技术可以将图像中感兴趣部分加以强调,对不感兴趣的部分予以抑制,强调后的部分对使用者更为清晰,甚至能给出一定的数量分析或不同颜色的表示。这种技术常称为图像增强。图像复原是通过图像滤波实现的。

 

常用技术

4.1空间域法

4.1.1点运算算法

4.1.1.1灰度级校正

4.1.1.2灰度变换(又叫对比度拉伸)

4.1.1.3直方图修正

 

4.1.2邻域去噪算法。

4.1.2.1图像平滑

4.1.2.1.1均值滤波

4.1.2.1.2中值滤波

4.1.2.1.3空域滤波

4.1.2.2锐化

4.1.2.2.1梯度算子法、

4.1.2.2.2二阶导数算子法、

4.1.2.2.3高通滤波、

4.1.2.2.4掩模匹配法

 

4.2频率域法

4.2.1理想低(高)通滤波器、

4.2.2巴特沃斯低(高)通滤波器、

4.2.3高斯低(高)通滤波器、

4.2.4指数滤波器

 

5 图像压缩编码

在满足一定保真度的要求下,对图像数据的进行变换、编码和压缩,去除多余数据减少表示数字图像时需要的数据量,以便于图像的存储和传输。即以较少的数据量有损或无损地表示原来的像素矩阵的技术,也称图像编码。

 

常用技术

5.1无损图像压缩方法

5.1.1行程长度编码

5.1.2熵编码法

5.1.3LZW算法

 

5.2有损压缩方法

5.2.1将色彩空间化减到图像中常用的颜色。

5.2.2色度抽样

5.2.3变换编码

5.2.4分形压缩

 

6.     图像分割

在计算机视觉理论中,图像分割、特征提取与目标识别构成了由低层到高层的三大任务.目标识别与特征提取都以图像分割作为基础 ,图像分割结果的好坏将直接影响到后续的特征提取与目标识别图像分割是将图像中有意义的特征或区域提取出来的过程.这些特征可以是图像的原始特征,如像素的灰度值、物体轮廓、颜色、反射特征和纹理等,也可以是空间频谱等,如直方图特征.图像分割的目的是把图像划分成若干互不相交的区域,使各区域具有一致性,而相邻区域间的属性特征有明显的差别

 

常用技术

6.1基于区域的图像分割

6.2基于边缘的图像分割

6.3边缘与区域相结合的图像分割

6.4基于数学形态学的图像分割

6.5基于模糊理论的图像分割

6.6基于神经网络的图像分割

6.7基于支持向量机的图像分割

6.8基于图论的图像分割

6.9基于免疫算法的图像分割

6.10基于粒度计算理论的图像分割

 

7.     图像特征提取与匹配

常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征

 

常用技术

7.1颜色特征

7.1.1颜色直方图

7.1.2颜色集

7.1.3颜色矩

7.1.4颜色聚合向量

 

7.2纹理特征

7.2.1灰度共生矩阵

7.2.2几何法

7.2.3模型法

7.2.4信号处理法

 

7.3形状特征

7.3.1边界特征法

7.3.2傅里叶形状描述符法

7.3.3几何参数法

 

7.4空间关系特征

7.4.1基于模型的姿态估计方法

7.4.2基于学习的姿态估计方法

 

8.     图像分类(识别)

根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法

 

常用技术

8.1模版比对:关系结构匹配、特定理论工具的匹配、基于灰度信息匹配、基于亚像元匹配、基于内容特征匹配

 

8.2统计模式识别方法:判别函数法,k近邻分类法,非线性映射法,特征分析法,主因子分析法

 

8.3人工神经网络模式识别:人工神经网络区别于其他识别方法的最大特点是它对待识别的对象不要求有太多的分析与了解,具有一定的智能化处理的特点

 

8.4句法结构模式识别:又称结构方法或语言学方法。其基本思想是把一个模式描述为较简单的子模式的组合,子模式又可描述为更简单的子模式的组合,最终得到一个树形的结构描述,在底层的最简单的子模式称为模式基元

 

参考

http://blog.csdn.net/hitwengqi/article/details/8292675

http://blog.csdn.net/it_job/article/details/78837414

期刊 数字图像处理技术的研究进展

图像分割的新理论和新方法

百度百科

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