Main Content

transform

变换数据存储

说明

示例

dsnew = transform(ds1,ds2,...,dsN,@fcn) 使用变换函数 fcn 变换一个或多个输入数据存储,并返回变换后的数据存储 dsnew。在调用 transform 函数时,可以将 fcn 放在所有输入数据存储之前或之后。

dsnew = transform(ds1,ds2,...,dsN,@fcn,'IncludeInfo',IncludeInfo) 使用变换函数 fcn 的替代定义。您可以通过替代定义使用数据存储的 read 函数返回的附加信息。

示例

全部折叠

为图像集合创建一个数据存储,并对数据存储中的所有图像应用相同的变换。例如,将集合中的所有图像调整到指定的目标大小。

创建一个包含两个图像的 ImageDatastore

imds = imageDatastore({'street1.jpg','peppers.png'})
imds = 
  ImageDatastore with properties:

                       Files: {
                              ' .../Bdoc24a.2528353/build/matlab/toolbox/matlab/demos/street1.jpg';
                              ' .../Bdoc24a.2528353/build/matlab/toolbox/matlab/imagesci/peppers.png'
                              }
                     Folders: {
                              ' .../filer/batfs1904-0/Bdoc24a.2528353/build/matlab/toolbox/matlab/demos';
                              ' .../batfs1904-0/Bdoc24a.2528353/build/matlab/toolbox/matlab/imagesci'
                              }
    AlternateFileSystemRoots: {}
                    ReadSize: 1
                      Labels: {}
      SupportedOutputFormats: ["png"    "jpg"    "jpeg"    "tif"    "tiff"]
         DefaultOutputFormat: "png"
                     ReadFcn: @readDatastoreImage

读取所有图像。请注意,该数据存储包含不同大小的图像。

img1 = read(imds); % reads the first image
img2 = read(imds); % reads the next image
whos img1 img2
  Name        Size                Bytes  Class    Attributes

  img1      480x640x3            921600  uint8              
  img2      384x512x3            589824  uint8              

将数据存储中的所有图像变换为指定的目标大小。

targetSize = [224,224];
imdsReSz = transform(imds,@(x) imresize(x,targetSize));

读取图像并显示其大小。

imgReSz1 = read(imdsReSz);
imgReSz2 = read(imdsReSz);
whos imgReSz1 imgReSz2
  Name            Size                Bytes  Class    Attributes

  imgReSz1      224x224x3            150528  uint8              
  imgReSz2      224x224x3            150528  uint8              

显示调整大小后的图像。

tiledlayout(1,2);
nexttile
imshow(imgReSz1); axis on; title('Resized Street1.jpg')
nexttile
imshow(imgReSz2); axis on; title('Resized peppers.png')

创建多个数据存储对象,并对所有数据存储应用相同的变换。例如,将多个图像组合成一个矩形分块图像。

创建一个包含一个图像的 ImageDatastore

imds1 = imageDatastore({'ngc6543a.jpg'})
imds1 = 
  ImageDatastore with properties:

                       Files: {
                              ' .../Bdoc24a.2528353/build/matlab/toolbox/matlab/demos/ngc6543a.jpg'
                              }
                     Folders: {
                              ' .../filer/batfs1904-0/Bdoc24a.2528353/build/matlab/toolbox/matlab/demos'
                              }
    AlternateFileSystemRoots: {}
                    ReadSize: 1
                      Labels: {}
      SupportedOutputFormats: ["png"    "jpg"    "jpeg"    "tif"    "tiff"]
         DefaultOutputFormat: "png"
                     ReadFcn: @readDatastoreImage

将该图像读入工作区中,以基于原始图像的每个颜色通道创建一个图像文件。

rgbImage = imread('ngc6543a.jpg');
imwrite(rgbImage(:,:,1),'nebula_red.jpg');
imwrite(rgbImage(:,:,2),'nebula_green.jpg'); 
imwrite(rgbImage(:,:,3),'nebula_blue.jpg');

为每个单通道图像创建一个 ImageDatastore 对象。

imdsR = imageDatastore({'nebula_red.jpg'});
imdsG = imageDatastore({'nebula_green.jpg'});
imdsB = imageDatastore({'nebula_blue.jpg'});

读取存储在每个数据存储中的图像,并显示其大小。

imOriginal = read(imds1);
img_red = read(imdsR);
img_green = read(imdsG);
img_blue = read(imdsB);
whos img1 img_red img_green img_blue
  Name             Size              Bytes  Class    Attributes

  img_blue       650x600            390000  uint8              
  img_green      650x600            390000  uint8              
  img_red        650x600            390000  uint8              

通过将所有图像合并为一个矩形分块图像来变换所有数据存储。将 imds1 中的彩色图像转换为灰度图像,使其维度与其他图像的维度相匹配。

tds1 = transform(imds1,imdsR,imdsG,imdsB, @(x1,x2,x3,x4) [rgb2gray(x1),x2;x3,x4]);
tile = read(tds1);

显示该分块图。

imshow(tile)

输入参数

全部折叠

输入数据存储。有关内置数据存储的完整列表,请参阅Select Datastore for File Format or Application。您还可以指定自定义数据存储。

用于变换数据的函数,指定为函数句柄。该函数将数据作为输入,并根据 fcn 中定义的转换返回变换后的数据。

变换函数必须具有以下签名,并且 ds1_data,ds2_data,...dsN_data 必须与使用 read 函数返回的数据具有相同的形式。

function dataOut = transformFcn(ds1_data,ds2_data,...dsN_data)
..
end

您也可以将您的变换函数 fcn定义为使用有关 read 函数返回的数据的附加信息。要使用此替代定义,您必须将 IncludeInfo 的值指定为 true。在本例中,变换函数必须有以下签名。

function [dataOut,infoOut] = transformFcn(ds1_data,ds2_data,...dsN_data,ds1_info,ds2_info...dsN_info)
..
end

示例: @transformFcn

数据类型: function_handle

包含来自 read 函数的信息,指定为 truefalseread 函数以 info 结构体形式返回有关所提取数据的信息。有关详细信息,请参阅 read 函数页。

当您将 IncludeInfo 的值设置为 true 时,您必须为变换函数 fcn 使用替代签名。

输出参量

全部折叠

包含变换后数据的新数据存储,以 TransformedDatastore 对象形式返回。

扩展功能

版本历史记录

在 R2019a 中推出