Я хочу создать ограничивающий прямоугольник из следующих измерений, используя сетку, но просто не могу получить правильный прямоугольник.
Мои родительские размеры x = 0 to 19541
и y = 0 to 14394
. Из этого я хочу сократить поле с x '= 4692 до 12720 и y' = 4273 to 10117
.
Однако я не получаю правильных границ. Может ли кто-нибудь помочь мне здесь?
from matplotlib.path import Path
xmin, xmax = 4692, 12720
ymin, ymax = 4273, 10117
sar_ver = [(4692, 10117), (12720, 10117), (12658, 4274), (4769, 4273), (4692, 10117)]
x, y = np.meshgrid(np.arange(xmin, xmax + 1), np.arange(ymin, ymax + 1))
shx = x
x, y = x.flatten(), y.flatten()
points = np.vstack((x, y)).T
path = Path(sar_ver)
grid = path.contains_points(points)
grid.shape = shx.shape # 5845 X 8029
print grid
ОБНОВЛЕНИЕ: Это то, что я пытался, и я близок к тому, что я хочу, но не совсем. Я хочу изменить исходное происхождение с 0 на окружающее изображение поле, как показано в ожидаемом выводе.
Обновленный код, который я использую, это
from matplotlib.path import Path
nx, ny = 16886, 10079
sar_ver = [(16886, 1085), (15139, 2122), (14475, 5226), (8419, 5601), (14046, 6876), (14147, 10079), (16816, 3748), (16886, 1085)]
x, y = np.meshgrid(np.arange(nx), np.arange(ny))
x, y = x.flatten(), y.flatten()
points = np.vstack((x,y)).T
path = Path(sar_ver)
grid = path.contains_points(points)
grid.shape = (10079, 16886)
grid = np.multiply(grid,255)
int_grid = grid.astype(np.uint8)
grid_img = Image.fromarray(int_grid)
grid_img.save('grid_image.png') # ACTUAL OUTPUT IMAGE WITH ORIGIN NOT SHIFTED
Входной геом:
Ожидаемый результат такой: не имеет значения, будет ли изображение повернуто в другую сторону, но будет ли вишня сверху, если оно выровнено правильно.
Однако я сейчас получаю это, так что мой АКТУАЛЬНЫЙ ВЫХОД из обновленного кода выложен так:
Итак, я хочу сместить источник вокруг рамки.
ДЕТАЛИ ПРОБЛЕМЫ С ГРАНИЦЕЙ ПОСЛЕ ПОЛУЧЕНИЯ МАСКИ: Этот код следует после строки, размещенной во втором обновлении grid_img.save('grid_image.png') # ACTUAL OUTPUT IMAGE WITH ORIGIN NOT SHIFTED
Здесь im
- матрица фактического изображения. Что должно быть x-y min, максимум im
, чтобы иметь ту же форму, что и маска, и умножить их оба, чтобы получить значения в пикселях, а остальные обнулить с 0.
img_x = 19541 # 0 - 19541
img_y = 14394 # 0 - 14394
im = np.fromfile(binary_file_path, dtype='>f4')
im = np.reshape(im.astype(np.float32), (img_x, img_y))
im = im[:10079, :16886]
bb_list = np.multiply(grid, im)
# slice and dice
slice_rows = np.any(bb_list, axis=1)
slice_cols = np.any(bb_list, axis=0)
ymin, ymax = np.where(slice_rows)[0][[0, -1]]
xmin, xmax = np.where(slice_cols)[0][[0, -1]]
answer = bb_list[ymin:ymax + 1, xmin:xmax + 1]
# convert to unit8
int_ans = answer.astype(np.uint8)
fin_img = Image.fromarray(int_ans)
fin_img.save('test_this.jpeg')
Моя цель состоит в том, чтобы вырезать многоугольник заданного геома из заданного изображения. Поэтому я вынимаю маску из этого многоугольника и затем использую эту маску, чтобы вырезать ее из исходного изображения. Таким образом, умножая 1 и 0 маски на значения пикселей на изображении, получим только 1 * значения пикселей.
Я попробовал следующее, чтобы вырезать фактическое изображение, чтобы оно имело те же размеры, чтобы я мог умножить np.multiply(im, mask)
, но это не сработало, так как форма изображения не обрезалась по форме маски. Я попробовал ваши мин и макс ниже, но не сработало!
im = im[xmin:xmax, ymin:ymax]
ipdb> im.shape
(5975, 8994)
ipdb> mask.shape
(8994, 8467)
Очевидно, что я не могу сделать несколько масок, и я сейчас.