web-dev-qa-db-ja.com

この画像のスポットの数を数える方法は?

次の画像で移植した髪の数を数えようとしています。したがって、実際には、画像の中心にあるスポットの数を数える必要があります。 (元の画像が流血で全く嫌なので、新しい髪が移植されたハゲの頭皮の反転画像をアップロードしました!元の非反転画像を表示するには、クリックしてください ここ 。反転画像の拡大版を表示するには、それをクリックするだけです)。これらのスポットを検出する既知の画像処理アルゴリズムはありますか? Circle Hough Transform アルゴリズムを使用して画像内の円を見つけることができることがわかりました。次の小さなスポットを見つけるために適用できる最適なアルゴリズムであるかどうかはわかりません画像。

enter image description here

P.S。回答の1つによると、私は ImageJ を使用してスポットを抽出しようとしましたが、結果は十分満足できるものではありませんでした:

  1. 私は 元の 非反転画像(Warning!を開いた!見るのは血に染まって嫌だ!).
  2. チャンネルを分割しました(画像>色>チャンネルを分割)。そして、続行する青いチャネルを選択しました。
  3. 次の値を適用したClosingフィルター(プラグイン>高速形態学>形態学的フィルター):操作:終了、要素:正方形、半径:2px
  4. 適用済みWhite Top Hatフィルター(プラグイン>高速形態学>形態学的フィルター)の値:操作:ホワイトトップハット、要素:正方形、半径:17ピクセル enter image description here

しかし、移植されたスポットをできるだけ正確にカウントするために、この手順の後に正確に何をすべきかわかりません。使用しようとしましたが(Process> Find Maxima)、結果は私には十分正確ではないようです(これらの設定では:ノイズ許容値:10、出力:シングルポイント、エッジマキシマを除く、明るい背景):

enter image description here

ご覧のとおり、いくつかの白い斑点は無視され、実際には植毛斑ではないいくつかの白い領域がマークされています。

スポットを正確に見つけるために、どのようなフィルターセットをアドバイスしますか? ImageJを使用することは、必要なフィルターのほとんどを提供するため、良いオプションのようです。ただし、他のツール、ライブラリ(OpenCVなど)などを使用して何をすべきかアドバイスしてください。どんな助けも大歓迎です!

29
Meysam

私はあなたが少し間違った方法で問題を解決しようとしていると思います。それは根拠がないように聞こえるかもしれないので、最初に結果を示したほうがいいです。

下の左側にある作物の画像と、右側にある移植片を見つけました。緑色は、複数の移植がある領域を強調するために使用されます。

enter image description here

全体的なアプローチは非常に基本的ですが(後で説明します)、それでもほぼ正確な結果が得られます。最初の試みだったので、拡張の余地がたくさんあることに注意してください。

とにかく、アプローチが間違っているという最初の声明に戻りましょう。いくつかの主要な問題があります:

  1. 画像の品質がひどい
  2. あなたは斑点を見つけたいと言いますが、実際には植毛を探していますobjects
  3. 平均的な頭が平らになるにはほど遠いという事実を完全に無視します
  4. フィルターは最初の画像にいくつかの重要な詳細を追加すると思います
  5. あなたはアルゴリズムがあなたのために魔法をかけると期待しています

これらすべての項目を1つずつ確認してみましょう。

1。画質

これは非常に明白なステートメントかもしれませんが、実際の処理の前に、可能な限り最高の初期データがあることを確認する必要があります。何週間もかけて、大きな成果なしに自分の写真を処理する方法を見つけようとするかもしれません。ここにいくつかの問題のある領域があります:

enter image description here

脳に最も高度なオブジェクト認識アルゴリズムがあるにもかかわらず、これらの作物を「読み取る」のは難しいと思います。

また、あなたの時間は高価であり、最高の精度と安定性が依然として必要です。したがって、妥当な価格で、適切なコントラスト、シャープなエッジ、より良い色、色分解を実現しようとします。

