Matlab での画像の領域抽出
- 評価
- クリップ 0
- VIEW 4,640
前提・実現したいこと
Matlabを用いて画像の特定の領域のトリミング
発生している問題・エラーメッセージ
現在、研究でMatlabを用いて以下の花の画像の中心の黄色の花以外の部分を黒く塗りつぶした画像にしたいのですが、中心の花だけをトリミングすることができません。
PhotoShopは使わないという方針です。
clear all; close all;
%%%%%%%%%%% 画像の読み込み %%%%%%%%%%%
Org = imread('img/color.jpg'); % 原画像
Org = rgb2gray(Org)
%% 花の検出
[~, threshold] = edge(Org, 'sobel');
fudgeFactor = .5;
BWs = edge(Org,'sobel', threshold * fudgeFactor);
figure, imshow(BWs), title('binary gradient mask');
%% イメージの拡張
se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);
BWsdil = imdilate(BWs, [se90 se0]);
figure, imshow(BWsdil), title('dilated gradient mask');
%% 内部のギャップを塗りつぶす
BWdfill = imfill(BWsdil, 'holes');
figure, imshow(BWdfill);
title('binary image with filled holes');
%% 境界に接触するオブジェクトの削除
BWnobord = imclearborder(BWdfill, 4);
figure, imshow(BWnobord), title('cleared border image');
BWnobord = imclearborder(BWdfill, 8);
figure, imshow(BWnobord), title('cleared border image');
このコードを試して見ると膨張の際に、中心の花も境界に接触しているオブジェクトとして認識され消えてしまいます。
自分の考え
色による閾値の方法や空間周波数による方法なども考えましたができないと判断しました。私的にはMatlabで中心の花の画像だけを抽出するのは不可能じゃないかな~と思っています。
研究では、この花の画像以外の画像も用いる予定なので、できれば万物画像に用いることができる方法があれば教えてください。
補足情報(言語/FW/ツール等のバージョンなど)
Matlab2015
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
中心の花を一番特徴付けるのは色味(色相)だと思います。例えば彩度が一定以上のピクセルの色相を強調してみると以下のような画像が得られます。
matlabは持っていないので、このイメージはprocessing(java)で作成したものです。python言語とは違いますが何をしているかはつかんでいただけるものと思います。
...
int WW = 画像の幅;
int HH = 画像の高さ;
// ピクセルのフォーマットは
// bit 31-24(不透明度)
// bit 23-16(red)
// bit 15- 8(green)
// bit 7- 0(blue)
float TH1 = 0.2; // 彩度の閾値
for (int y = 0; y < HH; y++) {
for (int x = 0; x < WW; x++) {
int pixel = pix0[index];
float r = ((pixel >> 16) & 255) / 255.0;
float g = ((pixel >> 8) & 255) / 255.0;
float b = (pixel & 255) / 255.0;
float min = Math.min(r, Math.min(g, b));
float max = Math.max(r, Math.max(g, b));
float s = max - min;
if (s > TH1) {
r = Math.min(255, 255*(r - min) / s);
g = Math.min(255, 255*(g - min) / s);
b = Math.min(255, 255*(b - min) / s);
pixel = 0xFF000000 | ((int)r << 16) | ((int)g << 8) | ((int) b);
} else {
pixel = 0xFF000000;
}
pix1[index] = pixel;
index++;
}
}
...
この画像ではイメージがつかみやすいように色相を色そのもので表現していますが、色相は普通スカラー値としてRed=0度、Green=120度、Blue=240度のように捉えることができます。つまり色相の違いを数値の差として捉えることができるので、これを指標として明度の代わりに用いると「個々の花」を分離する手段に使えるのではないかと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
まずは「Image segmentation」で検索。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/05/01 14:00
その手法で閾値をうまく設定してやってみようと思います。