カラーの画像をグレー​スケールにすることな​くラベリングしたい

11 views (last 30 days)
Kazuki Hoashi
Kazuki Hoashi on 13 Jun 2023
Answered: Akira Agata on 14 Jun 2023
下の画像のようなカラー画像で関数のみで色を認識させてそれぞれラベリングをしたいと思っています.
自分で考えた方法としてはピクセルごとのRGBの値を読み込んでいき,その3つの値の組み合わせで色を認識させて数字を置き換えていくようなことを考えたのですが可能でしょうか.
  1 Comment
Atsushi Ueno
Atsushi Ueno on 13 Jun 2023
Edited: Atsushi Ueno on 13 Jun 2023
>ピクセルごとのRGBの値を読み込んでいき,その3つの値の組み合わせで色を認識させて数字を置き換え
画素値を1つの値にまとめ(グレースケール化と同じ)、それを任意のラベル値に置き換えれば良いのですが、各種課題がある事に気付きました。
  1. 同色の連結要素が複数存在するか?それらを区別する必要があるか?
  2. 処理対象データにノイズや補間値が含まれているか?
1.同色の連結要素が複数存在するか?それらを区別する必要があるか?
この必要がある場合、色の区別だけではなく連結要素の認識も必要になります。
  • bwconncomp関数 (要Image Processing Toolbox)
  • regionprops関数 (要Image Processing Toolbox)
  • その他、同色の画素の連結要素を認識するロジック
2.処理対象データにノイズや補間値が含まれているか?
I = uint32(imread("https://www.mathworks.com/matlabcentral/answers/uploaded_files/1409354/image.png"));
N = I(:,:,3)*0x10000u32 + I(:,:,2)*0x100u32 + I(:,:,1); % 8[bit]*3 ⇒ 24[bit] にまとめる
[x,y] = meshgrid(1:size(N,2),1:size(N,1));
h = mesh(x,y,N); set(gca,'Zscale','log'); % 色の境界が補間されクッキリしていない
これは質問の画像データをPNGファイル経由で扱った事が原因です。論理的に生成したデータを扱えばこの様な問題はありません。この様な曖昧な値は何らかの方法で閾値を設けてグループ分け(離散化)する必要があります。やり方は色々あると思いますが、私は下記を思い付きます。

Sign in to comment.

Answers (1)

Akira Agata
Akira Agata on 14 Jun 2023
Image Processing Toolbox の imsegkmeans 関数を使う方法もあります。
% 元画像を読み込み
I = imread("https://www.mathworks.com/matlabcentral/answers/uploaded_files/1409354/image.png");
% 背景も含めて、RGB値の近いピクセルどうしを 6 種類にグループ化してラベル配列を作成
L = imsegkmeans(I, 6);
% 結果を確認
figure
imshow(L, [])

Products


Release

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!