質問: オブジェクトの検出 画像は密封小線源をイメージングプレートを用いて画像化したものです。 線源が15個並んでおり、長方形の高濃度の部分が線源になります。 この画像からそれぞれの線源部分を検出することが目的です。 個々の線源に濃度差があり、閾値を用いた二値化ができず、また、境界が不明瞭なため、エッジの検出がうまくいきません。 データが少ないため、単純なアルゴリズムでのオブジェクトの検出ができればと考えているのですがどういった方法が考えられるでしょうか。
回答: 線源を串刺しにする様な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