MATLAB Answers

findpeaks関​数を使って暗い画像の​中に存在する広がりの​ある輝点を検出したい​のですが、方法はあり​ますか?

조회 수: 5(최근 30일)
ヨナ エマヤ
ヨナ エマヤ 2021년 6월 14일
댓글: ヨナ エマヤ 2021년 6월 17일
今直面している問題は、例えば列方向にfindpeaksをかけると、複数の列にわたって同じ輝点が列ごとに検出されることと、それが同じ輝点であることが判別しにくい点です。
Ad-onとして2Dピーク検出のコードがあることは知っていますが、できればfindpeaksで対応したいです。
  댓글 수: 2
ヨナ エマヤ
ヨナ エマヤ 2021년 6월 15일
ご回答ありがとうございます。
質問の本文に書くべきでしたが、2値化で対応するプログラムは既に試していて、現在は違うアプローチを模索しています。
他のところでIslocalmaxを行方向と列方向にそれぞれ走らせて論理和をとればうまくいくのでは、という方法を教えていただいたのですが、結果は良さそうです。同じように論理和で対応する方法をfindpeaksでも試してみたら、意外とfindpeaksの方が速かったです。
しかし、これだけで輝点が抜けたり、2重検出されたりするところはまだ残っているので、現在はどのように改善できるかを考えています。

댓글을 달려면 로그인하십시오.

답변(1개)

Akira Agata
Akira Agata 2021년 6월 16일
편집: Akira Agata 2021년 6월 16일
試しに簡単なプログラムを作成してみました。行方向と列方向でピークを検出してプロットすると、検出されたピーク点は輝点の上に十字型に表示されます(右図)。ただ、輝点内の輝度分布によっては十字の縦と横の線がきれいなラインにならない場合や、中央でクロスしない場合などがあり、ここから輝点の中心を検出するのは難しい印象です。
もし @ヨナ エマヤ 様が想定されている対象画像を1,2枚共有頂けると、別の方法もご提案可能かと思いますがいかがでしょうか?
% 輝点のある画像を作成
I = imread('coins.png');
I = imgaussfilt(I,10);
% findpeaksで行,列それぞれの方向のピークを検出
J = false(size(I));
for kk = 1:size(I,2)
[~, pt] = findpeaks(double(I(:,kk)),...
'MinPeakProminence',50);
J(pt,kk) = true;
end
for kk = 1:size(I,1)
[~, pt] = findpeaks(double(I(kk,:)),...
'MinPeakProminence',50);
J(kk,pt) = true;
end
% 元画像と検出した行,列各方向のピーク位置を表示
imshowpair(I,J,'montage')
  댓글 수: 1
ヨナ エマヤ
ヨナ エマヤ 2021년 6월 17일
サンプルプログラムを書いていただきありがとうございます。
こちらのサンプルデータですが、使っている画像については研究の都合上、提供できません。せっかくご対応いただいたのに、申し訳ございません。
@Akira Agata様のコードで作成した輝点はこちらで使っている画像に類似しているので、試しに使わせていただきました。以下のようなプログラムを掛けてみたところ、いい結果が求まったかと思います。
I = imread('coins.png');
I = imgaussfilt(I,10);
TF = islocalmax(I,1) & islocalmax(I,2);
J = zeros(size(I));
J(TF) = 1;
imshowpair(I,J,'montage')

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

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

Start Hunting!