- この回答は極小値を用いるアイデアであり、エッジ検出等の画像処理はしていません
- 的確な極小値検出の為の「フィルタ関数」と「局所的最小値の検出関数」を使いました
- 汎用性に乏しくマジックナンバーが多いです。パラメータや閾値は適宜調整してみて下さい
オブジェクトの検出
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
画像は密封小線源をイメージングプレートを用いて画像化したものです。
線源が15個並んでおり、長方形の高濃度の部分が線源になります。
この画像からそれぞれの線源部分を検出することが目的です。
個々の線源に濃度差があり、閾値を用いた二値化ができず、また、境界が不明瞭なため、エッジの検出がうまくいきません。
データが少ないため、単純なアルゴリズムでのオブジェクトの検出ができればと考えているのですがどういった方法が考えられるでしょうか。
0 commentaires
Réponse acceptée
Atsushi Ueno
le 28 Août 2021
Modifié(e) : Atsushi Ueno
le 29 Août 2021
線源を串刺しにする様な1次元画素列の極小値(局所的最小値)(グラフで表示)を得る事により、線源の縦方向の位置を検出しました。
I = rgb2gray(imread('radio.jpeg'));
C = I(:, round(size(I,2)/2)); % 中央に線源がある前提で、画像中央の1列を抽出
C = filter(ones(1,7)./7,1,C); % 的確な極小値検出の為のフィルタ処理
TF = islocalmin(C) & (C < 200); % 適当な輝度範囲の極小値検出
y = 1:size(I,1);
yy = y(TF); % 極小値検出した線源15本分の縦方向座標
BW = I < 240; % 2値化(imbinarize)
[xx, ~] = ind2sub(size(BW(TF,:)'), find([zeros(size(yy,2),1),diff(BW(TF,:),1,2)]')); % 線源の両端座標(横方向)を取得
imshow(I); xlim([0 255]); hold on; % 以下は各種描画
plot(C,y,C(TF),y(TF),'r*');
for i = 1:size(yy,2)
rectangle('Position',[xx(i*2-1) yy(i)-7 xx(i*2)-xx(i*2-1) 14],'Curvature',0.5);
end
3 commentaires
Atsushi Ueno
le 29 Août 2021
@H.Nishiyama様、ありがとうございます。横方向のズレは原因が分からないでいました。
縦方向にも僅かにズレているのですが、これはフィルタ処理が原因です。
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur イメージのセグメンテーション dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!