Main Content

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

이 예제에서는 색 이진화 앱을 사용하여 영상을 분할하고 이진 마스크 영상을 만드는 방법을 보여줍니다. 이 예제에서는 색 값을 기반으로 배경(자주색 천)에서 전경(피망)을 분할합니다.

색 이진화 앱에서 영상 분할은 반복적인 과정일 수 있습니다. 예를 들어, 특정 컬러스페이스가 다른 컬러스페이스보다 특정 색을 더 잘 분리할 수 있으므로 지원되는 여러 개의 컬러스페이스에서 영상을 분할해 보십시오. 지원되는 컬러스페이스에서 전경이나 배경의 영역을 하나 선택하여 초기 자동 분할을 수행할 수 있습니다. 그런 다음 앱에서 제공하는 색 성분 컨트롤을 사용하여 분할을 미세 조정할 수 있습니다.

이 예제의 마지막 부분에서는 작업의 결과를 저장하고, 마스크 영상을 만들고, 앱에서 분할을 수행하는 데 사용한 MATLAB® 코드를 가져옵니다.

색 이진화 앱에서 영상 열기

컬러 영상을 작업 공간으로 읽어 들입니다.

rgb = imread('peppers.png');

MATLAB 툴스트립에서 색 이진화 앱을 엽니다. 앱 탭의 영상 처리 및 컴퓨터 비전 섹션에서 색 이진화 를 클릭합니다.

색 이진화 앱으로 영상을 불러옵니다. 영상 불러오기를 클릭하고 작업 공간에서 영상 불러오기 를 선택합니다. 작업 공간에서 가져오기 대화 상자에서, 작업 공간에 있는 영상을 선택하고 확인을 클릭합니다.

명령줄에서 colorThresholder 함수를 사용하고 colorThresholder(rgb);와 같이 영상의 이름을 지정하여 앱을 열 수도 있습니다. 영상을 수집할 수도 있습니다(Acquire Live Images in the Color Thresholder App 항목 참조).

색 이진화 앱이 컬러스페이스 선택 탭에 영상을 표시하고, 더불어 이 영상을 표현하는 포인트 클라우드를 RGB, HSV, YCbCr, L*a*b* 컬러스페이스에 표시합니다. 색 기반 분할을 위해 색 분리가 가장 잘 되어 있는 컬러스페이스를 선택합니다. 마우스를 사용해 포인트 클라우드 표현들을 돌려보면서 각각 개별 색을 어떻게 분리하는지 살펴봅니다. 색 이진화 앱을 사용한 분할은 반복 수행이 필요합니다. 원하는 분할 결과를 얻을 때까지 여러 가지 컬러스페이스를 시도해 보십시오. 이 예제에서는 먼저 YCbCr 컬러스페이스부터 시작해 보겠습니다.

색 이진화 앱에서 YCbCr 영상 분할하기

컬러스페이스를 선택하면 앱에서 새 탭이 열리고 영상과 함께 각 색 성분에 대한 컨트롤 세트와 포인트 클라우드 표현이 표시됩니다. 색 컨트롤은 컬러스페이스에 따라 달라집니다. YCbCr 컬러스페이스에서 색 이진화 앱은 밝기를 나타내는 Y 성분, 파란색-노란색 스펙트럼을 나타내는 Cb 성분, 빨간색-녹색 스펙트럼을 나타내는 Cr 성분을 세 개의 히스토그램으로 표시합니다.

영상을 살펴보려면 영상 위에서 커서를 움직여서 패닝 및 확대/축소 컨트롤에 액세스합니다.

자동 이진화

먼저 자동 이진화를 사용하여 영상을 분할합니다. 배경색(자주색 천)이 균일한 색에 가까우므로 전경 객체(피망) 대신 배경을 분할합니다. 나중에 언제든지 마스크 반전 옵션을 사용하여 마스크를 반전할 수 있습니다.

