Смущен тем, как правильно добавить белую рамку к моему numy imagearray с помощью numpy.pad - PullRequest
0 голосов
/ 07 ноября 2018

Я использовал openCV2 для загрузки изображения в градациях серого, которое затем преобразовал в numpy.array. Теперь я хочу дополнить этот массив рамкой вокруг изображения. Тем не менее, у меня возникли проблемы с анализом того, что я хочу сделать от этого руководства. Я попытался поискать в Google и искать примеры заполнения, но ни один из них не подходил для моего случая.

Мой текущий код выглядит так:

import numpy as np
img = cv2.imread('Lena.png', )
imgArray = np.array((img))
imgArray = np.pad(imgArray, pad_width=1,mode='constant' ,constant_values=0)
cv2.imshow('Padded', imgArray)

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

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

Скажем, у вас есть lena.png следующим образом:

enter image description here

Тогда вы можете сделать:

from PIL import Image, ImageOps                                                                                                
import numpy as np    

# Load the image - you could just as well use OpenCV `imread()`
img = Image.open('lena.png')   

# Pad 20px to all sides with magenta
padded = ImageOps.expand(img, border=20, fill=(255,0,255)) 

# Save to disk
padded.save('result.png')   

enter image description here


Прежде чем кто-либо решит понизить голос, потому что ОП спросил, как добавить белые границы, обратите внимание, что вы можете так же легко добавить белый с помощью этого метода, если вы используете:

padded = ImageOps.expand(img, border=20, fill=(255,255,255)) 

Если вы используете массивы numpy для работы с изображениями, вы можете преобразовать массив numpy в PIL Image с помощью:

pil_image = Image.fromarray(numpy_array)

и наоборот:

numpy_array = np.array(pil_image)
0 голосов
/ 07 ноября 2018

Ознакомьтесь с документацией openCV2 здесь: https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html

Мое лучшее предположение - использовать constant= cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

0 голосов
/ 07 ноября 2018

И еще один вариант с использованием np.pad:

Как вы можете видеть здесь , вам нужно указать ось, которую вы хотите np.pad. Просто используя:

    imgArray = np.pad(imgArray, pad_width=1, mode='constant', constant_values=0)

добавляет только значения к третьей оси (т. Е. Канал RGB), чтобы вы больше не могли рисовать изображение.

Как описано в указанном вопросе, вам потребуется использовать следующие аргументы кода:

   imgArray = np.pad(imgArray, pad_width=((1,1), (1,1), (0,0)), mode='constant', constant_values=0)

Также см. Документацию np.pad :

Количество значений, добавленных к краям каждой оси. ((before_1, after_1),… (before_N, after_N)) уникальная ширина площадки для каждой оси. ((до, после),) дает одинаковые до и после площадки для каждой оси. (pad,) или int - это сокращение для before = after = ширина площадки для всех осей.

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

Вы не хотите дополнять последнее измерение, так как это измерение, хранящее информацию RGB.

И как вы указали в своем вопросе, что вы хотите белую рамку: constant_values ​​должен быть установлен в 255 или 1, в зависимости от диапазона вашего изображения. Использование 0 приводит к черной рамке.

0 голосов
/ 07 ноября 2018

Вы можете сделать следующее:

import numpy as np
import cv2 

img = cv2.imread('Lena.png', 0)
img = np.pad(img, pad_width=4, mode='constant', constant_values=0)
cv2.imshow('Padded', img)
cv2.waitKey(0)

Из документации из cv2.imread:

cv2.imread(filename[, flags]) → retval

Параметры:

  • filename - имя файла для загрузки.

  • флаги:

Флаги , указывающие тип цвета загруженного изображения:

CV_LOAD_IMAGE_ANYDEPTH - Если установлено, вернуть 16-битное / 32-битное изображение, когда вход имеет соответствующую глубину, в противном случае преобразовать его в 8-битное.

CV_LOAD_IMAGE_COLOR - если установлено, всегда конвертировать изображение в цветное

CV_LOAD_IMAGE_GRAYSCALE - если установлено, всегда конвертировать изображение в оттенки серого

> 0 Возвращает 3-канальное цветное изображение. Примечание. В текущей реализации альфа-канал, если он есть, удаляется из выходного изображения. Используйте отрицательное значение, если вам нужен альфа-канал.

= 0 Возвращает оттенки серого изображение.

<0 Возвращает загруженное изображение как есть (с альфа-каналом). </p>

С помощью приведенного выше кода мы получили следующий результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...