Main Content

이미지로 내보내기

표준 그래픽스 파일 형식 중 하나를 사용하여 MATLAB® 작업 공간에서 데이터를 내보내려면 imwrite 함수를 사용하십시오. 이 함수를 사용하면 TIFF(Tagged Image File Format), JPEG(Joint Photographic Experts Group), PNG(Portable Network Graphics) 같은 형식으로 데이터를 내보낼 수 있습니다. 지원되는 형식의 전체 목록은 imwrite 함수 도움말 페이지를 참조하십시오.

예를 들어, MATLAB 작업 공간에 있는 uint8형 데이터의 다차원 배열 I를 TIFF 형식으로 파일에 씁니다. 파일에 기록되는 출력 이미지 클래스는 지정된 형식에 따라 다릅니다. 대부분의 형식에서, 입력 배열이 uint8 클래스이면 imwrite 함수는 데이터를 8비트 값으로 출력합니다. 자세한 내용은 imwrite 함수 도움말 페이지를 참조하십시오.

I = imread("ngc6543a.jpg");
whos I
  Name        Size                 Bytes  Class    Attributes

  I         650x600x3            1170000  uint8              
imwrite(I,"my_graphics_file.tif","tif")

참고

imwrite는 여러 표준 형식에 대해 다양한 구문을 지원합니다. 예를 들어, TIFF 파일 형식을 사용하면 MATLAB이 이미지를 저장할 때 사용할 압축 유형을 지정할 수 있습니다. 자세한 내용은 imwrite 함수 도움말 페이지를 참조하십시오.

TIFF 파일에 데이터를 쓸 때 더욱 세부적으로 제어하려면 Tiff 객체를 사용하십시오. 자세한 내용은 이미지 데이터와 메타데이터를 TIFF 파일로 내보내기 항목을 참조하십시오.

이미지 데이터와 메타데이터를 TIFF 파일로 내보내기

imwrite를 사용하여 TIFF(Tagged Image File Format) 파일에 이미지 데이터와 메타데이터(태그)를 내보낼 수 있지만, 이 함수에는 몇 가지 제한 사항이 있습니다. 예를 들어, 파일의 이미지 데이터나 메타데이터를 수정하려면 전체 데이터를 파일에 써야 합니다. 업데이트된 부분만 쓸 수는 없습니다. Tiff 객체를 사용하면 이미지 데이터 중 일부를 쓰고 개별 태그를 수정하거나 TIFF 파일에 추가할 수 있습니다. Tiff 객체를 생성하면 이 객체는 TIFF 파일과의 연결을 나타내고 LibTIFF 라이브러리에 포함된 루틴 중 다수에 대한 액세스를 제공합니다.

이러한 예제는 Tiff 객체 메서드와 속성을 사용하여 몇 가지 일반적인 작업을 TIFF 파일에서 수행하는 방법에 대한 단계별 데모를 제공합니다. Tiff 객체를 최대한 활용하려면 TIFF 사양과 기술적인 내용을 잘 알고 있어야 합니다. LibTIFF - TIFF Library and Utilities의 문서를 참조하십시오.

TIFF 파일 만들기

이미지 데이터를 만듭니다.

imgdata = imread("ngc6543a.jpg");

Tiff 객체를 생성하고 새 파일 이름을 인수로 지정하여 새 TIFF 파일을 만듭니다. 파일을 만들려면 쓰기 모드("w")나 추가 모드("a")를 지정해야 합니다.

t = Tiff("myfile.tif","w");

새 TIFF 파일을 만들 때 Tiff 생성자는 이미지 파일 디렉터리(IFD)가 포함된 파일을 만듭니다. TIFF 파일은 이 IFD를 사용하여, 특정 이미지와 연관된 모든 데이터와 메타데이터를 구성합니다. TIFF 파일은 여러 IFD를 포함할 수 있습니다. Tiff 객체는 직접 생성한 IFD를 현재 IFD로 설정합니다. Tiff 객체 메서드는 현재 IFD를 기반으로 동작합니다. Tiff 객체 메서드를 사용하여 TIFF 파일 내 IFD 간을 탐색하고 현재 IFD로 설정할 IFD를 지정할 수 있습니다.

