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 spaceI = rgb2hsv(RGB);% Define thresholds for channel 1 based on histogram settingschannel1Min = 0.713; channel1Max = 0.911;% Define thresholds for channel 2 based on histogram settingschannel2Min = 0.049; channel2Max = 0.971;% Define thresholds for channel 3 based on histogram settingschannel3Min = 0.005; channel3Max = 1.000;% Create mask based on chosen histogram thresholdssliderBW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) &...(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) &...(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max); BW = sliderBW;% Invert maskBW = ~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

참고 항목