직접 그리기 ROI 툴을 사용하여 영역을 정의합니다. 영상의 왼쪽 위 코너에 있는 버튼 을 클릭하고 배경 위에 ROI를 그립니다. 영역을 여러 개 그릴 수 있습니다.

영역을 그리면 색 이진화 앱이 영역 안에 선택된 색에 따라 자동으로 영상을 이진화합니다. 분할이 반영되도록 Y, Cb, Cr 색 컨트롤이 변경됩니다. 이와 같은 자동 이진화는 특히 전경과 배경 사이의 하단 테두리에서 전경과 배경을 깔끔하게 분할하지 못합니다. 이 예제에서는 배경색이 영상의 하단 부근에서 더 밝습니다. 그린 영역을 삭제하고 다시 시작하려면 영역의 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 직접 그리기 삭제를 선택합니다.

색 컨트롤을 사용하여 자동 이진화 미세 조정하기

자동 이진화를 미세 조정하려면 색 컨트롤을 사용하십시오. 각각의 Y, Cb, Cr 색 컨트롤에 대해 해당 히스토그램에서 하한과 상한을 끌어서 값의 범위를 설정할 수 있습니다. 색 컨트롤을 사용하여 전경의 분할을 크게 개선할 수 있습니다.

포인트 클라우드를 사용하여 영상의 색 값 이진화하기

YCbCr 컬러스페이스에서 영상을 분할하는 또 다른 방법은 포인트 클라우드 위에 ROI를 그려서 색 범위를 선택하는 것입니다.

앱 툴스트립에서 임계값 재설정을 클릭하여 원본 영상으로 복원합니다. 앱의 오른쪽 아래 창에서 포인트 클라우드를 클릭하고 끌어서 이진화하려는 색의 보기가 분리될 때까지 회전시킵니다. 포인트 클라우드의 왼쪽 위 코너에 있는 버튼을 클릭합니다. 색 이진화 앱이 3차원 포인트 클라우드를 2차원 표현으로 변환하고 다각형 ROI 툴을 활성화합니다. 분할하려는 색(자주색) 주위에 ROI를 그립니다. 이 방법은 초기 자동 이진화 방법보다 나은 분할을 만들 수 있습니다.

다른 컬러스페이스에서 영상 분할하기

다른 컬러스페이스에서 영상을 분할하려면 앱 툴스트립에서 새 컬러스페이스를 클릭하십시오. 컬러스페이스 선택 탭에서 HSV 컬러스페이스를 선택합니다.

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

이전 반복에서처럼 포인트 클라우드를 포함하여 대화형 색 성분 컨트롤 및 자동 이진화를 비롯한 동일한 기법을 모두 사용할 수 있습니다. 색 컨트롤을 사용하면 분할이 진행되는 정도를 볼 수 있습니다. H 컨트롤 창에서 화살을 한 번에 하나씩 클릭하고 끌어서 색상의 범위를 변경합니다. 전경으로부터 배경이 깔끔하게 분할될 때까지 컨트롤로 시도해 봅니다. 사소한 불완전한 부분들은 모폴로지 연산자 같은 툴박스 함수를 사용하여 마스크 영상을 만든 후에 정리할 수 있습니다.

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

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

예제에서 전경 객체(피망) 대신 배경(자주색 천)을 분할했으므로 마스크 반전을 클릭하여 전경과 배경을 바꿉니다.

앱 툴스트립에서 이진 표시를 클릭하여, 생성한 이진 마스크 영상을 봅니다.

마스크 영상을 작업 공간에 저장합니다. 마스크 툴스트립에서 내보내기를 클릭하고 영상 내보내기를 선택합니다.

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

분할을 다시 만드는 데 필요한 MATLAB 코드를 저장하려면 내보내기를 클릭하고 함수 내보내기를 선택하십시오. 색 이진화 앱이 MATLAB 편집기를 열어서 해당 분할을 생성한 코드를 표시합니다. 코드를 저장하려면 MATLAB 편집기 툴스트립에서 저장을 클릭하십시오. 이 코드를 실행하고 코드에 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

참고 항목