バナナのエッジ処理(輪郭摘出)がうまくできない。

3 views (last 30 days)
METACORN
METACORN on 16 Feb 2023
Commented: METACORN on 20 Feb 2023
現在Sobelを利用したエッジ検出をしているのですが、シュガースポットが3割のバナナの輪郭は表示ができるのですが、シュガースポットが5~7割のバナナの輪郭がうまくできず、バナナの中心部がくりぬかれてまともに輪郭が取れません、何かいい案や原因などあれば教えてほしいです。
  2 Comments
Tohru Kikawada
Tohru Kikawada on 16 Feb 2023
元の画像添付することは可能でしょうか。よりよいアイディアが集まるかもしれません。
METACORN
METACORN on 19 Feb 2023
元の画像はこちらです

Sign in to comment.

Accepted Answer

Tohru Kikawada
Tohru Kikawada on 20 Feb 2023
色のしきい値アプリを活用することで様々な色空間でしきい値を決めることができます。
下記の例では2つのマスクを作って共通部分を抽出することでバナナのみを取り出したりすることが可能です。
RGB = imread("https://www.mathworks.com/matlabcentral/answers/uploaded_files/1300400/image.jpeg");
% RGBからHSV色空間に変換
I = rgb2hsv(RGB);
はじめにバナナの影の部分だけを抽出するマスクを生成
% 色相
channel1Min = 0.040;
channel1Max = 0.098;
% 彩度
channel2Min = 0.086;
channel2Max = 0.443;
% 明度
channel3Min = 0.671;
channel3Max = 0.871;
% 上記範囲のを満たすマスクを作成
sliderBW = ( (I(:,:,1) >= channel1Min) | (I(:,:,1) <= channel1Max) ) & ...
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);
BW1 = sliderBW;
次に、バナナ+影の部分を抽出するマスクを生成
% 色相
channel1Min = 0.925;
channel1Max = 0.173;
% 彩度
channel2Min = 0.218;
channel2Max = 1.000;
% 明度
channel3Min = 0.000;
channel3Max = 1.000;
% 上記範囲のを満たすマスクを作成
sliderBW = ( (I(:,:,1) >= channel1Min) | (I(:,:,1) <= channel1Max) ) & ...
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);
BW2 = sliderBW;
影とバナナ+影のマスクの共通部分を抽出
% 2つのマスクのANDをとる
BW = ~BW1 & BW2;
モルフォロジー処理による後処理
% 1番大きい面積の部分だけを残す
BW = bwareafilt(BW,1);
% クローズ処理で輪郭の凸凹をならす
BW = imclose(BW,strel("disk",10));
% 黒いところを穴埋め
BW = imfill(BW,"holes");
処理後のマスクを可視化
figure
imshow(im2single(RGB) .* single(BW))
  1 Comment
METACORN
METACORN on 20 Feb 2023
迅速にご対応いただきありがとうございます。
きちんとほかの画像でも輪郭の抽出が行えました。

Sign in to comment.

More Answers (0)

Products


Release

R2017b

Community Treasure Hunt

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

Start Hunting!