バナナのエッジ処理(輪郭摘出)がうまくできない。
6 views (last 30 days)
Show older comments
現在Sobelを利用したエッジ検出をしているのですが、シュガースポットが3割のバナナの輪郭は表示ができるのですが、シュガースポットが5~7割のバナナの輪郭がうまくできず、バナナの中心部がくりぬかれてまともに輪郭が取れません、何かいい案や原因などあれば教えてほしいです。
2 Comments
Accepted Answer
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))
More Answers (0)
See Also
Categories
Find more on イメージのセグメンテーションと解析 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!