2017-02-14 4 views
0

자르기의 상자 크기를 수동으로 설정하지 않고도 자동으로 여러 개의 자르기를 사용할 수있는 방법을 찾고 있습니다. 나는이 같은 스펙트로 그램 플롯의 목록을자를 필요가 스마트 자르기 이미지

,

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

이와 같은 기능을 수행하는 특수화 된 제 3 자 모듈을 찾을 수없는 경우 픽셀 값을 살펴보고 상단 및 하단이 어디에 있는지 확인할 수 있습니다. 플롯 이미지가 흰색 배경까지 모두 비슷하면 여러 배경 픽셀이 시작될 때까지 왼쪽 위치에서 검색 권한으로 경계를 찾을 수 있어야하며 위쪽 가장자리에 대해서도 마찬가지로 위쪽으로 이동해야합니다. – 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) 

나는 코드가 명백해 희망 .. 아니라면

루프 반복하여 이미지를 (하나 개의 행만을 인해 플롯의 크기로, 확인해야), 그리고 발견을위한 회색의 픽셀 위치와 동일한 픽셀 위치. 그것이 발견되면 for 루프가 깨지고 원하는 크기에 맞춰 상자가 생성됩니다.

1

는 파이썬 모르지만, 당신은 대부분의 리눅스 배포판에 설치 맥 OS 및 윈도우 사용할 수 있습니다 ImageMagick이와 터미널에있는 고급 언어없이 그것을 할 수 있습니다.

먼저 어떤 이유로 이미지에 불필요한 알파 채널이 있으므로주의해야합니다.

그런 다음 관심있는 모든 내용은 채도가 있고 모든 불필요한 텍스트는 검은 색/회색이며 불포화되어 있으므로 차별화 된 채도로 전환합니다. 터미널에 입력 된이 명령은 이미지를로드하고 모든 픽셀을 검은 색으로 설정합니다. 즉, 불포화 상태이며 현재 값은 다른 모든 곳에서 유지됩니다. 그런 다음 테두리를 트림하고 결과를 저장합니다.

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 

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

:

그래서, 내가 함께 할 칼럼 (496)에서자를 필요

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