2011-01-27 11 views
2

フォーカスエリアを使用して、サイズ変更とトリミングと画像を作成するための適切な方法を見つけるのには苦労しています。私の場合、フォーカスエリアは画像内で検出された顔であり、このエリアがトリミングされたバージョンで可視であることを確認する必要があります。ImageMagickを使用してフォーカスエリア(フェイス)で画像を切り取る

私は例えば以下のようなフォーカスエリアを持っています。 face_height、face_width、face_center_x、face_center_y。これらの値は元の画像の寸法のパーセンテージです。

私がしたいことは、例えば、 60x60サムネイル。通常のアプローチは、このように、その画像のいずれかの高さや幅が等しい60PXでサイズを変更して、中心から60x60をトリミングするために、次のようになります。どのようなアプローチではなく、与えられた領域の周りに焦点私の作物を撮影することができます

mogrify -resize 60x -gravity 'Center' -crop 60x60 image.jpg 

?私はいくつかのパスが含ま解決策を考えています

  1. 顔領域が希望のサムネイルよりも大きい場合には、60x60ピクセルで、顔全体が見えるようにするだけで十分な画像のサイズを変更し、作物
  2. 顔領域が希望のサムネイルよりも小さい場合は、希望の親指が領域の内側に収まるまで、顔領域をトリミングします。その後、作物。私は、これが元の画像の範囲を超えないようにする必要があると思います。

スマートな方法がありますか?いくつかのコード例を試してみることができますか?

ありがとうございます!

+0

ちょっと不思議そうな顔検出アルゴリズムを使用しましたか?ありがとう! –

答えて

3

私はまずスクリプトやプログラムで算術演算を行い、次に正確な座標をImageMagickに送ります。

演算手順:

  • パーセントより正確な画素値で動作することが容易であるので、画素値にface_heightface_widthface_center_xface_center_yを変換します。あなたは、長方形のサムネイルをしたいので、最長の辺を選択し、それに動作します
  • longest_side = max(face_height, face_width)

  • を今、あなたはあなたの作物のための左上の点を計算することができます。

    crop_x = face_center_x - longest_side/2
    crop_y = face_center_y - longest_side/2

  • 4つの切り抜きコーナーのいずれかがπの外にある場合cture寸法は、そのための調整:

    • crop_xcrop_yの両方でなければならない> = 0
    • crop_x + longest_side
    • crop_y + longest_sideが像高よりも小さくなければならない画像の幅よりも小さくなければならない

これらを計算すると、ImageMagickの呼び出しはかなり簡単になります:

mogrify -crop {longest_side}x{longest_side}+{crop_x}+{crop_y} -resize 60x60 image.jpg 
関連する問題