2016-01-27 4 views
2

У меня есть несколько изображений, которые выглядят примерно так: enter image description hereОбрезка изображения, основываясь на значениях

Orange представляет значения, равные 0, белые представляют значения, равные 255, синий представляет собой поле, где значения варьируются от 0 до 255. Я хотел бы избавиться от оранжевой области, что немного отличается в каждом изображении. Каков наилучший способ сделать это?

EDIT 1

Я думал, что этот ответ может помочь: bounding box approach. исключением, что я хотел бы получить массив A_extract и не A_trim:

A = np.array([[0, 0, 0, 0, 0, 0, 0], 
       [0, 255, 0, 0, 0, 0, 0], 
       [0, 0, 255, 255, 255, 255, 0], 
       [0, 0, 255, 0, 255, 0, 0], 
       [0, 0, 255, 255, 255, 0, 0], 
       [0, 0, 0, 255, 0, 0, 0], 
       [0, 0, 0, 0, 0, 0, 0]]) 

A_trim = np.array([[255, 0, 0, 0, 0], 
        [ 0, 255, 255, 255, 255], 
        [ 0, 255, 0, 255, 0], 
        [ 0, 255, 255, 255, 0], 
        [ 0, 0, 255, 0, 0]]) 

A_extract = np.array([[255, 255, 255], 
         [255, 0, 255], 
         [255, 255, 255]) 

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

РЕДАКТИРОВАТЬ 2

Реального изображения является секретными спутниковыми изображениями, которая хранится в виде массива Numpy (с формой CCA. 7000x8000), а не RGB изображения. Вот как это выглядит:

  • оранжевый = 0
  • зеленый = 2
  • розовый = 3
  • белый = 255

Цель состоит в том, чтобы избавиться от 0 значений просто по краям.

enter image description here

+0

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

+0

Посмотрите на этот вопрос: http://stackoverflow.com/questions/16702966/rotate-image-and-crop-out-black-borders/27137047 –

+0

Я бы порекомендовал загружать настоящее изображение не изображение, которое «выглядит чем-то» как это". Лично я понятия не имею, что вы имеете в виду, говоря «Оранжевый представляет значения, равные 0, белые представляют значения, равные 255, синий - это поле, где значения меняются от 0 до 255». – Bonzo

ответ

0

Отредактировано с новым подходом:

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

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

только две переменные необходимы в следующем коде:

1). Цвет фона: образ образца (250, 255, 255) (не 255 255 255?);

2). Диапазон значений: код использует диапазон (2,30). это повлияет на время обработки, поскольку перечислены все возможные значения.

from PIL import Image 

BG_COLOR = (250, 255, 255) # background color 
MARGIN = range(2, 30) # Define your margin range 
tuple_list = [] # hold the tuple list result 

if __name__ == '__main__': 
    im = Image.open('dEGdp.png').convert('RGB')  
    w,h = im.size 
    pix = im.load() 
    for x1 in MARGIN: 
     for y1 in MARGIN: 
      for x2 in MARGIN: 
       for y2 in MARGIN: 
        if pix[x1,y1] == pix[w-x2,y1] == pix[x1, h-y2]== pix[w-x2,h-y2] == BG_COLOR and \ 
         (any([pix[x1-1,y]!= BG_COLOR or pix[w-x2+1, y] != BG_COLOR for y in range(0, h)]) or \ 
         any([pix[x, y1] != BG_COLOR or pix[x, h-y2+1] != BG_COLOR for x in range(0, w)])): 
         tuple_list.append(((w-x1-x2)*(h-y1-y2), x1, y1, w-x2, h-y2)) 
        else: continue 
    top_box = sorted(tuple_list).pop() #pick the top one 
    im_c = im.crop((top_box[1:])) # crop the image 
    im_c.save('cropped.png') 

выход хорош: enter image description here

0

