【问题标题】:Cropping an image with a focus area (face) using ImageMagick使用 ImageMagick 裁剪带有焦点区域(面部)的图像
【发布时间】:2011-06-16 08:43:29
【问题描述】:

我正在努力寻找正确的方法来调整焦点区域的大小、裁剪和图像。在我的情况下,焦点区域是图像中检测到的人脸,我需要确保该区域在裁剪后的版本中可见。

我有例如给定的焦点区域。 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. 如果面部区域小于想要的缩略图,则裁剪“扩展”我的面部区域,直到我想要的拇指可以容纳在该区域内。然后裁剪。我想我需要确保这不会超出原始图像的范围。

有更聪明的方法吗?你能试着做一些示例代码吗?

谢谢!

【问题讨论】:

  • 只是好奇——你用的是什么人脸检测算法?谢谢!

标签: algorithm geometry imagemagick crop face-detection


【解决方案1】:

我首先在脚本或程序中进行算术运算,然后将精确坐标提供给 ImageMagick。

算术步骤:

  • 使用精确的像素值比百分比更容易操作,因此将face_heightface_widthface_center_xface_center_y 转换为像素值。
  • 你会想要矩形缩略图,所以选择最长的一边并用它来操作:

    longest_side = max(face_height, face_width)

  • 现在您可以计算作物的左上角:

    crop_x = face_center_x - 最长边 / 2
    crop_y = face_center_y - 最长边 / 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   

【讨论】:

  • 我知道这是一个老问题,但作为扩展,你会怎么处理crop_x_y 的最后两个条件大于宽度/高度?
  • 我最终解决了所有四种尺寸过大的情况,修复了坐标(在前两种情况下)和所有四种情况:减小 longest_side 的大小,然后移动它在另一个维度上向上或向左移动其当前长度和原始长度之间差异的一半(从而使框保持在头部的中心)。
猜你喜欢
  • 2012-05-16
  • 2013-08-06
  • 1970-01-01
  • 2015-06-05
  • 2016-10-23
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多