使用ImageMagick裁剪具有焦点区域(面部)的图像

时间:2011-01-27 07:03:27

标签: algorithm geometry imagemagick crop face-detection

我正在努力寻找合适的方法来调整大小和裁剪和图像,并有一个重点区域。在我的情况下,焦点区域是在图像中检测到的面部,我需要确保在裁剪版本中可以看到此区域。

我有专注区域,例如。 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. 如果脸部区域小于想要的缩略图,则裁剪“展开”我的脸部区域,直到我想要的拇指可以放入该区域内。然后裁剪。我想我需要确保这不会超过原始图像的范围。
  3. 有更聪明的方法吗?你能试试一些示例代码吗?

    谢谢!

1 个答案:

答案 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

  • 如果四个裁剪角落中的任何一个落在图片尺寸之外,请进行调整:

    • 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