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

mat*_*ias 3 algorithm geometry crop imagemagick face-detection

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

我有例如给出的焦点区域。face_height、face_width、face_center_x 和 face_center_y。这些值是原始图像尺寸的百分比。

我想做的是得到一个例如。60x60 缩略图。正常的方法是调整大小,使图像的高度或宽度等于 60px,然后从中心裁剪 60x60,如下所示:

mogrify -resize 60x -gravity 'Center' -crop 60x60 image.jpg
Run Code Online (Sandbox Code Playgroud)

可以采取什么方法将我的作物集中在给定区域周围?

我正在考虑一个包含多个路径的解决方案:

  1. 如果脸部区域比想要的缩略图大,调整图像大小,使整个脸部以 60x60 像素可见,然后裁剪
  2. 如果面部区域小于想要的缩略图,则裁剪“扩大”我的面部区域,直到我想要的拇指可以放入该区域。然后裁剪。我想我需要确保这不会超出原始图像的范围。

有没有更聪明的方法?您可以尝试制作一些示例代码吗?

谢谢!

Pēt*_*une 5

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

算术步骤:

  • 这将是比单纯的百分比精确的像素值进行操作,所以转换face_heightface_widthface_center_xface_center_y像素值。
  • 您需要矩形缩略图,因此选择最长的一边并使用它进行操作:

    longest_side = max(face_height, face_width)

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

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

  • 如果四个裁剪角中的任何一个超出您的图片尺寸,请对此进行调整:

    • crop_x并且crop_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   
Run Code Online (Sandbox Code Playgroud)