이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

색 이진화 앱을 사용한 영상 분할

이 예제에서는 색 이진화 앱을 사용하여 영상을 분할하고 이진 마스크 영상을 만드는 방법을 보여줍니다. 이 예제는 여러 부분으로 구성됩니다. 첫 번째 부분에서는 색 이진화 앱에서 영상을 여는 방법을 보여줍니다. 두 번째 부분에서는 색 선택 옵션을 사용하여 영상을 자동으로 분할하는 방법을 보여줍니다. 세 번째 부분에서는 색 구성요소 컨트롤을 사용하여 반복법을 사용하여 이진화하는 방법을 보여줍니다. 색 이진화에 의한 분할은 반복적인 프로세스입니다. 먼저 색 선택을 사용하여 초기 분할을 수행한 다음 색 구성요소 컨트롤을 사용하여 이 분할을 미세 조정할 수 있습니다. 이 예제의 마지막 부분에서는 분할을 완료한 후에 수행할 수 있는 작업을 보여줍니다. 마스크 영상을 만들고, 원본 영상의 분할된 버전을 저장하고, 분할을 수행하는 데 사용된 MATLAB® 코드를 가져올 수 있습니다.

색 이진화 앱에서 영상 열기

이 예제에서는 색 이진화 앱에서 영상을 여는 방법을 보여줍니다. 앱을 처음 열면 어떤 컬러스페이스를 사용해서 영상의 색 구성요소를 나타낼지 선택해야 합니다. 분할하려는 색이 색 모델에서 서로 가까운 곳에 나타나는 컬러스페이스를 선택합니다. 나중에 언제든지 새 컬러스페이스(New Color Space)를 사용하여 선택한 컬러스페이스를 변경할 수 있습니다.

색 이진화 앱을 엽니다. MATLAB 툴스트립에서 앱 탭을 열고 영상 처리 및 컴퓨터 비전(Image Processing and Computer Vision) 아래에서 를 클릭합니다. colorThresholder 명령을 사용하여 앱을 열 수도 있습니다.

색 이진화 앱으로 영상을 불러옵니다. 영상 불러오기(Load Image)를 클릭합니다. 영상의 파일 이름을 지정하여 영상을 불러올 수도 있고, 작업 공간으로 영상을 읽어 들여서 변수를 불러올 수도 있습니다. 카메라에서 영상을 불러올 수도 있습니다(Acquire Live Images in the Color Thresholder App 항목 참조).

이 예제에서는 컬러 영상을 MATLAB 작업 공간으로 읽어 들인 후 영상을 표시합니다.

rgb = imread('peppers.png');

imshow(rgb)

앱의 영상 불러오기(Load Image) 메뉴에서 작업 공간에서 영상 불러오기(Load Image From Workspace)를 클릭합니다. 작업 공간에서 가져오기 대화 상자에서, 직접 만든 변수를 선택하고 확인(Confirm)을 클릭합니다.

영상의 색 구성요소를 나타낼 컬러스페이스를 선택합니다. 색 이진화 앱이 열리면 컬러스페이스 선택 탭에 영상이 표시되고, 더불어 이 영상을 널리 사용되는 컬러스페이스인 RGB, HSV, YCbCr, L*a*b*로 표현한 점 구름이 표시됩니다. 분할을 위한 색 분리가 가장 잘 되어있는 컬러스페이스를 선택합니다. 마우스를 사용해 점 구름들을 돌려보면서 각각 영상의 색을 어떻게 표현했는지 살펴봅니다. 이 예제에서는 YCbCr 컬러스페이스를 클릭합니다.

앱이 열리고 영상과 함께 각 색 구성요소에 대한 컨트롤 세트가 표시됩니다. YCbCr 컬러스페이스의 경우, 색 이진화는 영상의 색 구성요소를 나타내는 세 개의 히스토그램을 표시합니다. 이 컬러스페이스에서 Y 구성요소는 밝기를, Cb 구성요소는 파란색-노란색 스펙트럼을, Cr 구성요소는 빨간색-녹색 스펙트럼을 나타냅니다. 다른 컬러스페이스는 다른 유형의 컨트롤을 사용합니다. 또한, 색 이진화 앱은 영상의 색을 YCbCr 컬러스페이스에서 점 구름으로 변환한 것도 표시합니다. 히스토그램 양 끝에 있는 핸들을 잡아 값 스펙트럼 위에서 움직여서 분할을 수행할 수 있습니다. 또한 색 구름을 회전시켜서 분할하려는 색이 가장 잘 분리되어 있는 부분을 찾아볼 수 있습니다.

