Есть ли способ обнаружить и удалить нулевое заполнение в массиве изображений? В некотором смысле мой вопрос очень похож на это , за исключением того, что изображение уже повернуто, и я не знаю угол.
Я в основном обрезаю квадрат из большего изображения, которое может иметь нулевые отступы по краям (из-за смещения или поворота). Теперь возможно, что обрезка может содержать некоторые из этих отступов. Однако в таких случаях я хочу обрезать поле, в котором начинается край заполнения. Изображения находятся в формате CHW (может быть легко изменен на HW C).
Заполнение в этом случае будет равно 0 во всех каналах. Однако из-за поворотов возможно, что иногда нули не всегда могут находиться в полностью горизонтальных или вертикальных полосах в массиве. Есть ли способ определить, есть ли нули на всем пути к краю в массиве и в каком месте начинаются края?
Пример 1, где arr
- изображение с 3 каналами, шириной и высотой из 4 (3, 4, 4), а обрезка содержит вертикальный отступ на крайнем правом крае:
array([[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]]])
В этом примере я бы разрезал массив как таковой, чтобы избавиться от нулевого заполнения: arr[:, :, :-1]
Пример 2, где у нас есть отступы в правом верхнем углу:
array([[[1., 1., 0., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 0., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 0., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
В этом примере я бы вырезал изображение, чтобы удалить любые отступы, вернув arr2[:, 1:, :-1]
.
Я хочу сделать это в Tensorflow, поэтому тензорные операции были бы отличными, но я пытаюсь выяснить любой алгоритм, например, используя numpy, который может достичь такого результата.