2。識別されるオブジェクトのより良い理解

一般的に言えば、識別される3Dオブジェクトがあります。したがって、精度を向上させるために影を分析できます。ところで、それはほとんど火星表面分析のようなものです:)

enter image description here

3。頭の形は無視してはいけません

頭の形のため、歪みがあります。繰り返しますが、適切な精度を得るには、実際の分析の前にこれらの歪みを修正する必要があります。基本的に、分析した領域を平坦化する必要があります。

enter image description here

Dモデルソース

4。フィルターは役に立たないかもしれません

フィルターは情報を追加しませんが、いくつかの重要な詳細を簡単に削除できます。あなたはハフ変換について述べたので、ここに興味深い質問があります: 形状の線を見つける

この質問を例として使用します。基本的に、与えられた画像からジオメトリを抽出する必要があります。形の線は少し複雑に見えるので、skeletonization

enter image description here

悲しいことに、処理するジオメトリが複雑になり、実際に元の画像に何があったかを理解する機会がほとんどありません。

5。ここに魔法はありません

次の点に注意してください。

enter image description here

精度と安定性を高めるには、より良いデータを取得する必要があります。モデル自体も非常に重要です。

結果の説明

先ほど述べたように、私のアプローチは非常に単純です。画像がポスタライズ化された後、非常に基本的なアルゴリズムを使用して特定の色の領域を特定しました。

enter image description here

ポスタリゼーションはより巧妙な方法で行うことができ、領域の検出を改善することができます。このPoCでは、複数のインプラントがある領域を強調表示する簡単なルールがあります。エリアを特定することで、もう少し高度な分析を実行できます。

とにかく、より良い画像品質はあなたが簡単な方法を使用することを可能にし、適切な結果を得るでしょう。

最後に

クリニックはどのようにしてクライアントとして Yond を獲得しましたか? :)

enter image description here

更新(ツールとテクニック)

  • ポスタリゼーション-GIMP(デフォルト設定、最小色)
  • 移植の識別と視覚化-Javaプログラム、ライブラリやその他の依存関係なし
  • 領域を特定すると、平均サイズを簡単に見つけることができ、他の領域と比較して、かなり大きな領域を複数の移植としてマークすることができます。

基本的に、すべてが「手作業」で行われます。水平および垂直スキャン、交差はエリアを提供します。垂直線は並べ替えられ、実際の形状を復元するために使用されます。ソリューションは自社開発であり、コードは少し見苦しいので、共有したくありません。

アイデアはかなり明白でよく説明されています(少なくとも私はそう思います)。次に、別のスキャンステップを使用した追加の例を示します。

enter image description here

さらに別の更新

非常に基本的なアイデアを検証するために開発された小さなコードが少し進化したため、4Kビデオのセグメンテーションをリアルタイムで処理できるようになりました。考え方は同じです。水平および垂直スキャン、交差する線によって定義される領域などです。それでも外部ライブラリはなく、非常に楽しく、もう少し最適化されたコードです。

enter image description here

enter image description here

その他の例はYouTubeにあります: RobotsCanSee

または電報で進行状況を追跡します: RobotsCanSee

31
Renat Gilmanov

ImageJを使用してこのソリューションをテストしたところ、良い予備結果が得られました。

  1. 元の画像で、各チャネル
  2. ヘアを取り除くために小さい(半径1または2)クローズ(白いものの真ん中にある黒い部分)
  3. 各黒い髪の周りの白い部分を検出するための、半径5の白いシルクハット。
  4. 少し画像をきれいにするための小さな開閉(中央値フィルターを使用することもできます)
  5. 残っている白いブロブの数を数えるための究極の侵食。また、LoG(ラプラシアンオブガウス)または距離マップを使用することもできます。

