色のしきい値を使用したイメージのセグメント化とマスクの作成
この例では、色のしきい値アプリを使用してイメージをセグメント化し、バイナリ マスク イメージを作成する方法を説明します。この例では、色値に基づいて背景 (紫色の布) から前景 (ピーマン) をセグメント化します。
色のしきい値処理によるイメージのセグメント化は、反復的なプロセスになる場合があります。たとえば、ある色空間では、別の色空間よりも特定の色をよく分離できる場合があるため、さまざまな色空間内でイメージのセグメント化を試みることができます。サポートされているどの色空間においても、前景または背景の領域を選択することで、最初に自動セグメンテーションを実行できます。その後、アプリの提供する色成分のコントロールを使用して、セグメンテーションを調整できます。
この例では、バイナリ マスク イメージを作成して、作業の結果を保存し、そのセグメンテーションの再現を可能にする MATLAB® コードをエクスポートする方法も説明します。
色のしきい値アプリでイメージを開く
カラー イメージをワークスペースに読み取ります。
im = imread("peppers.png");
MATLAB ツールストリップから色のしきい値を開きます。[アプリ] タブにある [イメージ処理とコンピューター ビジョン] セクションで [色のしきい値] をクリックします。
イメージを色のしきい値アプリに読み込みます。[イメージの読み込み] をクリックしてから、[ワークスペースからのイメージの読み込み] を選択します。[ワークスペースからインポート] ダイアログ ボックスで、ワークスペースに読み取ったイメージを選択してから [OK] をクリックします。
また、関数 colorThresholder
を使用し、イメージの変数名を指定することで、コマンド ラインからアプリを開くこともできます。
colorThresholder(im)
色空間の選択
色のしきい値では、[色空間を選択] タブにイメージが表示され、それと一緒に、RGB、HSV、YCbCr、L*a*b* の色空間でイメージを表現する点群も表示されます。色ベースのセグメンテーションの場合は、色分離に最適な色空間を選択します。マウスを使用して点群表現を回転し、個々の色がどのように分離されるかを確認します。この例では、YCbCr 色空間を選択して開始します。
イメージのセグメント化
色空間を選択すると、新しいタブが開き、イメージの表示と共に、色成分ごとの一連のコントロールと点群表現が表示されます。色のコントロールは色空間に応じて異なります。YCbCr 色空間の場合、3 つの色成分を表す 3 つのヒストグラムが表示されます。[Y] 成分は明度を表し、[Cb] 成分は青-黄のスペクトルを表し、[Cr] 成分は赤-緑のスペクトルを表します。
移動とズームのコントロールにアクセスするには、イメージ上でカーソルを移動させます。
自動しきい値処理
まず、自動しきい値処理を使用してイメージをセグメント化します。背景 (紫色の布) はほぼ一様な色であるため、前景にあるオブジェクト (ピーマン) よりもこちらをセグメント化します。マスクは、[マスクの反転] オプションを使用して後で反転できます。
フリーハンド ROI ツールを使用して領域を定義します。イメージの右上隅にある座標軸ツールバーで投げ縄アイコン をクリックし、背景に ROI を描画します。複数の領域を描画できます。描画した領域を削除して新たに始める場合は、領域の任意の場所を右クリックして [フリーハンドの削除] を選択します。
領域の描画が終了すると、描画した領域内で選択されている色に基づき、自動的にイメージのしきい値処理が行われます。セグメンテーションを反映して [Y]、[Cb] および [Cr] 色のコントロールが変化します。この自動しきい値処理では、特に前景と背景の間の下側の境界で、両者のセグメンテーションがうまく作成されません。この例の場合では、イメージ下部付近の背景色の方が明るいからです。
色のコントロールを使用した自動しきい値処理の調整
自動しきい値処理を微調整するには、色のコントロールを使用します。[Y]、[Cb] および [Cr] の色のコントロールごとに、そのヒストグラム内の上限と下限をドラッグして値の範囲を設定できます。これらの色のコントロールを使用すると、前景のセグメンテーションを大幅に改善することができます。
点群を使用したイメージのカラー値のしきい値設定
色の範囲を選択するもう 1 つの方法は、点群に ROI を描画することです。
アプリのツールストリップで、[しきい値のリセット] をクリックして元のイメージに戻ります。アプリの右下にあるペインで、点群をクリックしてドラッグし、しきい値処理対象の色の表示が分離されるまで回転します。点群にカーソルを合わせ、点群の左上隅にある ROI ボタン をクリックします。色のしきい値により、3-D 点群が 2 次元表現に変換され、多角形 ROI ツールが有効になります。セグメント化する色 (紫色) の周りに ROI を描きます。この方法では、最初の自動しきい値処理による方法よりきれいなセグメンテーションを作成できます。
別の色空間のイメージのセグメンテーション
別の色空間にあるイメージをセグメント化するには、アプリのツールストリップで [新規の色空間] をクリックします。[色空間を選択] タブで HSV 色空間を選択します。
色のしきい値で新しいタブが作成され、イメージと HSV 色空間の色成分コントロールが表示されます。この色空間では、[H] は色相 (hue)、[S] は彩度 (saturation)、[V] は明度 (value) を意味します。HSV 色空間では、[H] 成分には双方向ノブ、[S] 成分および [V] 成分には 2 つのヒストグラム スライダーが使用されます。また、タブにはイメージの色の点群表現も表示されます。
前回の反復と同様、自動しきい値処理と点群を含めた色成分コントロールの対話的利用というまったく同じ手法を使用できます。セグメンテーションの進行状況を確認しながら、色のコントロールを使用することができます。[H] コントロールのペインで、一度に矢印を 1 つクリックしてドラッグし、色相の範囲を変更します。背景と前景がはっきりと分離できるまで、各コントロールで実験します。モルフォロジー演算子など、ツールボックス関数を使用して、マスク イメージの作成後に小さな欠陥をクリーンアップできます。
マスク イメージの作成
この例では前景のオブジェクト (ピーマン) ではなく背景 (紫色の布) をセグメント化したため、[マスクの反転] をクリックして前景と背景を入れ替えます。
アプリのツールストリップで [バイナリの表示] をクリックして、バイナリ マスク イメージを表示します。
結果のエクスポート
マスクをワークスペースに保存します。ツールストリップで、[エクスポート] をクリックして [イメージのエクスポート] を選択します。
[ワークスペースにエクスポート] ダイアログ ボックスで、バイナリ マスク イメージの変数名を指定します。また、元の入力 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