Main Content

다중분광 영상에서 식생 찾기

이 예제에서는 MATLAB® 배열 산술 연산을 사용하여 영상을 처리하고 영상 데이터를 플로팅하는 방법을 보여줍니다. 특히 이 예제에서는 3차원 영상 배열을 사용하는데, 그 세 개의 평면이 가시 적색 및 근적외선(NIR) 채널을 비롯한 전자기 스펙트럼의 서로 다른 부분에서 얻은 영상 신호를 나타냅니다.

영상 데이터 차이를 이용하여 한 영상의 서로 다른 곡면 특징을 구별할 수 있는데, 이 곡면 특징은 스펙트럼 채널에 따라 반사율이 달라집니다. 이 예제에서는 가시 적색 채널과 NIR 채널의 차이를 찾아내는 방법으로 대규모 식생이 있는 영역을 식별합니다.

1단계: 다중분광 영상 파일에서 컬러-적외선 채널 가져오기

이 예제에서는 프랑스 파리의 모습을 담은 LANDSAT Thematic Mapper 영상(Space Imaging, LLC. 제공)에서 식생을 찾습니다. 7개의 스펙트럼 채널(대역)이 Erdas LAN 형식의 파일 하나에 저장되어 있습니다. LAN 파일 paris.lan에 7채널 512×512 Landsat 영상이 있습니다. 128바이트 헤더 다음에 픽셀 값이 오는데, 이러한 픽셀 값은 대역 번호가 오름차순인 BIL(Band Interleaved by Line) 형식입니다. 픽셀 값은 부호 없는 8비트 정수이며, 리틀 엔디안 바이트 순서로 저장됩니다.

가장 먼저 MATLAB® 함수 multibandread를 사용하여 LAN 파일에서 대역 4, 3, 2를 읽어 들여야 합니다.

채널 4, 3, 2가 전자기 스펙트럼의 NIR(근적외선), 가시 적색, 가시 녹색 영역을 나타냅니다. 이 채널들이 각각 RGB 영상의 빨간색, 녹색, 파란색 평면에 매핑되면 표준 CIR(컬러-적외선) 합성본이 생성됩니다. multibandread에 대한 마지막 입력 인수는 어떤 대역을 어떤 순서로 읽어 들일지를 지정하며, 이로써 단 한 단계로 합성 영상을 만들 수 있습니다.

CIR = multibandread('paris.lan',[512, 512, 7],'uint8=>uint8',...
                    128,'bil','ieee-le',{'Band','Direct',[4 3 2]});

변수 CIRuint8 클래스의 512×512×3 배열입니다. RGB 영상이지만, 가색상(false color)입니다. 영상이 표시되면 빨간색 픽셀은 NIR 채널을, 녹색 픽셀은 가시 적색 채널을, 파란색 픽셀은 가시 녹색 채널을 나타냅니다.

CIR 영상에서 물의 특징은 매우 어두우며(세느강) 녹색 식생은 빨간색으로 나타납니다(공원, 그늘 나무). 영상이 이렇게 표시되는 가장 큰 이유는 건강하고 엽록소가 풍부한 식생은 근적외선에서 반사율이 높기 때문입니다. NIR 채널이 합성 영상의 빨간색 채널에 매핑되므로 식생 밀도가 높은 영역은 빨간색으로 나타납니다. 그 대표적인 예가 왼쪽 가장자리의 밝은 빨간색 영역인데, 바로 파리 도심의 서쪽, 세느강의 굽이진 곳에 있는 큰 공원(불로뉴 숲)입니다.

imshow(CIR)
title('CIR Composite')
text(size(CIR,2),size(CIR,1) + 15,...
  'Image courtesy of Space Imaging, LLC',...
  'FontSize',7,'HorizontalAlignment','right')

Figure contains an axes object. The axes object with title CIR Composite contains 2 objects of type image, text.

NIR 채널과 빨간색 채널의 차이를 분석하면 초목 영역과 기타 표면(인도, 나지, 빌딩, 물 등)의 이 스펙트럼 성분 대비를 수량화할 수 있습니다.

2단계: NIR-빨간색 스펙트럼 산점도 플롯 생성하기

NIR 채널(빨간색 픽셀 값으로 표시됨)과 가시 적색 채널(녹색 픽셀 값으로 표시됨)을 비교할 때 산점도 플롯에서 시작하는 게 좋습니다. 원본 CIR 합성 영상으로부터 이 채널들을 개별 변수로 추출하는 게 편리합니다. uint8 클래스에서 single 클래스로 변환하는 것도 도움이 됩니다. 그러면 같은 변수를 산점도 플롯뿐만 아니라 아래의 NDVI 계산에도 사용할 수 있기 때문입니다.

NIR = im2single(CIR(:,:,1));
R = im2single(CIR(:,:,2));

두 채널을 회색조 영상으로 함께 보면 어떻게 다르게 나타나는지 알 수 있습니다.

imshow(R)
title('Visible Red Band')

Figure contains an axes object. The axes object with title Visible Red Band contains an object of type image.

imshow(NIR)
title('Near Infrared Band')

Figure contains an axes object. The axes object with title Near Infrared Band contains an object of type image.

간단히 MATLAB에서 plot 명령을 호출하여 픽셀당 하나의 점을 표시하는 산점도 플롯을 만들 수 있습니다(여기서는 파란색 십자로 표시됨). 그 x 좌표는 빨간색 채널의 값에 의해, y 좌표는 NIR 채널의 값에 의해 결정됩니다.

