как сделать фон ясным - PullRequest
       5

как сделать фон ясным

0 голосов
/ 02 апреля 2019

У меня есть изображения кусочков головоломки, и я работаю над алгоритмом, соответствующим головоломке. Я хочу показать изображение текущего результата после нахождения соответствия для каждой головоломки. puzzle piece. Я хочу вставить все изображения в одну плоскость ... но не могу найти точную координату, где изображение должно быть размещено, чтобы оно могло быть связано с предыдущим фрагментом. но не могу найти способ сделать фон пустым, используя opencv. на данный момент пиксели черные (0,0,0). Любая идея, как я могу сделать пустые пиксели назад и прошлое на другом изображении?

Попробовав предложенные методы. enter image description here

выше изображение - то, что мне удалось получить, используя эти коды

def show_results(results, puzzle):
    final = Image.new('RGBA', (300 * COL_NUM, 300 * ROW_NUM))
    border = 100
    keys = list(results.keys())
    X, Y = border, border
    x, y = border, border
    for i in keys:
        image = puzzle[results[i]].img
        corners = puzzle[results[i]].corners
        image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2RGBA)
        image[np.all(image == [0, 0, 0, 255], axis=2)] = [0, 0, 0, 0]
        corner0 = corners[0]
        x = X-corner0[0]
        y = Y-corner0[1]
        img = Image.fromarray(np.uint8(image))
        final.paste(img, (x, y))
        corner1 = corners[1]
        X = X + (corner1[0]-corner0[0])
        Y = Y + (corner1[1]-corner0[1])
    final.save('current.png')
    # cv2.imshow("result",final)
    # cv2.waitKey(0)

как решить эту проблему. может быть проблема в формате, который я использовал для вставки. но я могу понять это

1 Ответ

1 голос
/ 03 апреля 2019

Я предполагаю, что ваше входное изображение не имеет прозрачного фона по умолчанию.Функция convert_to_png() добавит альфа-канал к вашему изображению

def convert_to_png(img): 
    fin_img = cv2.cvtColor(img, cv2.COLOR_RGB2RGBA)
    b, g, r, alpha = cv2.split(fin_img)
    alpha[:, :] = 0.0
#    plt.imshow(alpha);plt.title('alpha image');plt.show()     
#    plt.imshow(img);plt.title('original image');plt.show()   
    alpha[np.where((img != (255, 255, 255)).any(axis = 2))] = 255

    fin_img[:,:, 0] = img[:,:,0]
    fin_img[:,:, 1] = img[:,:,1]
    fin_img[:,:, 2] = img[:,:,2]
    fin_img[:,:, 3] = alpha[:,:]

#    plt.imshow(fin_img);plt.title('fin image');plt.show()
    return fin_img

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

y1, y2 = new_loc[1], new_loc[1] + img.shape[0]
x1, x2 = new_loc[0], new_loc[0] + img.shape[1]

alpha_s = img[:, :, 3] / 255.0
alpha_l = 1.0 - alpha_s

for c in range(0, 3):
    fin_img[y1:y2, x1:x2, c] = (alpha_s * img[:, :, c] +
                              alpha_l * img[y1:y2, x1:x2, c])

Здесь fin_img - 3-канальное выходное изображение

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