2017-02-14 30 views
0

Я ищу способ, который я могу использовать для обрезки нескольких графиков автоматически. Без необходимости вручную устанавливать размер коробки для обрезки.Smart cropping image

мне нужно подрезать список спектрограммы участков, как эти,

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

Эти значения коробки устанавливаются кадрировать изображение .. левый и нижний параметр коробки всегда одинаков для каждого участка, но право может отличаться, который должен быть автоматически определяется для каждого участка.

Я ищу умную культуру, способную удалить все, кроме цветного участка.

+1

Если вы не можете найти какой-либо специализированный сторонний модуль, который сделает что-то подобное, вы можете сделать это самостоятельно, просмотрев значения пикселей, чтобы определить, где лежат верхний и правый края. Если изображения сюжета все схожи по сравнению с белым фоном, вы должны иметь возможность найти границу путем поиска справа от левого местоположения до тех пор, пока не начнется несколько фоновых пикселей, а также вверх для верхнего края. – martineau

+1

Ох .. Извините. Я решил это так, как предложил @martineau. Решение было довольно ... – Loser

ответ

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) 

Я надеюсь, что код говорит сам за себя, если нет ..

для итерацию цикла (одна строка нужно только проверить, из-за размера участка) через образы, и найти пиксель, который является таким же, как серый. когда это будет найдено, будет прерываться цикл цикла, и будет создан ящик, соответствующий желаемому размеру.

1

Я не знаю Python, но вы можете сделать это без какого-либо языка высокого уровня в терминале с ImageMagick, который установлен на большинстве дистрибутивов Linux и доступен для MacOS и Windows.

Во-первых, обратите внимание, что по какой-либо причине ваше изображение имеет избыточный альфа-канал, поэтому я отключил его.

Затем я отмечаю, что все, что вас интересует, является насыщенным цветом, а весь посторонний текст черно-серым и ненасыщенным, поэтому я бы обратился к насыщению как к дискриминанту. Эта команда, введенная в терминал, загружает ваше изображение и устанавливает все пиксели в черный, т. Е. Ноль, где они ненасыщены и сохраняют свои текущие значения везде. Затем он обрезает границы и сохраняет результат.

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

Я не смог попробовать ваше решение .. Мне нужно было обрезать его в коде, так как мне нужно обрезать и соединить их вместе .. и что, я думаю, потребуется немного больше кода .. – Loser