Tiff 객체의 setTag 메서드를 사용하여 TIFF 태그를 설정합니다. 이러한 태그에는 필수 태그와 선택적 태그가 포함되며 이러한 태그를 통해 이미지에 대한 정보(예: 길이와 너비)가 지정됩니다. 이미지 데이터를 스트립(Strip)으로 나누려면 RowsPerStrip 태그의 값을 지정하고, 이미지 데이터를 타일로 나누려면 TileWidth 태그와 TileLength 태그의 값을 지정하십시오. 다음 예제에서는 태그 이름과 값이 포함된 구조체를 만들어 setTag에 전달합니다. 각 태그를 개별적으로 설정할 수도 있습니다.

tagstruct.ImageLength = size(imgdata,1);
tagstruct.ImageWidth = size(imgdata,2);
tagstruct.Photometric = Tiff.Photometric.RGB;
tagstruct.BitsPerSample = 8;
tagstruct.SamplesPerPixel = 3;
tagstruct.RowsPerStrip = 16;
tagstruct.Software = "MATLAB";
tagstruct % display tagstruct
tagstruct = struct with fields:
        ImageLength: 650
         ImageWidth: 600
        Photometric: 2
      BitsPerSample: 8
    SamplesPerPixel: 3
       RowsPerStrip: 16
           Software: "MATLAB"

setTag(t,tagstruct)

지원되는 TIFF 태그와, 해당 값을 설정하는 방법에 대한 정보는 태그 값 설정하기 항목을 참조하십시오. 예를 들어, Tiff 객체는 특정 태그 값을 설정하는 데 사용할 수 있는 속성을 지원합니다. 이 예제에서는 Tiff 객체 Photometric 속성을 사용하여 RGB 구성 Tiff.Photometric.RGB의 올바른 값을 지정합니다.

Tiff 객체의 write 메서드를 사용하여 이미지 데이터와 메타데이터를 현재 디렉터리에 씁니다.

write(t,imgdata)

파일에 여러 이미지를 넣으려면 이 쓰기 작업을 수행한 직후에 writeDirectory 메서드를 호출합니다. writeDirectory 메서드는 파일에 새 이미지 파일 디렉터리를 설정하고 이 새 디렉터리를 현재 디렉터리로 설정합니다.

Tiff 객체를 닫아 파일과의 연결을 닫습니다.

close(t)

imread 함수로 파일을 읽어 올바른 TIFF 파일을 만들었는지 테스트한 다음 이미지를 표시합니다.

imagesc(imread("myfile.tif"))

Figure contains an axes object. The axes object contains an object of type image.

이미지 데이터의 스트립 또는 타일 쓰기

참고: 이미지 데이터가 압축되지 않은 경우 이미지 데이터의 한 스트립 또는 한 타일만 수정할 수 있습니다.

Tiff 객체를 만들어 수정할 기존 TIFF 파일을 엽니다. 이 예제에서는 TIFF 파일 만들기에서 만든 파일을 사용합니다. Tiff 생성자는 Tiff 객체에 대한 핸들을 반환합니다.

t = Tiff("myfile.tif","r+");

이미지의 스트립에 쓰려는 데이터를 생성합니다. 이 예제에서는 스트립의 크기를 나타내는, 0으로 구성된 3차원 배열을 생성합니다. 이 코드에서는 스트립의 행 개수, 이미지의 너비, 픽셀당 샘플 개수를 차원으로 사용합니다. 이 배열은 uint8형 값으로 구성된 배열입니다.

width = getTag(t,"ImageWidth");
height = getTag(t,"RowsPerStrip");
numSamples = getTag(t,"SamplesPerPixel");
stripData = zeros(height,width,numSamples,"uint8");

이미지 데이터의 레이아웃이 타일 형식인 경우 크기를 지정할 때 TileWidth 태그와 TileLength 태그를 사용할 수 있습니다.

writeEncodedStrip 메서드를 사용하여 데이터를 파일의 스트립에 씁니다. 수정할 스트립을 식별하는 인덱스 번호를 지정합니다. 이 예제에서는 이미지의 변경 내용을 쉽게 볼 수 있도록 스트립 18을 선택합니다.