Aha! Теперь я вижу ваш образ, я могу, может быть, лучше помочь. Опять же, я опишу подход с ImageMagick, но вы можете легко адаптировать его к OpenCV/Python.

Во-первых, ваше изображение - это классифицированное изображение, и оно является PNG, что означает, что ОЧЕНЬ ХОРОШО БЫЛО - всего 8 цветов и никаких артефактов квантования - наконец! О времени кто-то использовал правильный формат для своей задачи обработки изображений :-)

Первое задание - найти цвет «отрывочные пиксели края». Легкий способ сделать это и который позволяет варьировать цвет, - это взять 100x100 кусок с угла - чтобы найти несколько «надоедливых пикселей». Затем сделайте белый прозрачным и найдите цвет оставшихся видимых пикселей. Это одна строка в ImageMagick:

convert satellite.png -fuzz 10% -crop 100x100+0+0 -transparent white result.png 

enter image description here

Это показывает, посевные площади в контексте:

enter image description here

Тогда нам нужен средний цвет этого изображения - что цвет «надоедливые пиксели», так как белые прозрачны:

convert satellite.png -fuzz 10% -crop 100x100+0+0 -transparent white -resize 1x1 txt: 
# ImageMagick pixel enumeration: 1,1,255,srgba 
0,0: (61937,45232,11308,4857) #F1B02C13 srgba(241,176,44,0.0741131) 

Итак, оранжевый цвет - srgba(241,176,44,0.0741131).

Теперь мы находим пиксель в маленькой области кадрирования, чтобы использовать в качестве семян для заливки:

# ImageMagick pixel enumeration: 100,100,255,srgba 
0,0: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
1,0: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
2,0: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
... 
97,7: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
98,7: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
99,7: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
0,8: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
1,8: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
2,8: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
3,8: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
4,8: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
5,8: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
6,8: (65535,65535,65535,0) #FFFFFF00 srgba(255,255,255,0) 
7,8: (61937,45232,11308,65535) #F1B02CFF srgba(241,176,44,1) <--- FIRST PESKY PIXEL 
8,8: (61937,45232,11308,65535) #F1B02CFF srgba(241,176,44,1) 
9,8: (61937,45232,11308,65535) #F1B02CFF srgba(241,176,44,1) 
10,8: (61937,45232,11308,65535) #F1B02CFF srgba(241,176,44,1) 
11,8: (61937,45232,11308,65535) #F1B02CFF srgba(241,176,44,1) 
12,8: (61937,45232,11308,65535) #F1B02CFF srgba(241,176,44,1) 
13,8: (61937,45232,11308,65535) #F1B02CFF srgba(241,176,44,1) 
14,8: (61937,45232,11308,65535) #F1B02CFF srgba(241,176,44,1) 

Таким образом, любой один с srgba(241,176,44,0.0741131) будет делать, давайте выберем первый - пиксель [7,8 ]

Теперь мы можем заливать заполнить изображение, начиная там:

convert satellite.png -fill white -floodfill +7+8 "#F1B02CFF" result.png 

enter image description here

И вы можете видеть, что наводнение заполнило левый столбец «Отвратительные пиксели». Теперь найдите аналогичный семенной пиксель в трех других углах и повторите.

+0

Если я понимаю вопрос, я думаю, что проблема в значении в области, представленной апельсином, также может быть в области, обозначенной синим? – Bonzo

+0

@Bonzo Я тоже нахожу этот вопрос путаным - я как бы взял на себя то, что оранжевая область была оранжевой, а синяя область была синей. Надеюсь, OP разъяснит :-) –

+0

Я добавил «EDIT 2». – Mapa

0

На изображении размещена белая рамка, а затем черные линии с трех сторон, прежде чем вы попадете на оранжевый.

Это удалит белая граница затем меняется на оранжевый белый:

convert amGCH.png -trim -fill white -draw "color 5,5 floodfill" output.png 
Смежные вопросы