Тензор потока: Обрезать самую большую область центральной площади изображения - PullRequest
0 голосов
/ 25 февраля 2019

Моя сеть принимает изображения размером 100 x 100 пикселей.Поэтому я должен изменить размеры изображений моего набора данных, которые имеют разные размеры.Я хочу иметь возможность извлечь самую большую область центрального квадрата из данного изображения, а затем изменить его размер до 100 x 100.

Чтобы быть более точным, скажем, изображение имеет ширину 200 пикселей ивысота 50 пикселей.Затем я хочу извлечь самую большую область центрального квадрата, которая в этом примере 50 x 50, а затем изменить размер изображения до 100 x 100 пикселей.

Как правильно сделать это с помощью Tensorflow?Прямо сейчас я использую tf.image.resize_images(), который искажает изображение, и я хочу избавиться от этого.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Я думаю, что это то, что вы хотите:

import tensorflow as tf

def crop_center_and_resize(img, size):
    s = tf.shape(img)
    w, h = s[0], s[1]
    c = tf.minimum(w, h)
    w_start = (w - c) // 2
    h_start = (h - c) // 2
    center = img[w_start:w_start + c, h_start:h_start + c]
    return tf.image.resize_images(img, [size, size])

print(crop_center_and_resize(tf.zeros((80, 50, 3)), 100))
# Tensor("resize_images/Squeeze:0", shape=(100, 100, 3), dtype=float32)

Существует также tf.image.crop_and_resize, который может выполнять обе функции за один раз, но вы должны использовать нормализованные координаты изображенияс этим:

import tensorflow as tf

def crop_center_and_resize(img, size):
    s = tf.shape(img)
    w, h = s[0], s[1]
    c = tf.minimum(w, h)
    wn, hn = h / c, w / c
    result = tf.image.crop_and_resize(tf.expand_dims(img, 0),
                                      [[(1 - wn) / 2, (1 - hn) / 2, wn, hn]],
                                      [0], [size, size])
    return tf.squeeze(result, 0)
0 голосов
/ 25 февраля 2019
import tensorflow as tf


def central_square_crop(image):                                                                                                                                                                                                                                       
    h, w = image.get_shape()[0].value, image.get_shape()[1].value                                                                                                                                                                                                     
    side = tf.minimum(h, w)                                                                                                                                                                                                                                           
    begin_h = tf.maximum(0, h - side) // 2                                                                                                                                                                                                                            
    begin_w = tf.maximum(0, w - side) // 2                                                                                                                                                                                                                            
    return tf.slice(image, [begin_h, begin_w, 0], [side, side, -1])                                                                                                                                                                                                   


def main():                                                                                                                                                                                                                                                           
    image_t = tf.reshape(tf.range(5 * 7), [5, 7])                                                                                                                                                                                                                     
    image_t = tf.transpose(tf.stack([image_t, image_t, image_t]), [1, 2, 0])                                                                                                                                                                                          
    cropped_image_t = central_square_crop(image_t)                                                                                                                                                                                                                    
    with tf.Session() as sess:                                                                                                                                                                                                                                        
        image, cropped_image = sess.run([image_t, cropped_image_t])                                                                                                                                                                                                   
        print(image[:, :, 0])                                                                                                                                                                                                                                         
        print(cropped_image[:, :, 0])                                                                                                                                                                                                                                 


if __name__ == '__main__':                                                                                                                                                                                                                                            
    main() 

Выход до обрезки:

[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]
 [21 22 23 24 25 26 27]
 [28 29 30 31 32 33 34]]

После обрезки:

[[ 1  2  3  4  5]
 [ 8  9 10 11 12]
 [15 16 17 18 19]
 [22 23 24 25 26]
 [29 30 31 32 33]]

Затем примените изменение размера как обычно.

0 голосов
/ 25 февраля 2019

Похоже, crop_to_bounding_box делает то, что вам нужно:

import tensorflow as tf

def crop_center(image):
    h, w = image.shape[-3], image.shape[-2]
    if h > w:
        cropped_image = tf.image.crop_to_bounding_box(image, (h - w) // 2, 0, w, w)
    else:
        cropped_image = tf.image.crop_to_bounding_box(image, 0, (w - h) // 2, h, h)
    return tf.image.resize_images(cropped_image, (100, 100))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...