writeEncodedStrip(t,18,stripData)

이미지의 레이아웃이 타일 형식인 경우 타일을 수정할 때 writeEncodedTile 메서드를 사용할 수 있습니다.

Tiff 객체를 닫아 파일과의 연결을 닫습니다.

close(t)

imread 함수로 파일을 읽어 TIFF 파일에서 이미지의 스트립을 수정했는지 테스트한 다음 이미지를 표시합니다.

modified_imgdata = imread("myfile.tif");
imagesc(modified_imgdata)

Figure contains an axes object. The axes object contains an object of type image.

이미지의 중간에 검은색 스트립이 있습니다.

TIFF 파일 메타데이터(태그) 수정하기

Tiff 객체를 만들어 수정할 기존 TIFF 파일을 엽니다. 이 예제에서는 TIFF 파일 만들기에서 만든 파일을 사용합니다. Tiff 생성자는 Tiff 객체에 대한 핸들을 반환합니다.

t = Tiff("myfile.tif","r+");

현재 이 파일에는 Artist 태그가 포함되어 있지 않습니다. getTag(t,"Artist")를 실행하면 오류가 표시됩니다. setTag 메서드를 사용하여 Artist 태그를 추가합니다.

setTag(t,"Artist","Pablo Picasso")

rewriteDirectory 메서드를 사용하여 새 태그 데이터를 TIFF 파일에 씁니다. 파일의 기존 메타데이터를 수정하거나 파일에 새 메타데이터를 추가할 때는 rewriteDirectory 메서드를 사용하십시오.

rewriteDirectory(t)

Tiff 객체를 닫아 파일과의 연결을 닫습니다.

close(t)

TIFF 파일을 다시 열고 getTag 메서드를 사용하여 Artist 태그 값을 가져와서 작업을 테스트합니다.

t = Tiff("myfile.tif","r");
getTag(t,"Artist")
ans = 
'Pablo Picasso'
close(t)

TIFF 서브디렉터리 만들기

이 예제에서는 JPEG 파일에서 이미지 데이터를 읽어온 다음 이미지 데이터의 축소된 해상도(축소판) 버전을 두 개 만듭니다.

이미지 데이터를 만듭니다.

imgdata = imread("ngc6543a.jpg");
%
% Reduce number of pixels by one half.
img_half = imgdata(1:2:end,1:2:end,:);
%
% Reduce number of pixels by two thirds.
img_third = imgdata(1:3:end,1:3:end,:);

Tiff 객체를 생성하고 새 파일 이름을 인수로 지정하여 새 TIFF 파일을 만듭니다. 파일을 만들려면 쓰기 모드("w")나 추가 모드("a")를 지정해야 합니다. Tiff 생성자는 Tiff 객체에 대한 핸들을 반환합니다.

t = Tiff("my_subimage_file.tif","w");

Tiff 객체의 setTag 메서드를 사용하여 TIFF 태그를 설정합니다. 이러한 태그에는 필수 태그와 선택적 태그가 포함되며 이러한 태그를 통해 이미지에 대한 정보(예: 길이와 너비)가 지정됩니다. 이미지 데이터를 스트립(Strip)으로 나누려면 RowsPerStrip 태그의 값을 지정하고, 이미지 데이터를 타일로 나누려면 TileWidth 태그와 TileLength 태그의 값을 지정하십시오. 다음 예제에서는 태그 이름과 값이 포함된 구조체를 만들어 setTag에 전달합니다. 각 태그를 개별적으로 설정할 수도 있습니다.

서브디렉터리를 만들려면 SubIFD 태그를 설정하여 만들 서브디렉터리 개수를 지정해야 합니다. 참고로, 사용자가 지정하는 숫자는 SubIFD 태그의 값이 아닙니다. 이 숫자는 Tiff 소프트웨어에 두 서브디렉터리를 가리키는 SubIFD를 만들도록 지시합니다. SubIFD 태그의 실제 값은 두 서브디렉터리의 바이트 오프셋입니다.

