MATLAB에서 이미지 유형 사용하기
MATLAB®은 이미지를 배열(주로 2차원 행렬)로 표현하며, 배열의 각 요소는 표시된 이미지에서 하나의 픽셀에 해당합니다. MATLAB에서 이미지로 작업하는 것은 다른 유형의 행렬 데이터를 사용하는 것과 비슷하며, MATLAB에서는 어떠한 2차원 데이터라도 이미지로 표시할 수 있습니다. 이미지를 표시하는 두 가지 일반적인 방법은 다음과 같습니다.
이미지 파일 읽기 및 표시하기 —
imshow
를 사용하여 이미지 파일을 표시합니다. 이 경우 파일은 일반적으로 그림을 나타냅니다.배열 데이터를 이미지로 표시하기 —
image
또는imagesc
를 사용하여 배열 데이터를 표시합니다. 이때 배열 데이터는 반드시 그림을 나타내는 것은 아니지만, 이미지로 시각화할 수 있는 복잡한 패턴을 포함할 수 있습니다.
이미지 유형
세 가지 일반적인 이미지 유형은 다양한 배열 차원을 가지며, 인덱스 이미지, 회색조(명암) 이미지, RGB(트루컬러) 이미지입니다. 다음 표에 이미지 유형이 요약되어 있습니다.
이미지 유형 | 데이터 행렬 | 컬러맵 행렬 | 예 |
---|---|---|---|
인덱스 이미지 | m×n | p×3 |
|
회색조(명암) 이미지 | m×n | 기본적으로 없지만, 컬러맵을 적용할 수 있습니다. | |
RGB(트루컬러) 이미지 | m×n×3 | 없음 |
이미지 파일로 작업하는 경우 imfinfo
함수를 사용하여 이미지 유형을 확인할 수 있습니다. 예를 들어, peppers.png
의 이미지 유형을 확인합니다.
info = imfinfo("peppers.png");
info.ColorType
ans = 'truecolor'
이미지 파일 읽기 및 표시하기
이미지로 작업할 때는 대개 이미지 데이터를 MATLAB 작업 공간으로 불러오고, 이미지를 표시하고, 이미지 데이터를 조작합니다. 그러나 이미지로 작업하는 과정은 이미지 유형에 따라 다릅니다.
인덱스 이미지
인덱스 이미지는 이미지 데이터 행렬 X
및 컬러맵 행렬 map
으로 저장됩니다. map
의 각 행은 하나의 색을 나타내는 빨간색, 녹색, 파란색 성분을 지정합니다. 인덱스 이미지는 픽셀 값과 컬러맵 값 간에 직접 매핑을 사용합니다. 각 이미지 픽셀의 색은 X
의 대응값을 컬러맵에 저장된 색 값에 대한 인덱스(포인터)로 사용하여 결정됩니다. X
는 정수를 포함하는 m×n 행렬로, 값 1이 map
의 첫 번째 행을, 값 2가 두 번째 행을 가리키는 식으로 진행됩니다.
예를 들어, 옥수수를 나타내는 아래 인덱스 이미지의 경우 데이터 행렬의 값 2는 컬러맵의 행 2에 대한 인덱스이고, 데이터 행렬의 값 15는 컬러맵의 행 15에 대한 인덱스입니다.
인덱스 이미지 읽기 및 표시하기
imread
를 사용하여 인덱스 이미지를 불러옵니다. 이때 데이터 행렬 X
와 컬러맵 map
을 모두 출력 인수로 지정합니다. 그런 다음 컬러맵을 사용하여 데이터 행렬을 표시합니다.
[X,map] = imread("corn.png");
imshow(X,map)
map
은 이미지 파일과 연결된 컬러맵을 저장합니다. 그러나 imshow
함수를 사용하여 임의의 컬러맵을 지정할 수 있습니다. 예를 들어, map
을 회색조 컬러맵으로 변환하고 새 컬러맵을 사용하여 이미지 데이터를 표시합니다.
newmap = cmap2gray(map); imshow(X,newmap)
행렬 첨자를 사용하여 이미지 데이터 행렬에서 하나의 픽셀을 선택할 수 있습니다. 이미지 데이터 행렬의 크기는 이미지의 픽셀 개수에 해당합니다. 예를 들어, X
는 415개의 픽셀 행과 312개의 픽셀 열로 구성된 이미지를 나타냅니다.
sz = size(X)
sz = 1×2
415 312
X
의 행 2, 열 15에 있는 픽셀의 컬러맵 인덱스를 가져옵니다.
val = X(2,15)
val = uint8
39
map
의 요소를 참조하여 이 픽셀의 빨간색, 녹색, 파란색 명암에 해당하는 3개의 값을 표시합니다.
color = map(val,:)
color = 1×3
0.4588 0.2902 0.2627
회색조(명암) 이미지
회색조 이미지는 명암 이미지라고도 하며, m×n 데이터 행렬 X
로 저장되고 행렬의 값은 특정 범위 내의 명암을 나타냅니다. 회색조 이미지는 단일 행렬로 표현되며, 행렬의 각 요소는 하나의 이미지 픽셀에 대응됩니다. 회색조 이미지는 컬러맵과 함께 저장되는 경우가 드물지만 회색조 컬러맵은 여전히 회색조 이미지를 표시하는 데 사용됩니다. 기본적으로, 회색조 이미지는 인덱스 이미지로 처리됩니다.
예를 들어, 옥수수를 나타내는 아래 회색조 이미지의 경우 데이터 행렬에는 각 픽셀의 명암을 나타내는 [0, 255] 범위의 정수가 포함되어 있습니다.
회색조 이미지 읽기 및 표시하기
회색조 이미지를 작업 공간으로 불러와서 표시합니다.
X = imread("corn_gray.png");
imshow(X)
다른 컬러맵을 사용하여 회색조 이미지를 표시할 수 있습니다. 예를 들어, winter
컬러맵을 사용하여 회색조 이미지를 파란색과 녹색의 음영으로 표시합니다.
imshow(X,winter)
행렬 첨자를 사용하여 이미지의 픽셀 명암에 액세스할 수 있습니다. 예를 들어, X
의 행 2, 열 15에 있는 픽셀의 회색조 명암 값을 가져옵니다.
val = X(2,15)
val = uint8
156
RGB(트루컬러) 이미지
트루컬러 이미지라고도 하는 RGB 이미지는 m×n×3 데이터 배열로 저장됩니다. 이 데이터 배열은 각각의 개별 픽셀에 대해 빨간색, 녹색, 파란색의 색 성분을 정의합니다. 그래픽스 파일 형식은 RGB 이미지를 24비트 이미지로 저장하며, 여기서 빨간색, 녹색, 파란색 성분은 각각 8비트입니다. 이 배열 방식으로 1,600만 개의 색이 생성될 수 있습니다. 실제 이미지가 정확히 표현될 수 있는 수준의 정밀도를 제공하므로 “트루컬러 이미지”라는 이름이 붙여져 있습니다.
RGB 이미지는 컬러맵을 사용하지 않습니다. 각 픽셀의 색은 각 색 평면의 픽셀 위치에 저장된 빨간색, 녹색, 파란색 명암의 조합으로 결정됩니다. 예를 들어, RGB 이미지 X
의 픽셀 (10, 5)의 빨간색, 녹색, 파란색 성분은 각각 X(10,5,1)
, X(10,5,2)
, X(10,5,3)
에 저장됩니다.
RGB 이미지 읽기 및 표시하기
RGB 이미지를 불러옵니다. RGB 이미지 데이터는 각 픽셀이 빨간색, 녹색, 파란색 명암 값으로 표현되는 m
×n
×3 배열로 저장되므로 이미지 데이터 X
에 색 데이터가 포함되어 있습니다. 그런 다음 이미지를 표시합니다.
X = imread("earth.jpg");
imshow(X)
RGB 이미지의 데이터 배열을 사용하면 이미지 크기와 색에 손쉽게 액세스할 수 있습니다. 이미지 데이터 배열의 크기는 이미지의 픽셀 개수에 해당합니다. 예를 들어, X
는 257개의 픽셀 행과 250개의 픽셀 열로 구성된 이미지를 나타냅니다.
size(X)
ans = 1×3
257 250 3
픽셀의 색을 확인하려면 데이터 배열의 세 번째 차원에 저장된 RGB 3색을 살펴보십시오. 예를 들어, X
의 행 50, 열 150에 있는 픽셀의 색을 가져옵니다. 요소는 픽셀 색의 빨간색, 녹색, 파란색 명암을 각각 범위 0 ~ 255로 나타냅니다.
color = X(50,150,1:3)
color = 1x1x3 uint8 array
color(:,:,1) =
119
color(:,:,2) =
102
color(:,:,3) =
110
배열 데이터를 이미지로 표시하기
배열 데이터로 작업할 때는 데이터 값의 상대적 명암 같은 복잡한 패턴을 이해하고 분석하기 위해 배열 데이터를 이미지로 표시합니다. image
함수와 imagesc
함수를 사용하면 작업 공간에 있는 2차원 행렬의 데이터를 이미지로 표시하고 이 이미지에 컬러맵을 적용할 수 있습니다.
예를 들어, 2차원 행렬을 생성합니다. 그런 다음 이 행렬을 이미지로 표시합니다.
X = 4*peaks(100); image(X)
데이터 값들의 차이를 더 효과적으로 시각화하려면 imagesc
함수를 사용하고 컬러맵을 지정하여 이미지 데이터가 표시되는 방식을 사용자 지정할 수 있습니다. 이미지를 컬러바와 함께 표시하여 이미지 데이터가 컬러맵의 다양한 명암에 어떻게 매핑되는지 확인합니다.
imagesc(X); colormap(turbo) colorbar
MATLAB이 이미지의 종횡비를 유지하고 픽셀을 정사각형으로 표시하도록 좌표축 제한 스타일을 "equal"
로 설정합니다. 추가적으로 좌표축 제한을 설정합니다.
axis equal
xlim([0 100])
ylim([0 100])