在python中集中裁剪图像的最佳方法是什么?

时间:2018-07-11 09:29:06

标签: python image tensorflow

我有20,000张矩形图像,我想对它们进行中心裁剪,以便将它们插入机器学习算法中。

Tensorflow有tf.image.central_crop(),但是我想在TF介入之前检查图片。该函数需要张量并输出张量。

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

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

4 个答案:

答案 0 :(得分:4)

您无需使用 ImageMagick 编写任何代码即可轻松,快速地执行此操作,该软件安装在大多数Linux发行版中,并且可用于macOS和Windows。

在终端中,通过将gravity设置为center并从该位置指定零偏移,将图像裁剪为中心50x50像素,如下所示:

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

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

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

起始图片:

enter image description here

结果:

enter image description here

好吧,现在我们要制作20,000张图像,所以我们使用 GNU Parallel ,即:

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

但是现在我们遇到了一些新问题。文件名列表对于ARG_MAX来说太长了,因此我们需要使用stdinfind上的find . -name \*.png -print0 | parallel -0 magick {} -gravity center -crop ... {} 上输入文件名,并使用空终止符:

-crop

find . -name \*.png -print0 | parallel -0 --quote magick {} -gravity center -crop "%[fx:h<w?h:w]x%[fx:h<w?h:w]+0+0" {} 表达式中的特殊字符也给我们带来了一个新问题,因此我们需要请 GNU Parallel 为我们制定报价。因此,最后的命令将变为:

parallel --bar ...

这是一个非常强大的命令,它将迅速更改成千上万张图像,并覆盖原始图像,因此,请先将其复制到安全的地方,然后再对一小部分图像进行测试!

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

parallel --dry-run ...

您可以执行“空运行” ,要求 GNU Parallel 向您展示将要执行的操作,而无需实际执行此类操作:

componentDidMount() {
    if (this.props.client === 'abcdf') {
        import('../clients/abcdf/abcdfMenu').then(comp => {
            this.setState({ sideMenu: comp.default });
        });
    }
}

有一些方法可以使此操作更快甚至更容易阅读-我可以在以后有更多时间的时候添加它们。

答案 1 :(得分:1)

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

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)

答案 2 :(得分:0)

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

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()

答案 3 :(得分:0)

您可以在Python魔杖中借助重力来做到这一点:

通过指定引力以及width和height关键字参数,可以简化裁剪方法。

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