tagstruct.ImageLength = size(imgdata,1);
tagstruct.ImageWidth = size(imgdata,2);
tagstruct.Photometric = Tiff.Photometric.RGB;
tagstruct.BitsPerSample = 8;
tagstruct.SamplesPerPixel = 3;
tagstruct.RowsPerStrip = 16;
tagstruct.Software = "MATLAB";
tagstruct.SubIFD = 2; % required to create subdirectories
tagstruct % display tagstruct
tagstruct = struct with fields:
        ImageLength: 650
         ImageWidth: 600
        Photometric: 2
      BitsPerSample: 8
    SamplesPerPixel: 3
       RowsPerStrip: 16
           Software: "MATLAB"
             SubIFD: 2

setTag(t,tagstruct)

지원되는 TIFF 태그와, 해당 값을 설정하는 방법에 대한 정보는 태그 값 설정하기 항목을 참조하십시오. 예를 들어, Tiff 객체는 특정 태그 값을 설정하는 데 사용할 수 있는 속성을 지원합니다. 이 예제에서는 Tiff 객체 Photometric 속성을 사용하여 RGB 구성 Tiff.Photometric.RGB의 올바른 값을 지정합니다.

Tiff 객체의 write 메서드를 사용하여 이미지 데이터와 메타데이터를 현재 디렉터리에 씁니다.

write(t,imgdata)

writeDirectory 메서드를 호출하여 첫 번째 서브디렉터리를 설정합니다. writeDirectory 메서드는 서브디렉터리를 설정하고 새 디렉터리를 현재 디렉터리로 설정합니다. 서브디렉터리 두 개를 만들겠다고 명시했기 때문에 writeDirectory가 서브디렉터리를 설정합니다.

writeDirectory(t)

일반 디렉터리에 대해 설정한 것처럼 태그를 설정합니다. LibTIFF API에 따라 서브디렉터리에는 SubIFD 태그를 포함할 수 없습니다.

tagstruct2.ImageLength = size(img_half,1);
tagstruct2.ImageWidth = size(img_half,2);
tagstruct2.Photometric = Tiff.Photometric.RGB;
tagstruct2.BitsPerSample = 8;
tagstruct2.SamplesPerPixel = 3;
tagstruct2.RowsPerStrip = 16;
tagstruct2.Software = "MATLAB";
tagstruct2 % display tagstruct2
tagstruct2 = struct with fields:
        ImageLength: 325
         ImageWidth: 300
        Photometric: 2
      BitsPerSample: 8
    SamplesPerPixel: 3
       RowsPerStrip: 16
           Software: "MATLAB"

setTag(t,tagstruct2)

Tiff 객체의 write 메서드를 사용하여 이미지 데이터와 메타데이터를 서브디렉터리에 씁니다.

write(t,img_half)

writeDirectory 메서드를 호출하여 두 번째 서브디렉터리를 설정합니다. writeDirectory 메서드는 서브디렉터리를 설정하고 이 서브디렉터리를 현재 디렉터리로 만듭니다.

writeDirectory(t)

여느 디렉터리에 대해 설정하는 것처럼 태그를 설정합니다.

tagstruct3.ImageLength = size(img_third,1);
tagstruct3.ImageWidth = size(img_third,2);
tagstruct3.Photometric = Tiff.Photometric.RGB;
tagstruct3.BitsPerSample = 8;
tagstruct3.SamplesPerPixel = 3;
tagstruct3.RowsPerStrip = 16;
tagstruct3.Software = "MATLAB";
tagstruct3 % display tagstruct3
tagstruct3 = struct with fields:
        ImageLength: 217
         ImageWidth: 200
        Photometric: 2
      BitsPerSample: 8
    SamplesPerPixel: 3
       RowsPerStrip: 16
           Software: "MATLAB"

setTag(t,tagstruct3)

Tiff 객체의 write 메서드를 사용하여 이미지 데이터와 메타데이터를 서브디렉터리에 씁니다.

write(t,img_third)

Tiff 객체를 닫아 파일과의 연결을 닫습니다.

close(t)

태그 값 설정하기

