Main Content

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

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

색 이진화를 통한 영상 분할에는 반복 수행이 필요할 수 있습니다. 예를 들면 특정 컬러스페이스가 특정 색을 다른 컬러스페이스보다 잘 분리할 수도 있으므로, 다양한 컬러스페이스에서 영상을 분할해 볼 수 있습니다. 지원되는 컬러스페이스에서 전경이나 배경의 영역을 하나 선택하여 초기 자동 분할을 수행할 수 있습니다. 그런 다음 앱에서 제공하는 색 성분 컨트롤을 사용하여 분할을 미세 조정할 수 있습니다.

이 예제에서는 이진 마스크 영상을 만들고, 작업의 결과를 저장하고, 분할을 다시 생성하는 데 사용할 수 있는 MATLAB® 코드를 내보내는 방법도 보여줍니다.

색 이진화 앱에서 영상 열기

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

im = imread("peppers.png");

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

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

다음과 같이 colorThresholder 함수에 영상의 변수 이름을 지정하여 명령줄에서 앱을 열 수도 있습니다.

colorThresholder(im)

컬러스페이스 선택

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

영상 분할

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

패닝과 확대/축소 컨트롤에 액세스하려면 영상 위에서 커서를 움직입니다.

자동 이진화

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

직접 그리기 ROI 툴을 사용하여 영역을 정의합니다. 영상의 오른쪽 위 코너의 좌표축 도구 모음에 있는 올가미 아이콘 을 클릭하고 배경 위에 ROI를 그립니다. 영역을 여러 개 그릴 수 있습니다. 그린 영역을 삭제하고 다시 시작하려면 영역의 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 직접 그리기 삭제를 선택합니다.

영역을 그리면 색 이진화에서 영역 안에 선택된 색에 따라 자동으로 영상을 이진화합니다. 분할이 반영되도록 Y, Cb, Cr 색 컨트롤이 변경됩니다. 이와 같은 자동 이진화는 특히 전경과 배경 사이의 하단 테두리에서 전경과 배경을 깔끔하게 분할하지 못합니다. 이 예제에서는 배경색이 영상의 하단 부근에서 더 밝습니다.

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

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

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

색 범위를 선택하는 또 다른 방법은 포인트 클라우드 위에 ROI를 그리는 것입니다.

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

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

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

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

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

마스크 영상 만들기

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

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

결과 내보내기

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

작업 공간으로 내보내기 대화 상자에서 이 이진 마스크 영상의 변수 이름을 지정합니다. 원본 입력 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
%  range for each channel of the colorspace were set within the app. The
%  segmentation mask is returned in BW, and a composite of the mask and
%  original RGB images is returned in maskedRGBImage.

% Auto-generated by colorThresholder app on 01-Jan-2023
%------------------------------------------------------


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

% Define thresholds for channel 1 based on histogram settings
channel1Min = 0.734;
channel1Max = 0.921;

% Define thresholds for channel 2 based on histogram settings
channel2Min = 0.334;
channel2Max = 1.000;

% Define thresholds for channel 3 based on histogram settings
channel3Min = 0.000;
channel3Max = 0.868;

% 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

참고 항목

관련 항목