색 이진화의 색 선택기를 사용하여 영상 분할하기

이 부분에서는 영상 속에서 색을 선택하여 영상을 자동으로 분할하는 방법을 보여줍니다. 이 옵션을 사용하면 영상의 전경이나 배경에서 원하는 영역을 직접 그려서 색을 선택할 수 있습니다. 이 예제에서는 자주색 배경 위에 영역을 그려서 배경으로부터 채소를 분할합니다. 영역을 여러 개 그릴 수 있습니다. 색 선택을 사용하여 영상을 분할한 후에는 개별 색 구성요소 컨트롤을 사용하여 결과를 미세 조정할 수 있습니다. 색 이진화 앱의 색 구성요소 컨트롤을 사용하여 영상 분할하기 항목을 참조하십시오.

색 선택에 따라 영상을 자동 분할하려면 영상 위에 영역을 그리는 버튼을 클릭합니다. 커서를 영상 위로 이동하면 커서가 십자 모양으로 바뀝니다. 영상 위에서 커서를 끌어 영역을 그려서 분할하려는 색을 지정합니다. 영역을 여러 개 그릴 수 있습니다. 그린 영역을 삭제하고 다시 시작하려면 영역의 선을 마우스 오른쪽 버튼으로 클릭하고 삭제(Delete)를 선택합니다.

영역을 그리면 색 이진화 앱이 영역 안에 선택된 색에 따라 자동으로 영상을 이진화합니다. 분할이 반영되도록 색 컨트롤이 변경됩니다. 이 자동 분할은 전경과 배경 사이의 경계를 제대로 정의하지 못했습니다. 배경색이 영상의 하단 부근에서 더 밝습니다. 컨트롤을 움직여서 이진화를 미세 조정할 수 있습니다.

색 이진화 앱의 색 구성요소 컨트롤을 사용하여 영상 분할하기

예제의 이 부분에서는 색 이진화 앱의 색 구성요소 컨트롤을 사용하여 영상을 대화형 방식으로 분할하는 방법을 보여줍니다. 색 이진화 앱을 사용한 분할은 반복 수행이 필요합니다. 원하는 분할 결과를 달성하기까지 여러 가지 컬러스페이스를 시도해야 할 수 있습니다. 색 선택 옵션을 사용하여 초기 분할을 자동으로 수행한 다음 색 구성요소 컨트롤을 사용하여 결과를 미세 조정할 수도 있습니다. 색 이진화의 색 선택기를 사용하여 영상 분할하기 항목을 참조하십시오.

색 구성요소 컨트롤을 사용하여 영상을 대화형 방식으로 분할해 보십시오. 예를 들어, 히스토그램 슬라이더를 사용하여 각 히스토그램과 연결된 색을 선택하십시오. 분할이 진행되는 정도를 볼 수 있습니다. 이 예제에서는 Y 구성요소에서 슬라이더를 이동하는 것이 영상 분할에 가장 큰 영향을 줍니다. 이렇게 하면 전경이 분할되지만 작업을 마친 후에 분할을 반전하면 됩니다. 다음 그림을 보면 알 수 있듯이 컨트롤을 사용해서는 전경 영상의 일부를 포함하지 않는 깔끔한 배경 분할을 얻기가 어렵습니다. 다른 컬러스페이스를 사용하여 분할을 다시 해보겠습니다.

다른 컬러스페이스를 사용하려면 새 컬러스페이스(New Color Space)를 클릭하십시오. 앱이 컬러스페이스 선택(Choose a Color Space) 대화 상자를 다시 표시합니다.

컬러스페이스 선택 대화 상자에서 새 컬러스페이스를 선택합니다. 이 예제에서는 HSV 컬러스페이스를 선택합니다. 색 이진화 앱이 영상과 이 컬러스페이스의 색 구성요소 컨트롤을 새 탭에 표시합니다. HSV 컬러스페이스는 H 구성요소에 이중 방향 노브를 사용하고 S 구성요소와 V 구성요소에 두 개의 히스토그램 슬라이더를 사용합니다. 이 컬러스페이스에서 H는 색상(hue)을, S는 채도(saturation)를, V는 명도(value)를 나타냅니다. 이 탭에는 영상의 색을 표현한 점 구름도 포함되어 있습니다.

