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,则一些像素可能被带透明的显示。

  • 相关阅读:
    Leetcode Excel Sheet Column Number
    AlgorithmsI PA2: Randomized Queues and Deques Subset
    AlgorithmsI PA2: Randomized Queues and Deques RandomizedQueue
    AlgorithmsI PA2: Randomized Queues and Deques Deque
    AlgorithmsI Programming Assignment 1: PercolationStats.java
    hdu多校第四场 1003 (hdu6616) Divide the Stones 机智题
    hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
    hdu多校第四场1001 (hdu6614) AND Minimum Spanning Tree 签到
    hdu多校第三场 1007 (hdu6609) Find the answer 线段树
    hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测
  • 原文地址:https://www.cnblogs.com/muyuhu/p/2749785.html
Copyright © 2011-2022 走看看