Как изменить размер вставленного изображения, чтобы оно идеально соответствовало исходному изображению - PullRequest
0 голосов
/ 11 февраля 2020

Это оригинальное изображение: [! [Введите описание изображения здесь] [1]] [1]

и вот изображения, которые мне нужно на нем наклеить: [! [Введите описание изображения здесь ] [2]] [2]

Когда я вставляю его, получается результирующее изображение: [! [Введите описание изображения здесь] [3]] [3]

и это код:

def applyWireAugmentation(img, wire_img,wdir, odir, theata,dst_path, counter, index):

    src_im = Image.open(wdir+wire_img).convert("LA")
    dst_im = Image.open(odir+img)
    w,h = dst_im.size
    ww,wh = src_im.size
    angle = theata
    size = w, h

    x = random.randint(0,w/2)
    y = 0
    im = src_im.convert('RGBA')
    rot = im.rotate( angle, expand=1 ).resize(size)
    dst_im.paste( rot, (x, y), rot )
    dst_im.save(dst_path+"/"+img.replace(".png","")+"-"+index+"-"+str(counter)+".png")

Мне нужно растянуть вставленное изображение так, чтобы его концы соответствовали исходному изображению. Как мне сделать это в общем c способе?

Редактировать: Ожидаемый результат:

Считать черную линию проводом. Провод должен быть растянут до конца самого изображения

1 Ответ

1 голос
/ 11 февраля 2020

Поскольку я также не понимаю, чего вы хотите добиться с помощью этого случайного размещения и поворота, я сосредоточился на обрезке и растяжении провода. Как указывалось ранее, я предпочитаю NumPy / OpenCV для такой операции. (Преобразование из и в подушку / PIL не проблема.)

Это было бы моим предложением:

import cv2
import numpy as np
from skimage import io              # Only needed for web reading images

# Web read images via scikit-image; convert to OpenCV's BGR color ordering
bg = cv2.cvtColor(io.imread('https://i.stack.imgur.com/WGP1I.jpg'), cv2.COLOR_RGB2BGR)
wire = cv2.cvtColor(io.imread('https://i.stack.imgur.com/r1GCd.png'), cv2.COLOR_RGBA2BGRA)

# Crop wire in alpha channel
rect = cv2.boundingRect(wire[:, :, 3])
wire = wire[rect[1]:(rect[1] + rect[3]), rect[0]:(rect[0] + rect[2])]

# Resize cropped wire to background image shape
wire = cv2.resize(wire, (bg.shape[1], bg.shape[0]))

# Paste wire on background image
bg[wire[:, :, 3] > 0, :] = wire[wire[:, :, 3] > 0, :3]

# Output
cv2.imshow('bg', bg)
cv2.waitKey(0)
cv2.destroyAllWindows()

И это было бы выводом:

Output

Вывод выглядит не очень хорошо, но это в основном из-за альфа-канала провода. В этом вопросе потребуются улучшения.

Если это не тот вывод, пожалуйста, дайте мне знать.

Однако - надеюсь, это поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
OpenCV:      4.2.0
----------------------------------------
...