plot(R,NIR,'+b')
ax = gca;
ax.XLim  = [0 1];
ax.XTick = 0:0.2:1;
ax.YLim  =  [0 1];
ax.YTick = 0:0.2:1;
axis square
xlabel('red level')
ylabel('NIR level')
title('NIR vs. Red Scatter Plot')

Figure contains an axes object. The axes object with title NIR vs. Red Scatter Plot, xlabel red level, ylabel NIR level contains 512 objects of type line.

파리 풍경을 담은 산점도 플롯은 여름철 울창한 나무와 온화한 날씨가 특징인 도시 지역의 전형적인 모습입니다. 대각선 근처에는 NIR 값과 빨간색 값이 거의 같은 픽셀 집합이 있습니다. 이 "회색 경계"에는 도로 표면, 수많은 루프탑 등과 같은 특징이 포함되어 있습니다. 위쪽과 왼쪽에는 대개 NIR 값이 빨간색 값보다 훨씬 높은 픽셀의 집합이 있습니다. 이 영역은 사실상 모든 녹색 식생을 포함하고 있습니다.

3단계: MATLAB® 배열 산술 연산을 통해 식생 지수 계산하기

산점도 플롯을 보면, 빨간색 수준 대 NIR 수준의 비율을 계산하는 것이 울창한 식생을 포함한 픽셀의 위치를 찾는 방법이 될 수 있습니다. 하지만 그렇게 하면 어두운 픽셀, 즉 양쪽 채널에 있는 값이 작은 픽셀에서 잡음이 생깁니다. 게다가 엽록소가 많을수록 NIR 채널과 빨간색 채널의 차이가 더 커진다는 점에 유의하십시오. 이 두 번째 사항 때문에 NDVI(Normalized Difference Vegetation Index: 정규화 식생 지수)가 각광받습니다. (NIR - 빨간색) 차이를 정규화하여 구름 또는 언덕의 그림자와 같이 고르지 않은 조도의 효과를 조정합니다. 즉 픽셀×픽셀 기준에서는 NIR 채널의 값에서 빨간색 채널의 값을 뺀 다음 그 합계로 나눕니다.

ndvi = (NIR - R) ./ (NIR + R);

MATLAB의 배열 산술 연산자를 사용해 간단한 명령 하나로 전체 NDVI 영상을 계산하는 방법을 알려드리겠습니다. 아시다시피 변수 RNIRsingle 클래스입니다. 따라서 double 클래스보다 더 적은 저장 공간을 사용하면서도 정수 클래스와 달리 결과로 얻는 비율 값의 변화가 매끄럽습니다.

변수 ndvisingle 클래스의 2차원 배열이며, 이론상 최대 범위는 [-1 1]입니다. ndvi를 회색조 영상으로 표시할 때 이 이론상 한도를 지정할 수 있습니다.

figure
imshow(ndvi,'DisplayRange',[-1 1])
title('Normalized Difference Vegetation Index')

Figure contains an axes object. The axes object with title Normalized Difference Vegetation Index contains an object of type image.

세느강은 NDVI 영상에서 매우 어둡게 나타납니다. 이 영상의 왼쪽 가장자리 근처에 있는 크고 밝은 영역은 앞서 언급한 공원(불로뉴 숲)입니다.

4단계: 식생 찾기 -- NDVI 영상 이진화

많은 식생을 포함할 가능성이 높은 픽셀을 식별하려면 NDVI 영상에 간단한 임계값을 적용하십시오.

threshold = 0.4;
q = (ndvi > threshold);

선택된 픽셀의 비율은

100 * numel(NIR(q(:))) / numel(NIR)
ans = 5.2204

약 5%입니다.

논리형(이진) 영상 q를 표시할 때 공원 및 이보다 작은 또 다른 식생 영역이 기본적으로 흰색으로 나타납니다.

imshow(q)
title('NDVI with Threshold Applied')

Figure contains an axes object. The axes object with title NDVI with Threshold Applied contains an object of type image.

5단계: 스펙트럼 성분과 공간 성분 연결하기

스펙트럼 성분과 공간 성분을 연결하기 위해 NIR-빨간색 산점도 플롯에서 임계값보다 높은 픽셀을 찾으려면, 그 픽셀에 대비되는 색(녹색)을 사용하는 산점도 플롯을 다시 그린 다음 같은 파란색-녹색 체계로 임계값 NDVI 영상을 다시 표시하십시오. 예상대로 NDVI 값이 임계값보다 높은 픽셀은 나머지 영역에서 왼쪽 위에 나타나며, CIR 합성 영상에서 빨간색이 더 두드러지는 픽셀에 대응합니다.

산점도 플롯을 만든 다음 이진화된 NDVI를 표시합니다.

figure
subplot(1,2,1)
plot(R,NIR,'+b')
hold on
plot(R(q(:)),NIR(q(:)),'g+')
axis square
xlabel('red level')
ylabel('NIR level')
title('NIR vs. Red Scatter Plot')

subplot(1,2,2)
imshow(q)
colormap([0 0 1; 0 1 0]);
title('NDVI with Threshold Applied')

Figure contains 2 axes objects. Axes object 1 with title NIR vs. Red Scatter Plot, xlabel red level, ylabel NIR level contains 513 objects of type line. Axes object 2 with title NDVI with Threshold Applied contains an object of type image.

참고 항목

| |

관련 예제

세부 정보