matlab 图像处理函数总结

来源:互联网 发布:手写画板软件 编辑:程序博客网 时间:2024/04/29 15:34
1.中断MATLAB运行快捷键  ctrl+c
2.不懂的函数,停光标在那,按F1帮助健看帮助小窗,或者doc X查帮助大窗,看英文解释的能力还是一定要具备的。
size imresize
3.图像维度的讨论
彩色图像时三维的,3维的;对于BMP或JPEG图像image(h;w;z);其中h是图片的高,w是图片宽,z可以为1、2、3;分别对应R,G,B三原色
第一种理解:彩色图像的三维,理解:分别有R.G.B三原色维度组合而成,每个原色为一维,故三维。 但是每个维度又要基于二维的物理空间x,y坐标之上。
也就是首先彩色图像有个二维坐标平面,平面上的每一个坐标点,若为彩色图像则像素值由三原色三维数组成,若为灰度图像,则像素值则只有一个维度数据。(感觉第一种理解是不科学的,还是第二种更合适些!!!)
第二种理解:维度,要抛弃具体数值,从整体数值所占据的规模的角度去思考,x轴算一个维度表示宽度width(左右),可以有几百上千个元素,y轴算第二维表示高度height(前后),也可以由几百上千个元素,z轴算第三个维度(上下),只有一到三个元素即1或者1、2、3,若z轴只有1个元素,则表明只有一层楼,每个像素点就像每个屋子只能装一个数值,为灰度图像,若z轴只有3个元素,则表明有三层楼,每个像素点上就有三层共三间屋子可以装三个数值,即三原色数值,三通道值,为彩色图像
读取一片彩色图像 默认变量名ans的维度入左图
若所以 img = read(avi, i); pixels(:, :, :, i) = img;
3.图像裁剪函数
函数名称: imcrop
函数功能: 在MATLAB中,该函数用于返回图像的一个裁剪区域。
调用格式:
I2 = imcrop(I)
X2 = imcrop(X,map)
RGB2 = imcrop(RGB)
这三种调用格式把图像显示在一个图像窗口中, 并允许用户以交互方式使用鼠标选定要剪切的区域。
I2 = imcrop(I,rect)
X2 = imcrop(X,map,rect)
RGB2 = imcrop(RGB,rect)
这三种格式都指定了要裁剪的矩形区域。
[...] = imcrop(x,y,...)
[A,rect] = imcrop(...)
[x,y,A,rect] = imcrop(...)
相关函数: imresize
4.sum(sum())  先进行列向量求和
>> rand(2,3)
ans =
    0.8147    0.1270    0.6324
    0.9058    0.9134    0.0975
>> sum(ans)
ans =
    1.7205    1.0404    0.7299
>> sum(ans)
ans =
    3.4908

5.fix

Round toward zero

a = [-1.9, -0.2, 3.4, 5.6, 7.0, 2.4+3.6i]a =  Columns 1 through 4   -1.9000        -0.2000        3.4000        5.6000            Columns 5 through 6    7.0000        2.4000 + 3.6000ifix(a)ans =  Columns 1 through 4   -1.0000        0   
6.工作空间变量可以覆盖掉MATLAB系统自带的预定义函数
>> sin(1)
ans =
    0.8415
>> sin = 1
sin
sin =
     1
sin =
     1
7.text

Create text object in current axes

text(x,y,'string')
text(x,y,z,'string')
text(x,y,z,'string','PropertyName',PropertyValue....)
text('PropertyName',PropertyValue....)
h = text(...) 

8.pixels(:, :, :, i) = img;  img为一张三维的彩色图像

pixels是一个4D矩阵,当i变量确定时,pixels(:, :, :, i)即为一个三维矩阵,pixels的第四维表示帧数,在帧序号固定时,pixels(:,:,:,6)为一个三维变量,将img三维变量中的所有数值赋值给pixels的三维

9,计时函数   tic, toc 搭配进行计时   延时函数: pause(n); 表延时n秒n可以为浮点数

