>ピクセルごとのRGBの値を読み込んでいき,その3つの値の組み合わせで色を認識させて数字を置き換え
画素値を1つの値にまとめ(グレースケール化と同じ)、それを任意のラベル値に置き換えれば良いのですが、各種課題がある事に気付きました。
- 同色の連結要素が複数存在するか?それらを区別する必要があるか?
- 処理対象データにノイズや補間値が含まれているか?
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ファイル経由で扱った事が原因です。論理的に生成したデータを扱えばこの様な問題はありません。この様な曖昧な値は何らかの方法で閾値を設けてグループ分け(離散化)する必要があります。やり方は色々あると思いますが、私は下記を思い付きます。
- 色のしきい値アプリ
- imquantize関数 (要Image Processing Toolbox)
- discretize関数, findgroups関数