[編集]関数maximaを使用しても、すべての白い斑点を検出するわけではありません。閉じた後、一部のゾーンが平坦になり、最大値がポイントではなくゾーンになるためです。この時点で、私は究極の開口部または究極の侵食があなたに中心または各白い斑点を与えると思います。しかし、ImageJでそれを行う関数/プラグインがあるかどうかはわかりません。 MambaまたはSMILをご覧ください。

H-マキシマ(白いシルクハットの後)も結果をもう少しきれいにし、白い斑点間のコントラストを改善します。

5
FiReTiTi

Renatが述べたように、アルゴリズムがあなたのために魔法をかけることを期待すべきではありませんが、私はスポットの数の合理的な見積もりを出すことを望んでいます。ここで、いくつかのヒントとリソースを提供します。それらを確認し、詳細が必要な場合はコールバックしてください。

まず、私は形態学的操作に少し期待していますが、完璧な前処理ステップによって、それらによって得られる精度が劇的に向上する可能性があると思います。前処理の工程に指をかけてほしい。したがって、私はこの画像で作業します:

Enter image description here

それがアイデアです:

スポットの場所の周りにマスを収集して集中させます。マスを集中させてどういう意味ですか?反対側から本を開いてみましょう:ご覧のとおり、提供された画像にはいくつかのsalient spotsがいくつかのn oisy gray-level dotで囲まれています。

ドットとは、スポットの一部ではないピクセルを意味しますが、それらのグレー値はゼロ(純粋な黒)よりも大きく、スポットの周囲で使用できます。これらのノイズの多いドットをクリアすると、形態演算などの他の処理ツールを使用して、スポットの正確な推定値が確実に得られることは明らかです。

では、画像をよりシャープにする方法は?ドットを最も近いスポットに移動できるとしたらどうでしょうか。これは私が意味することですスポット上に質量を集中します。そうすることで、目立つスポットだけが画像に存在するようになるので、著名なスポットを数えるための重要なステップ。

集中する方法は?さて、先ほど説明したアイデアは this の論文にあり、そのコードは幸運にも利用できます。セクション2.2を参照してください。主なアイデアは、ランダムウォーカーを使用してイメージを永遠に歩くことです。処方は、歩行者が著名なスポットをはるかに何度も訪問し、著名なスポットを特定することができるように述べられています。アルゴリズムはマルコフ連鎖をモデル化しており、エルゴディックマルコフ連鎖の平衡ヒット時間は、最も顕著なスポットを特定するための鍵を握っています。

上記で説明したのはヒントにすぎません。アイデアの詳細なバージョンを取得するには、その短い論文を読む必要があります。さらに情報やリソースが必要な場合はお知らせください。

それはこのような興味深い問題について考えることの喜びです。それが役に立てば幸い。

3
Saeed

次のことができます。

  1. Cv :: thresholdを使用して画像にしきい値を設定する
  2. Cv :: findcontourを使用して接続されたコンポーネントを見つける
  3. 小さな円形の領域のみを懸念しているように見えるため、特定のサイズより大きいサイズの接続されたコンポーネントを拒否します。
  4. 有効な接続コンポーネントをすべて数えます。
  5. うまくいけば、実際のスポット数の降下近似が得られます。
  6. 統計的に正確にするために、しきい値の範囲に対して1〜4を繰り返し、平均を取ることができます。
2
Ajay

これは、シャープでない半径22、量5、しきい値2を画像に適用した後に得られるものです。

これは、ドットと周囲の領域の間のコントラストを高めます。私は、ドットは直径が18ピクセルから25ピクセルの間のどこかにあるという仮定を使用しました。

これで、白の極大値を「ドット」として受け取り、それを黒丸で埋めることができます。半径10〜12)の場合、ドットが消去されます。これにより、2つ以上のクラスターで互いに結合されたドットを「選択」できるようになります。次に、極大値をもう一度探します。すすぎ、繰り返します。

実際の「ドット」領域は、周囲の領域とはまったく対照的であるため、目視するのと同じように、それらを選択できるはずです。

Unsharpen radius 22, amount 5, threshold 2.

2