a、tic和toc函数

     这两个函数一般配合使用,tic表示计时的开始,toc表示计时的结束。

      格式如:

           tic

               任意表达式

           toc

           t=toc

  b、cputime函数

     cputime函数返回从调用该函数起所用的总的Cpu时间,单位以秒计算。

      格式如:

            t=cputime;

            任意表达式或者程序

            e=cputime-t;

   c、etime函数

      e=etime(t2,t1)命令返回向量t1和t2之间的时间段,t1和t2必须含有由clock函数返回的6个元素,即[Year Month Day Hour Minute Second]。

      举例说明:

             >>x=rand(2048,1);

             >>t=clock;

             >>fift(x);

             >>etime(clock,t);

10.往MATLAB中的数组成员赋值 应该用小括号,不用中括号
如:%计时结束
toc;
t(i) = toc;
11.怎样将一个矩阵中大于某数的其他元素自动重新赋值
比如把一个N阶矩阵K中的所有小于255的数置零.而大于255的数置512?
K=0*(K<255)+512*(K>255)

matlab将矩阵各列大于某个数的元素置零

 A=rand(5,4)    % 测试数据
m=min(A)        % 求各列最小值
M=repmat(m,size(A,1),1)   % 按行复制最小值和原矩阵同维数
A(A>M)=0     % 置各列比最小值大的数为零

A =
    0.4387    0.4898    0.2760    0.4984
    0.3816    0.4456    0.6797    0.9597
    0.7655    0.6463    0.6551    0.3404
    0.7952    0.7094    0.1626    0.5853
    0.1869    0.7547    0.1190    0.2238
m =
    0.1869    0.4456    0.1190    0.2238
M =
    0.1869    0.4456    0.1190    0.2238
    0.1869    0.4456    0.1190    0.2238
    0.1869    0.4456    0.1190    0.2238
    0.1869    0.4456    0.1190    0.2238
    0.1869    0.4456    0.1190    0.2238
A =
         0         0         0         0
         0    0.4456         0         0
         0         0         0         0
         0         0         0         0
    0.1869         0    0.1190    0.2238
t(t<0.08)   %显示的新t矩阵为t矩阵中如何要求的元素重新组成新的矩阵

 添加路径
在命令窗口输入addpath /opt/matlab/toolbox/newbox 或者addpath(‘/opt/matlab/toolbox/newbox’);
但 是这种方法只能添加newbox目录,如果该目录下有其他子文件夹,并且运行时候“隐式”调用到这些子文件夹(例如假设newox目录下存在子文件夹 matdata,该子文件夹下有logo.mat这个文件,且在m文件代码中使用了诸如 load logo 这样的句子,即没有显式给出logo.mat的具体路径,则称为“隐式”),则不能正确访问。因此,有必要在添加时使用以下语句把newbox目录下所有 文件夹都添加到搜索路径中:
程序代码    addpath(genpath('/opt/matlab/toolbox/newbox'));

   genpath('../')   可以产生当前路径所在位置的上一级文件内包含的所有文件路径
addpath(genpath('../'))     将当前文件上级文件夹内的所有文件路径添加到 工作路径
 另 外,如果只使用以上代码,则退出matlab后,新添加的路径不会被保存下来,下次重新启动matlab后又需要重新添加。可以用savepath来解决 这个问题,即在命令窗口中使用 savepath 便可。不过保存路径操作只对matlab 2006a、2006b有效(应该对版本7.0以上的都有效,因没有测试,所以不敢肯定),对6.5版本的matlab无效(该版本没有savepath 这个命令)。 
另外,去除路径用rmpath,例如:
rmpath /opt/matlab/toolbox/newbox;

创建某一指定目录下的 新文件夹 mkdir函数
 两个参数时:(可以是绝对路径,必须是相对路径)
一个输入参数时:(偏移路径或某一绝对路径)
 mkdir(spintf('F:/小牛/小牛0-350/%s/%s00%d_img',behavType,behavType,videoNum));%创建相应的保存图片的文件夹名 
 %注意:mkdir函数当接收一个输入参数时或为当前路径的相对路径或者为某一个绝对路径,但里面若有变量时必须要用sprintf转换成字符串形式
