1


要するに、支配的な色を持つピクセルの座標を見つけたいのです。

具体的には、次のことを実現したいと考えています。

  1. 優勢な色を見つけます。優勢とは、画像内のピクセルの大部分が持つ色を意味します(ヒストグラムを使用して達成しました)

  2. この色 (私の場合は黒) を取得した後、黒のピクセルだけで囲まれた黒のピクセルを見つけたいと考えています。基本的に、黒の最も集中した領域の中心。

今までは、支配的な色しか得られませんでした。

convert src.png -format %c histogram:info: > x.txt
cat x.txt | awk '{print $1}' | sed 's/://g' > x1.txt
h=$(sort -n x1.txt | tail -1)
cat x.txt | grep "$h"
rm -rf x.txt

結果:

    169211: (  0,  0,  0,255) #000000 black

これで、黒のすべての座標も取得できます

convert src.png txt: | grep black
469,799: (  0,  0,  0,255)  #000000  black
470,799: (  0,  0,  0,255)  #000000  black
471,799: (  0,  0,  0,255)  #000000  black
472,799: (  0,  0,  0,255)  #000000  black
473,799: (  0,  0,  0,255)  #000000  black
474,799: (  0,  0,  0,255)  #000000  black
475,799: (  0,  0,  0,255)  #000000  black
476,799: (  0,  0,  0,255)  #000000  black
477,799: (  0,  0,  0,255)  #000000  black
478,799: (  0,  0,  0,255)  #000000  black
...

しかし、周りに黒いピクセルしかない場所にある黒いピクセルのランダムな座標が必要です...

Linux と Imagemagick バージョン 6.6.5 を使用しています

4

4 に答える 4

4

(いくつかの弱点を解消するために更新されました)

まず、あなたの主な色を見つけます。あなたはすでにこれを行う方法を知っているようですので、このステップは飛ばします。(これについてもコードをチェックまたは検証しませんでした...)

あなたのコードにはいくつかの弱点があります:

  1. をクリーンアップするだけでx.txtx1.txt.

  2. | sed 's/://g'2 番目のコマンドからパーツを削除する必要があります。:変数からコロンを削除しますが、これによりh=21(代わりにh=21:) が発生し、grep "$h"そのような行がすべて検出される可能性があります。

     1: (221, 86, 77) #DD564D srgb(221,86,77)
     1: (221,196,192) #DDC4C0 srgb(221,196,192)
     1: (221,203,197) #DDCBC5 srgb(221,203,197)
    [...] 
    21: (255,255,255) #FFFFFF white
    

    そのままにしておくと、h=21:探している1行が見つかります!(確認する例: あなたの代わりに組み込みのrose:イメージを使用して、src.png私の意味を確認してください。)

次に、各位置の周囲の 8 つのピクセルで各ピクセルを平均化することにより、画像に非常に少量のぼかし-blur 1x65535を適用します(この操作では 3x3 の正方形のカーネルを使用します)。そのステップの後、結果の画像では、元の画像では黒のピクセルのみに囲まれていたピクセルのみが純粋な黒のままになります。

3 番目に、すべての黒以外のピクセルを白にします:画像に - 操作を適用します。( 「Morphology」、特に「Erosion」も参照してください。)これは、黒以外のすべての色を白にすることで画像から他のすべての色を削除し、純粋な黒のピクセルの検索を簡素化します。(注: これは、純粋な黒ピクセルの 3x3 ピクセル領域が少なくとも 1 つ含まれていない src.png ファイルでは機能しません... )-fill white +opaque black -fill white -opaque black

4 番目:画像の境界にあるピクセルを考慮する必要があります (これらには 8 つの隣接ピクセルがありません) -virtual-pixel none

「logo:」という名前の ImageMagick 組み込みの特別な画像を使用して、私のアプローチを示します。

convert logo: logo.png

簡単にわかるように、この画像は白が優勢な色です。(したがって、この例のコードを切り替えて、すべての白いピクセルを黒にします...)

これまでのコマンドライン:

convert                                                \
   logo:                                               \
  -virtual-pixel none                                  \
   $(for i in {1..2}; do echo " -blur 1x65535 "; done) \
  -fill black                                          \
  -opaque white                                        \
   2_blur-logo-virtpixnone.png

2 つの画像を並べて示します。

  • 左側の logo.png
  • 右側の 2_blur-log-virtpixnone.png

 

5回目: 皮、すすぎ、繰り返し。

次に、このアルゴリズムをさらに数回 (100、500、1000、1300 など) 適用して、結果に注釈を適用して、どの画像がどれであるかを確認しましょう。

for j in 100 500 1000 1300; do
   convert                                                       \
      logo:                                                      \
     -virtual-pixel none                                         \
      $(for i in $(seq 1 ${j}); do echo " -blur 1x65535 "; done) \
     -fill black                                                 \
     -opaque white                                               \
     -gravity NorthEast -annotate +10+10 "$j iterations"         \
      ${j}_blur-logo-virtpixnone.png
done

はっきりとわかるように、私のアルゴリズムは、オリジナルを見たときに白い色の領域の「中心」であると直感的に推測したスポットに向かって黒い領域を収束させますlogo.png

 

 

黒いスポットが残っていない出力画像に到達すると、繰り返しが多すぎます。反復を 1 つ戻します。:-)

条件に一致する候補ピクセルの数は非常に限られているはずです。

于 2012-08-14T09:00:37.850 に答える
1

私は、ユークリッド距離モルフォロジーを使用したこのアプローチが好きです。これにより、ウィザードが悪魔のように (!) 見え、1 秒未満で実行されます!

convert logo: -virtual-pixel none             \
              -morphology Distance Euclidean  \
              -auto-level -channel GB         \
              -threshold 85% 85.png

ここに画像の説明を入力

95% と 99% でしきい値を設定すると、次のようになります。

ここに画像の説明を入力

ここに画像の説明を入力

そして、テキスト座標が必要な場合:

convert logo: -virtual-pixel none -morphology Distance Euclidean -auto-level -threshold 99% txt:- | grep white
151,328: (255,255,255,1)  #FFFFFF  white
152,328: (255,255,255,1)  #FFFFFF  white
于 2015-04-15T15:07:46.097 に答える
0

これは単なる推測であり、完全な答えではありませんが、最初にぼかしフィルターを使用して画像を前処理することができます。次に、ぼやけた画像で黒いピクセルは、元の画像に黒い近傍があったに違いありません。

ただし、これは任意の色では機能しません。

于 2012-08-13T21:23:13.327 に答える