다음 표에는 Tiff 객체가 지원하는 모든 TIFF 태그가 나와 있으며 이러한 태그의 MATLAB 클래스 및 크기에 대한 정보가 있습니다. 또한 특정 태그의 경우 Tiff 객체가 지원하는 일련의 값이 나와 있습니다. 이러한 값은 TIFF 사양에 따라 정의된 가능한 모든 값 중 일부입니다. 이러한 태그에 지원되는 값은 Tiff 속성 구조를 사용하여 지정할 수 있습니다. 예를 들어, Tiff.Compression.JPEG를 사용하여 JPEG 압축을 지정할 수 있습니다. 전체 속성 목록은 Tiff 함수 도움말 페이지를 참조하십시오.

표 1: 지원되는 TIFF 태그

TIFF 태그클래스크기지원되는 값참고
ArtistcharN
BitsPerSampledouble1×11, 8, 16, 32, 64표 2표 3을 참조하십시오.
ColorMapdouble256×3구간 [0, 1] 내에서 정규화된 값이어야 합니다. 내부적으로 uint16 값으로 저장됩니다.PhotometricPalette여야 합니다.
Compressiondouble1×1None: 1
CCITTRLE: 2
CCITTFax3: 3
CCITTFax4: 4
LZW: 5
JPEG: 7
CCITTRLEW: 32771
PackBits: 32773
Deflate: 32946
AdobeDeflate: 8
표 4를 참조하십시오.
Copyrightchar N
DateTimechar1×19필요한 경우 반환 값이 19자로 채워집니다.
DocumentNamecharN
DotRangedouble1×2PhotometricSeparated여야 합니다.
ExtraSamplesdoubleNUnspecified: 0
AssociatedAlpha: 1
UnassociatedAlpha: 2
FillOrderdouble1×1
GeoAsciiParamsTagcharN
GeoDoubleParamsTagdoubleN
GeoKeyDirectoryTagdoubleN×4
Group3Optionsdouble1×1CompressionCCITTFax3이어야 합니다.
Group4Optionsdouble1×1CompressionCCITTFax4여야 합니다.
HalfToneHintsdouble1×2
HostComputercharN
ICCProfileuint8N
ImageDescriptioncharN
ImageLengthdouble1×1
ImageWidthdouble1×1
InkNameschar cell arrayNumInksPhotometricSeparated여야 합니다.
InkSetdouble 1×1CMYK: 1
MultiInk: 2
PhotometricSeparated여야 합니다.
JPEGQualitydouble1×1구간 [1, 100]에 있는 값
Makechar N
MaxSampleValuedouble1×1구간 [0, 216-1]에 있는 값
MinSampleValuedouble1×1구간 [0, 216-1]에 있는 값
ModelcharN
ModelPixelScaleTagdouble1×3
ModelTiepointTagdoubleN×6
ModelTransformationMatrixTagdouble1×16
NumberOfInksdouble1×1NumberOfInksSamplesPerPixel과 같아야 합니다.
Orientationdouble1×1TopLeft: 1
TopRight: 2
BottomRight: 3
BottomLeft: 4
LeftTop: 5
RightTop: 6
RightBottom: 7
LeftBottom: 8
PageNamecharN
PageNumberdouble1×2
Photometricdouble1×1MinIsWhite: 0
MinIsBlack: 1
RGB: 2
Palette: 3
Mask: 4
Separated: 5
YCbCr: 6
CIELab: 8
ICCLab: 9
ITULab: 10
표 3을 참조하십시오.
Photoshopuint8 N
PlanarConfigurationdouble1×1Chunky: 1
Separate: 2
PrimaryChromaticitiesdouble1×6
ReferenceBlackWhitedouble1×6
ResolutionUnitdouble 1×1
RICHTIFFIPTCuint8N
RowsPerStripdouble1×1
RPCCoefficientTagdouble1×92표 6을 참조하십시오.
SampleFormatdouble1×1Uint: 1
Int: 2
IEEEFP: 3
표 2를 참조하십시오.
SamplesPerPixeldouble1×1
SMaxSampleValuedouble1×1이미지 데이터에 지정된 MATLAB 데이터형의 범위
SMinSampleValuedouble1×1이미지 데이터에 지정된 MATLAB 데이터형의 범위
SoftwarecharN
StripByteCountsdoubleN읽기 전용
StripOffsetsdoubleN읽기 전용
SubFileTypedouble1×1Default : 0
ReducedImage: 1
Page: 2
Mask: 4
SubIFDdouble1×1
TargetPrintercharN
Thresholdingdouble1×1BiLevel: 1
HalfTone: 2
ErrorDiffuse: 3
PhotometricMinIsWhite 또는 MinIsBlack이어야 합니다.
TileByteCountsdoubleN읽기 전용
TileLengthdouble1×116의 배수여야 합니다.
TileOffsetsdoubleN읽기 전용
TileWidthdouble1×116의 배수여야 합니다.
TransferFunctiondouble참고1 참조구간 [0, 216-1] 내에 있어야 합니다.SamplesPerPixel1 또는 3이어야 합니다.
WhitePointdouble1×2PhotometricRGB, Palette, YCbCr, CIELab, ICCLab 또는 ITULab이어야 합니다.
XMPcharNN > 5
XPostiondouble1×1
XResolutiondouble1×1
YCbCrCoefficientsdouble1×3PhotometricYCbCr이어야 합니다.
YCbCrPositioningdouble1×1Centered: 1
Cosited: 2
PhotometricYCbCr이어야 합니다.
YCbCrSubSamplingdouble1×2PhotometricYCbCr이어야 합니다.
YPositiondouble1×1
YResolutiondouble1×1
ZipQualitydouble1×1구간 [0, 9] 내에 있어야 합니다.

