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

今直面している問題は、例えば列方向にfindpeaksをかけると、複数の列にわたって同じ輝点が列ごとに検出されることと、それが同じ輝点であることが判別しにくい点です。
Ad-onとして2Dピーク検出のコードがあることは知っていますが、できればfindpeaksで対応したいです。

2 commentaires

Akira Agata
Akira Agata le 14 Juin 2021
findpeaks 関数を使いたい理由が何かあるということでしょうか?
輝点を検出したいということであれば、ある輝度値を閾値として画像を2値化するのがいちばん単純な方法になるかと思います。
ヨナ エマヤ
ヨナ エマヤ le 15 Juin 2021
ご回答ありがとうございます。
質問の本文に書くべきでしたが、2値化で対応するプログラムは既に試していて、現在は違うアプローチを模索しています。
他のところでIslocalmaxを行方向と列方向にそれぞれ走らせて論理和をとればうまくいくのでは、という方法を教えていただいたのですが、結果は良さそうです。同じように論理和で対応する方法をfindpeaksでも試してみたら、意外とfindpeaksの方が速かったです。
しかし、これだけで輝点が抜けたり、2重検出されたりするところはまだ残っているので、現在はどのように改善できるかを考えています。

Connectez-vous pour commenter.

Réponses (1)

Akira Agata
Akira Agata le 16 Juin 2021
Modifié(e) : Akira Agata le 16 Juin 2021

1 vote

試しに簡単なプログラムを作成してみました。行方向と列方向でピークを検出してプロットすると、検出されたピーク点は輝点の上に十字型に表示されます(右図)。ただ、輝点内の輝度分布によっては十字の縦と横の線がきれいなラインにならない場合や、中央でクロスしない場合などがあり、ここから輝点の中心を検出するのは難しい印象です。
もし @ヨナ エマヤ 様が想定されている対象画像を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 commentaire

ヨナ エマヤ
ヨナ エマヤ le 17 Juin 2021
サンプルプログラムを書いていただきありがとうございます。
こちらのサンプルデータですが、使っている画像については研究の都合上、提供できません。せっかくご対応いただいたのに、申し訳ございません。
@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')

Connectez-vous pour commenter.

Catégories

En savoir plus sur Image Processing and Computer Vision dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!