三个点 ... 续行符   itl文件 iTunes lib 文件类型:iTunes Library File

打开.itl文件  Mac OS   Apple iTunes          Windows  Apple iTunes  Linux

对文件的打开和操作函数  fopen  读文件内容函数用 fscanf
函数名: fscanf简述:C语言中基本的文件操作功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
try的作用是让Matlab尝试执行一些语句, 执行过程中如果出错, 则执行catch部分的语句. 其语法:
try
     尝试执行的语句块
catch
     出错后执行的语句块
end

continue语句经常与for,while循环合用。当循环语句中出现continue时,则不再继续执行当前循环体内的程序语句,即提前结束当前循环,并继续执行下一个循环。

>> %本程序实现在2-100中,找出不能被2,3,5,7,11整除的数
i=1;
for n=2:100
    if mod(n,2)==0|mod(n,3)==0|mod(n,5)==0|mod(n,7)==0|mod(n,11)==0 %若能被这些数整除,则滑过
        continue
    else           %否则(if的条件表达式无法执行)将n值赋给向量X
        X(i)=n;
        i=i+1;
    end
end
                     %显示结果

X =

  Columns 1 through 12

    13    17    19    23    29    31    37    41    43    47    53    59

  Columns 13 through 20

    61    67    71    73    79    83    89    97

>> %本程序实现在2-100中,找出不能被2,3,5,7,11整除的数,输出第2个
i=1;
for n=2:100
    if mod(n,2)==0|mod(n,3)==0|mod(n,5)==0|mod(n,7)==0|mod(n,11)==0
        continue
    else
        X(i)=n;
        i=i+1;
    end
end
X(2)

ans =

    17

break与continue相似,也是经常与for while合用,但它不是继续执行下一个循环,而是退出循环体,继续执行循环体之外的程序。即终止循环!

matlab中用imshow()显示图像与图像矩阵的数据类型的关系(转载)

在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果直接运行imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。               

       那么如何解决这个问题呢?笔者曾经用fix()函数把图像矩阵由实数形式转化成整数形式,但这样仍无法改变图像矩阵是double型的事实。        

        通过搜索,找到两个解决方法:                

                      imshow(I/256);    ----------将图像矩阵转化到0-1之间                

                      imshow(I,[]);       -----------自动调整数据的范围以便于显示 (不明白原理!)     

                      PS:imshow(I,[]),将I的最小值看作0,最大值看作255,所以黑白明显

  

       从实验结果看两种方法都解决了问题,但是从显示的图像看,第二种方法显示的图像明暗黑白对比的强烈些!不知什么原理!        

此外还找到一些方法,还没有试过,记录如下:

uint8和im2uint8的区别 
       图像数据在计算前需要转换为double,以保证精度;        很多矩阵数据也都是double的,要想显示其,必须先转换为图像的标准数据格式.        如果转换前的数据符合图像数据标准(比如如果是double则要位于0~1之间),那么可以直接使用im2uint8       

       如果转换前的数据分布不合规律,则使用uint8,将其自动切割至0~255(超过255的按255)        最好使用mat2gray,将一个矩阵转化为灰度图像的数据格式(double)       

       另外,可以用isgray判断矩阵是否是一个图像数据矩阵       

       总之,im2uint8、im2double要跟uint8、double

    图像取反函数imcomplement。 图像拉伸函数: stretchlim 也可以用张铮教材提供的函数 分段线性变换函数imggreayscaling


         灰度图像二值化,时经常出现问题,查看im2bw函数,里面有一个判断灰度图像A的数值范围的函数:range = getrangefromclass(A); 函数内部的定义为range = double([intmin(classType) intmax(classType)]);  通过intmin和intmax来检测最大最小值,而这两个函数检测的均为整数值:如inimin注释:%INTMIN Smallest integer value.  所以二值化的时候要先将图像从double类型转化回uint8或其它im2bw指定的nargin型


0 0
原创粉丝点击