- この回答は極小値を用いるアイデアであり、エッジ検出等の画像処理はしていません
- 的確な極小値検出の為の「フィルタ関数」と「局所的最小値の検出関数」を使いました
- 汎用性に乏しくマジックナンバーが多いです。パラメータや閾値は適宜調整してみて下さい
オブジェクトの検出
조회 수: 7 (최근 30일)
이전 댓글 표시
画像は密封小線源をイメージングプレートを用いて画像化したものです。
線源が15個並んでおり、長方形の高濃度の部分が線源になります。
この画像からそれぞれの線源部分を検出することが目的です。
個々の線源に濃度差があり、閾値を用いた二値化ができず、また、境界が不明瞭なため、エッジの検出がうまくいきません。
データが少ないため、単純なアルゴリズムでのオブジェクトの検出ができればと考えているのですがどういった方法が考えられるでしょうか。
댓글 수: 0
채택된 답변
Atsushi Ueno
2021년 8월 28일
편집: Atsushi Ueno
2021년 8월 29일
線源を串刺しにする様な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
Atsushi Ueno
2021년 8월 29일
@H.Nishiyama様、ありがとうございます。横方向のズレは原因が分からないでいました。
縦方向にも僅かにズレているのですが、これはフィルタ処理が原因です。
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 イメージのセグメンテーション에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!