zoukankan      html  css  js  c++  java
  • MATLAB像素颜色的表达方式

    MATLAB像素颜色的表达方式





    【中文转述】
    252
    249
    246
    243
    237
    255
    255
    250
    246
    243
    253
    254
    248
    245
    243
    250
    249
    245
    243
    239
     


        这些像素值表示什么颜色?如果你很熟悉图像处理,那你应该知道255表示白色,所以上面这些数字表示白色或者接近白色的颜色。但是实际上,这些数字并不是来自一张图片。这些数字是波士顿地区的海拔高度,从U.S. Geological Survey (USGS)下载 255是一个以米为单位的测量值,并不表示颜色。
    MATLAB可以将任何矩阵以图片的形式显示出来。比如,根据你使用命令的不同,MATLAB可以将海拔高度数据显示为如下图。
    或者是


        将矩阵按照各种方式显示为图形,可以更直观的了解你的数据。通过理解不同的图形类型,你可以知道MATLAB是如何将矩阵值转化为像素值的。你可以控制MATLAB对数据的显示方式,纠正有可能出错的图形。


    图形类型

        一种图像类型即代表了一种从矩阵值到像素值的映射方式。MATLAB有三种基本的图像类型:
    Truecolor——数码相机的格式,广泛用于计算机图形。
    Indexed scaled indexed ——经常用来显示科学或者工程数据,使用的颜色比例可以代表不同的数据单位。


    Image Processing Toolbox可以识别另外两种类型:
    Grayscale
    ——经常用在图像处理和图像分析算法中
    Binary
    ——经常用做为一个封装来表示图形的分割结果或者是感兴趣的区域。

    Truecolor Images

       在这种格式的图里,每一个像素由三个数字表示:红,绿,蓝,整个图形由一个M-N-3的三维矩阵表达。图形显示函数和图形处理工具箱将这种矩阵视为一个truecolor图形。[传说中的真彩色,囧]
        比如,我们构造一个两行-两列的truecolor图形,使上面的两个像素为红和蓝色,下面的两个像素为黄色和灰色。
    首先,构造32-2的矩阵来代表每一个颜色成分。

    1. red = [1 0; 1 0.7]
    2. green = [0 0; 1 0.7]
    3. blue = [0 1; 0 0.7]
    复制代码


    然后,使用cat函数来将这些颜色成分矩阵在第三维上拼合起来。

    1. truecolor_image = cat(3, red, green, blue);
    复制代码


    最后,使用image函数显示图形:

    1. image(truecolor_image)
    2. axis equal % Display the image using square pixels
    复制代码


    可以看到,矩阵值直接指定了每一个像素的颜色。通过这种表达方式你可以很大程度上控制颜色显示,但是对于工程应用来说它并不是最适合的一种图形格式。


    Indexed images索引图像

       在索引图像里,颜色矩阵的值并不直接决定颜色像素。MATLAB将矩阵值作为索引在图像的colormap中进行颜色查表。比如,在MATLAB文件clown.mat中包含一下索引图形:

    1. load clown %可以在你的matlab中直接输入这个命令
    2. whos
    复制代码


    Name         Size         Bytes     Class

    X           200x320       512000    double array
    caption       2x1              4    char array
    map          81x3           1944    double array

    Grand total is 64245 elements using 513948 bytes

        变量X中存放了查表索引,map中存放了对应的colormap。两者都会直接用于图像显示。(5,5)这个像素点上的颜色,对应于X(5,5)的值:

    1. X (5, 5)
    复制代码


    ans =
        61
    这个值作为colormap的行索引值:

    1. map (61, :)
    复制代码


    ans =
        0.9961 0.5781 0.1250

    由此看到,像素(5,5)处的颜色是由‘很多红色',‘一些绿色’和‘一点点蓝色’构成。
    使用两个MATLAB命令显示这幅图,一个用来显示图形同时另一个用来指定图像的colormap

    1. image(X)
    2. colormap(map)
    复制代码


    1. colormap(cool)
    复制代码




        与truecolor图像不同的是,indexed图像的显示因使用不同的colormap而不同。
        索引图像在15年前很常用,当时大部分颜色图形设备最多只能同时显示256种颜色。而现在可以使用不同颜色比例来显示数据。因为索引图像的值必须是整数,所以比例索引图像就具有更多灵活性。(这段需修正,不过感觉作用不大,不管它了)

    Scaled indexed images比例索引图像

       和一般的索引图像类似,比例索引图像也使用矩阵值在图像的colormap中进行查表。而不同之处在于,将矩阵值进行线性缩放后,再作为查表索引值。
    比如,现在使用image命令来显示一个小的magic阵接着将它与imagese来对比。

    1. A = magic(5)
    复制代码


    A = 17   24    1     8    15     23    5    7    14    16      4    6   13    20    22     10   12   19    21     3     11   18   25     2     9
    使用image255-colorgrayscale colormap来显示A)

    1. image(A)
    2. colormap(gray(256))
    3. axis equal
    复制代码



        可以看到显示出的图像非常暗。那是因为A矩阵的元素都在125之间,所以图像只使用了grayscale colormap中的最开始的25种颜色来表示图形——均为暗黑色。
    对比使用imagesc命令的图形:

    1. imagesc(A)
    2. colormap(gray(256))
    3. axis equal
    复制代码



       imagescA中的最小值1显示为colormap色系中的第一个,黑色;将A中的最大值25,显示为colormap色系中的最后一个,白色。其他的所有125之间的值则按此线性比例使用colormap中的对应颜色。比如,12则使用colormap中的第118种颜色,中灰色。
       如果你换了一种colormap,这A中的值则根据新的colormap重新按比例显示。

    1. colormap(jet)
    复制代码






        你也可以通过乘以底层图像句柄属性来获得这个比例。如果是在MATLAB里开发GUI程序,你经常需要使用底层函数和属性来替代类设于imagesc这样的命令。现在来看两种与图像颜色显示有关的图形句柄属性。
        图形对象有一个属性叫做CDataMappling

    1. h = image(A);
    2. get(h, 'CDataMapping')
    复制代码


    ans =
    direct
        你可以看到这个属性的默认值为'direct'。这表示A的值直接被用作colormap的索引值。它的值也可以为'scaled',当你使用imagesc时则为这个值。

    1. h = imagesc(A);
    2. get(h, 'CDataMapping')
    复制代码


    ans =
    scaled
       比例的最大最小值由axesCLimcolor limits)属性控制。

    1. h = imagesc(A);
    2. get(gca, 'CLim')
    复制代码


    ans =
    1   25
       默认情况下,imagesc会将A的最大最小值赋给CLim。你也可以指定你自己的颜色界限,通过添加imagesc函数输入参数。

    1. imagesc(A, [10 15])
    2. colormap(gray)
    3. axis equal
    复制代码





       这次,imagesc10(以及小于10)显示为黑色。类似地,它将15(以及大于15)的值显示为白色。介于1015的值则显示为相应灰度。
    比例图形在图像处理的工程应用中非常重要,因为在这里感兴趣的并不是‘图形’而是带物理单位的度量值矩阵,与光照强度无关,比如说USGS中的高度尺寸。

    Grayscale images灰度比例图形

        灰度比例图形只包括亮度信息,它是使用grayscale colormap的比例索引图形。如果你将一个二维矩阵的作为参数传递给图像处理工具箱显示函数,imtoolimshow,这这些函数会自动的使用grayscale colormap来显示这些图形。(imageimagesc函数则使用fugure当前的colormap)。

    1. theta = linspace(0, 2*pi, 256);
    2. I = repmat((-cos(2*theta) + 1)/2, [256 1]);
    3. h = imshow(I);     % Save the handle for use below.
    复制代码







    imshow会自动的为以下参数赋值:

    1. get(h, 'CDataMapping')
    复制代码


    ans =
    scaled
    对于一个floating-point图形,图像处理工具箱约定将0显示为黑色,1显示为白色。

    1. get(gca, 'CLim')
    复制代码


    ans =
    0      1
    工具箱会自动使用grayscale colormap

    1. map = get(gcf, 'Colormap');
    2. map(1:5, :)
    复制代码


    ans =
                0           0        0
           0.0039      0.0039   0.0039
           0.0078      0.0078   0.0078
           0.0118      0.0118   0.0118
           0.0157      0.0157   0.0157

       工具箱里的imshowimtool也可以不使用既定的显示范围而自定义黑和白的值。就像imagesc命令一样,添加一个表示黑和白值的2元素向量的输入参数,如下。0.4及以下表示为黑色,0.6及以上表示为白色。

    1. imshow(I, [0.4 0.6])
    复制代码







       灰度比例图形经常用于图像处理算法,直接操作相对亮度值而非颜色。他们也常用于印刷中(略)。

    Binary images二进制图形

       二进制图形只包括黑色和白色。图像分割算法的输出通常都是二进制图形,黑色像素代表感兴趣的对象而白色像素代表背景。
    图像处理工具箱函数将逻辑矩阵视为一个二进制图形。逻辑矩阵只包括0(显示为黑色)1(显示为白色)

    1. bw = imread('text.png');
    2. islogical(bw)
    复制代码


    ans =
          1

    1. h = imshow(bw);
    复制代码





       二进制图形有时用于文字或者线条。它也用做于图像处理中的封装。一个图形封装将像素分为两类。一类,白色像素,包括感兴趣的位置。比如,表示被删除的对象。而另一类则指示背景位置。


    控制像素颜色的图像属性句柄

    Image Object: Cdata and Dimensionality
    Ø
    如果CData是一个三维矩阵,而第三维的大小为3,这CData值认为是RGB值。
    Ø
    如果CData是一个二维矩阵,则image显示的颜色对应于当前figurecolormapMATLAB使用CData的值(direct直接或者比例scaled)作为colormap的查表索引。


    Image Object:CDataMapping


    如果CData是一个二维矩阵,则image显示的颜色对应于当前figurecolormap,而image CDataMapping属性则控制了colormap的查表方式:
    u
    如果CDataMapping'direct',则CData值直接作为查表索引
    u
    如果它的值是'scaled',则CData按比例查表。
    对于truecolor图像,CDataMapping的值不影响图形显示。


    Image Object:Cdata Class


    如果图像是truecolor,则CData阵的类型(unit8,unit16或者double)决定了那一个值显示为白色。如果CData classdouble,则[1 1 1]显示为白色。如果classunit8,则[255 255 255]显示为白色。如果classunit16,则[65535 65535 63355]显示为白色。[ 0 0 0]均显示为黑色。
    如果图像是索引方式,则CDataclass影响索引操作。double,则1代表第一个colormap颜色;unit8或者unit16,则0代表第一个colormap颜色。


    Axes Object:CLim

    如果CData是两维的且CDataMapping'scaled',则CLim属性的向量决定了比例方式。第一个元素值对应colormap的第一个颜色,第二个元素值对应colormap最后一个颜色。
    对于truecolor图像,或者CDataMapping属性为'direct',则CLim对图像颜色没有影响。


    Figure Object:Colormap

    如果CData是二维的,则所有显示的像素颜色均来自figureColormap
    对于truecolor图像,此属性没影响。


    Transparency Properties透明度属性

    如果figure AlphaMpaimage AlphaData或者是image AlphaDataMapping属性都设置为nondefault,则一些像素可能被带透明的显示。

  • 相关阅读:
    文件分段后,进行分片上传逻辑
    总结几个最近处理问题中使用http协议的代码
    openresty(nginx)中使用lua脚本获取请求IP地址的代码
    线上Storm的worker,executor,task参数调优篇
    async/await
    DataTables.Queryable Sample
    关闭 XXXXX 前你必须关闭所有会话框
    关于P/Invoke的闲话
    Windows 2008 Scheduled tasks result codes
    MySQL 8.0.13的使用心得
  • 原文地址:https://www.cnblogs.com/muyuhu/p/2749785.html
Copyright © 2011-2022 走看看