【问题标题】:What's the best way of centre cropping images in python?在python中居中裁剪图像的最佳方法是什么?
【发布时间】:2018-12-19 06:49:24
【问题描述】:

我有 20,000 张矩形图像要居中裁剪,以便将它们插入机器学习算法。

Tensorflow 有 tf.image.central_crop() 但我想在 TF 参与之前检查图片。该函数接受一个张量并输出一个张量。

在 Python 中裁剪它们的最佳工具是什么?

编辑:或者,计算中心作物的最佳算法是什么?

【问题讨论】:

  • 裁剪它们的最快、最简单的方法可能是使用 GNU ParallelImageMagickvips
  • 另外,您没有提及您的图像是什么格式,也没有提及您希望将它们裁剪成什么尺寸,也没有提及您希望输出保存/命名的方式/位置。
  • 马克,我想要相同的格式,只是中心裁剪。它们是png。
  • 它们都是相同的像素尺寸吗?它们都是横向的还是纵向的?
  • @MarkSetchell Both.Irratingly.

标签: python image tensorflow


【解决方案1】:

如果您想查看裁剪后的图像,可以使用:

from PIL import Image
image = Image.open("/path_to_image.jpg")

crop_rectangle = (50, 50, 200, 200)
cropped_image = image.crop(crop_rectangle)

cropped_image.show()

【讨论】:

    【解决方案2】:

    这是一种裁剪图像的简单方法:-

    import Image
    
    def crop_image(file_name,new_height,new_width):
    
        im = Image.open(file_name+".jpg")
        width, height = im.size   
    
        left = (width - new_width)/2
        top = (height - new_height)/2
        right = (width + new_width)/2
        bottom = (height + new_height)/2
    
        crop_im = im.crop((left, top, right, bottom)) #Cropping Image 
    
        crop_im.save(file_name+"_new.jpg")  #Saving Images 
    
    new_width = 256     #Enter the crop image width
    new_height = 256    #Enter the crop image height
    file_name = ["google"] #Enter File Names
    
    for i in file_name:
        crop_image(i,new_height,new_width)
    

    【讨论】:

      【解决方案3】:

      您可以使用 ImageMagick 轻松快速地完成此操作,而无需编写任何代码,该工具安装在大多数 Linux 发行版上,适用于 macOS 和 Windows。

      在终端中,通过将gravity 设置为center 并指定与该位置的零偏移量,将图像裁剪为中心50x50 像素:

      magick input.png -gravity center -crop 50x50+0+0 result.png
      

      如果你想裁剪到最大的正方形,你需要使用一个函数来找到高度和宽度中的较小者,并将其用于每个 50s:

      magick input.png -gravity center -crop "%[fx:h<w?h:w]x%[fx:h<w?h:w]+0+0" result.png
      

      开始图片:

      结果:

      好的,现在我们要做 20,000 张图像,所以我们使用 GNU Parallel,那就是:

      parallel magick {} -gravity center -crop ... {} ::: *.png
      

      但是现在我们遇到了一些新问题。文件名列表对于 ARG_MAX 来说太长了,所以我们需要在 stdin 上从 find 输入文件名,像这样使用空终止:

      find . -name \*.png -print0 | parallel -0 magick {} -gravity center -crop ... {}
      

      -crop 表达式中的特殊字符也出现了新问题,因此我们需要请 GNU Parallel 为我们解决引用问题。所以最终的命令变成了:

      find . -name \*.png -print0 | parallel -0 --quote magick {} -gravity center -crop "%[fx:h<w?h:w]x%[fx:h<w?h:w]+0+0" {} 
      

      这是一个非常强大的命令,可以快速更改数千张图像,覆盖原始图像,因此请先将图像复制到安全的地方,在一小部分图像上进行测试!

      您可以通过以下方式获得进度条:

      parallel --bar ...
      

      你可以做一个 “试运行” 要求 GNU Parallel 向你展示它做什么而不实际做这样的事情:

      parallel --dry-run ...
      

      有一些方法可以使这变得更快,更容易阅读 - 我可能会在以后有更多时间时添加它们。

      【讨论】:

      • 谢谢。真的。谢谢。
      • 我的荣幸。祝你的项目好运!
      • 在某个时候,我希望能够像您一样回答问题。 :)
      • find 具有下降到子目录的功能。如果您不希望这样,请使用printf "%s\0" *.png(printf 是 bash 的一部分)。
      【解决方案4】:

      你可以在 Python Wand 中使用重力来做到这一点:

      指定重力以及宽度和高度关键字参数可以简化裁剪。

      >>> img.size
      (300, 300)
      >>> img.crop(width=40, height=80, gravity='center')
      >>> img.size
      (40, 80)
      

      http://docs.wand-py.org/en/0.4.4/guide/resizecrop.html#crop-images

      【讨论】:

        猜你喜欢
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 2020-02-20
        • 2014-05-12
        • 2022-12-23
        相关资源
        最近更新 更多