智能裁剪图片

时间:2017-02-14 12:46:42

标签: python image python-imaging-library crop

我正在寻找一种方法,我可以用来自动裁剪几个图..没有我手动必须设置裁剪的框大小。

我需要裁剪一系列像这样的频谱图,

enter image description here

其中我只需要实际的情节,而不需要其他东西。只是情节。

目前我正在像这样裁剪它。

print "Hstacked Image"
images1 = Image.open(spectogram_path_train+"/"+name+"_plot_static_conv.png")
images2 = Image.open(spectogram_path_train+"/"+name+"_plot_delta_conv.png")
images3 =      Image.open(spectogram_path_train+"/"+name+"_plot_delta_delta_conv.png")

box = (100,55,592,496)
cropped1  = images1.crop(box)
cropped2  = images2.crop(box)
cropped3  = images3.crop(box)

width1, height1 = cropped1.size
width2, height2 = cropped2.size
width3, height3 = cropped3.size

sum_width  = width1 + width2 + width3
max_height = max(height1,height2,height3)

new_im = Image.new('RGB',(sum_width,max_height))
x_offset = 0

for im in [cropped1,cropped2,cropped3]:
    new_im.paste(im,(x_offset,0))
    x_offset+=im.size[0]

new_im.save(spectogram_path_train+"/"+name+"_plot_hstacked.png")

这些框值设置为裁剪此图像。对于每个绘图,框的左侧和下侧参数始终相同,但右侧可能不同,必须自动确定每个绘图。

我正在寻找能够除去彩色情节之外的所有东西的智能作物。

2 个答案:

答案 0 :(得分:1)

我不了解Python,但是您可以在终端上使用 ImageMagick 在没有任何高级语言的情况下执行此操作, ImageMagick 安装在大多数Linux发行版上,可用于macOS和Windows。

首先请注意,由于某种原因,您的图片有一个多余的Alpha通道,因此我将其关闭。

然后,我注意到你感兴趣的所有东西都是饱和的颜色,所有无关的文字都是黑色/灰色和不饱和的,所以我会转向饱和度作为判别。键入终端的此命令加载图像并将所有像素设置为黑色,即零,它们是不饱和的,并在其他任何地方保留其当前值。然后它会修剪边框并保存结果。

convert spectrum.png -alpha off -fx "saturation<0.2?0:u" -trim z.png

enter image description here

如果我现在再次运行该命令,但只提取顶部单行像素,并寻找第一个黑色像素,我将知道在哪里裁剪:

convert spectrum.png -alpha off -fx "saturation<0.2?0:u" -trim +repage -crop x1! txt: | awk -F, '/black/{print $1;exit}'

496

所以,我需要在第496栏进行裁剪,我这样做:

convert spectrum.png -alpha off -fx "saturation<0.2?0:u" -trim +repage -crop 496x+0+0 z.png

enter image description here

如果我想自动完成整个过程,我可以这样做:

x=$(convert spectrum.png -alpha off -fx "saturation<0.2?0:u" -trim +repage -crop x1! txt: | awk -F, '/black/{print $1;exit}')
convert spectrum.png -alpha off -fx "saturation<0.2?0:u" -trim +repage -crop ${x}x+0+0 y.png

答案 1 :(得分:0)

所以..我决定按照@martineau的建议制定一个利用它的解决方案。

images1 = Image.open(static)
images2 = Image.open(delta)
images3 = Image.open(delta_delta)

data_numpy = np.array(images1)
number = 0
right = 0

for i in data_numpy[55,:]:
#    print i
    number+=1
    if i[0] == 234 and i[1] == 234 and i[2] == 242 and i[3] == 255 and number > 100:
#        print "Found it!"
        right = number
        break
    if i[0] == 255 and i[1] == 255 and i[2] == 255 and i[3] == 255 and number > 100:
        right = number
        break
#print right

box = (100,55,right,496)

cropped1  = images1.crop(box)
cropped2  = images2.crop(box)
cropped3  = images3.crop(box)

我希望如果没有代码,代码就会自行说明。

for循环通过图像迭代(由于绘图的大小,仅需要检查一行),并找到与灰色像素位置相同的像素位置。当找到它时,for循环会中断,并且会创建一个符合所需大小的框。