1 크기는 1×2BitsPerSample 또는 3×2BitsPerSample입니다.

표 2: BitsPerSample 설정에 유효한 SampleFormat

BitsPerSampleSampleFormatMATLAB 데이터형
1Uintlogical
8Uint, Intuint8, int8
16Uint, Intuint16, int16
32Uint, Int, IEEEFPuint32, int32, single
64IEEEFPdouble

표 3: BitsPerSamplePhotometric 조합에 유효한 SampleFormat

PhotometricBitsPerSample
18163264
MinIsWhite UintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
MinIsBlack UintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
RGB UintUintUint
IEEEFP
IEEEFP
PaletteUintUint
Mask Uint
Separated UintUintUint
IEEEFP
IEEEFP
YCbCr UintUintUint
IEEEFP
IEEEFP
CIELab UintUint
ICCLab UintUint
ITULab UintUint

표 4: BitsPerSampleCompression 조합에 유효한 SampleFormat

CompressionBitsPerSample
18163264
NoneUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
CCITTRLEUint
CCITTFax3Uint
CCITTFax4Uint
LZWUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
JPEGUint
Int
CCITTRLEWUint
PackBitsUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
DeflateUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
AdobeDeflateUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP

표 5: Photometric 설정에 유효한 SamplesPerPixel

PhotometricSamplesPerPixel
MinIsWhite 1+
MinIsBlack 1+
RGB 3+
Palette1
Mask 1
Separated 1+
YCbCr 3
CIELab 3+
ICCLab 3+
ITULab 3+

표 6: RPCCoefficientTag 값 설명 목록

92개 요소 벡터의 인덱스 값값 설명1단위
1RMS(제곱평균제곱근) 편향오차미터(가로축 기준)
2RMS 랜덤오차미터(가로축 기준)
3선 오프셋픽셀
4샘플 오프셋픽셀
5측지 위도 오프셋도(Degree)
6측지 경도 오프셋도(Degree)
7측지 높이 오프셋미터
8선 스케일링 인자픽셀
9샘플 스케일링 인자픽셀
10측지 위도 스케일도(Degree)
11측지 경도 스케일도(Degree)
12측지 높이 스케일링 인자미터
13~32유리 다항식 r(n)의 분자 계수2
33~52유리 다항식 r(n)의 분모 계수
53~72유리 다항식 c(n)의 분자 계수2
73~92유리 다항식 c(n)의 분모 계수

1RPCCoefficientTag 객체를 사용하여 이 벡터의 값을 지정하려면 Mapping Toolbox™의 RPCCoefficientTag (Mapping Toolbox) 항목을 참조하십시오.

2다항식 r(n)c(n)은 일반적인 엄밀 투영 모델(rigorous projection model)의 정규화된 행 값과 열 값을 나타냅니다.

참고 항목

관련 항목