앞에서 YCbCr 컬러스페이스로 작업할 때와 마찬가지로, 색 구성요소 컨트롤을 사용하여 영상을 대화형 방식으로 분할합니다. 컨트롤을 사용하면서 분할이 진행되는 정도를 살펴봅니다. 마우스로 H 컨트롤의 핸들을 잡고 화살표 방향으로 움직여 보십시오. 전경으로부터 배경을 깔끔하게 분할할 수 있는지 컨트롤로 시도해 봅니다. 다음 그림에서 볼 수 있듯이 이 컬러스페이스에서는 H 컨트롤을 사용하여 양호한 분할을 얻을 수 있었습니다. 사소한 불완전한 부분들은 모폴로지 연산자 같은 다른 툴박스 함수를 사용하여 마스크 영상을 만든 후에 정리할 수 있습니다. 분할된 영상 저장에 대한 자세한 내용은 색 이진화 앱을 사용하여 영상 마스크 만들기 항목을 참조하십시오.

색 이진화 앱을 사용하여 영상 마스크 만들기

예제의 이 부분에서는 분할 후에 마스크 영상을 만드는 방법을 보여줍니다. 마스크 영상을 만들 때 사용한 MATLAB 코드와 분할된 영상을 가져올 수도 있습니다.

전경을 분할해 낸 후에는 마스크 반전(Invert Mask)을 클릭하여 전경과 배경을 바꿀 수 있습니다. 전경으로 작업해야 더 쉽게 깔끔한 분할을 얻을 수 있지만 원하는 것은 전경의 마스크일 때는 마스크 반전을 사용하면 유용합니다. 전경을 분할한 다음 마스크를 반전합니다.

이진 표시(Show Binary)를 클릭하여, 생성한 이진 마스크 영상을 봅니다.

분할에 만족하여 마스크 영상을 작업 공간에 저장하려면 내보내기(Export)를 클릭하고 영상 내보내기(Export Image) 옵션을 선택하십시오.

작업 공간으로 내보내기 대화 상자에서 이 이진 마스크 영상의 변수 이름을 지정합니다. 원본 영상과 원본 영상의 분할된 버전도 저장할 수 있습니다.

방금 수행한 분할을 다시 만드는 데 필요한 MATLAB 코드를 저장하려면 내보내기(Export)를 클릭하고 함수 내보내기(Export Function)를 선택하십시오. 색 이진화 앱이 MATLAB 편집기를 열어서 해당 분할을 생성한 코드를 표시합니다. 코드를 저장하려면 MATLAB 편집기에서 저장(Save)을 클릭하십시오. 이 코드를 실행하고 코드에 RGB 영상을 전달하여 프로그래밍 방식으로 동일한 마스크 영상을 만들 수 있습니다.

function [BW,maskedRGBImage] = createMask(RGB)
%createMask  Threshold RGB image using auto-generated code from colorThresholder app.
%  [BW,MASKEDRGBIMAGE] = createMask(RGB) thresholds image RGB using
%  auto-generated code from the colorThresholder App. The colorspace and
%  minimum/maximum values for each channel of the colorspace were set in the
%  App and result in a binary mask BW and a composite image maskedRGBImage,
%  which shows the original RGB image values under the mask BW.

% Auto-generated by colorThresholder app on 22-Jun-2016
%------------------------------------------------------


% Convert RGB image to chosen color space
I = rgb2hsv(RGB);

% Define thresholds for channel 1 based on histogram settings
channel1Min = 0.713;
channel1Max = 0.911;

% Define thresholds for channel 2 based on histogram settings
channel2Min = 0.049;
channel2Max = 0.971;

% Define thresholds for channel 3 based on histogram settings
channel3Min = 0.005;
channel3Max = 1.000;

% Create mask based on chosen histogram thresholds
sliderBW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...
    (I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...
    (I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);
BW = sliderBW;

% Invert mask
BW = ~BW;

% Initialize output masked image based on input image.
maskedRGBImage = RGB;

% Set background pixels where BW is false to zero.
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;

end