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

4
我正在努力寻找正确的方法来调整和裁剪图像,以便聚焦于特定区域。在我的情况下,特定区域是在图像中检测到的脸部,我需要确保这个区域在裁剪后仍然可见。
我已经有了聚焦区域的参数,例如脸部高度、宽度、中心位置x和y,这些值是原始图像尺寸的百分比。
我的目标是得到一个60x60的缩略图。通常的做法是将图像的高度或宽度缩小到60像素,并从中心裁剪出60x60像素的图像,就像这样:
mogrify -resize 60x -gravity 'Center' -crop 60x60 image.jpg

如何将我的裁剪焦点放在特定区域?

我考虑的解决方案有几个:

  1. 如果脸部区域大于所需的缩略图,则将图像调整大小,使整个脸部在60x60像素中可见,然后进行裁剪。
  2. 如果脸部区域小于所需的缩略图,则“扩展”我的面部区域,直到想要的缩略图适合该区域。然后进行裁剪。我想我需要确保这不超出原始图像的边界。

是否有更聪明的方法?您能否尝试编写一些示例代码?

谢谢!


3
好的,我了解了。回答您的问题:只是好奇--你使用了哪个人脸检测算法?谢谢! - Victor Van Hee
1个回答

5
我会先在脚本或程序中进行算术计算,然后将精确坐标提供给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   

我知道这是一个老问题,但作为扩展,您会怎么处理crop_x_y的最后两个条件大于宽度/高度? - Brendon Muir
我最终针对所有四种超尺寸情况进行了处理,对于前两种情况,我修复了坐标;而对于所有四种情况,我都减小了“longest_side”的大小,然后通过将其在另一个维度上向上或向左移动其当前长度和原始长度之间差的一半(从而保持盒子在头部居中)来进行调整。 - Brendon Muir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接