Удалить белый фон с изображения с помощью opencv python

Я пытался удалить фон из логотипа и использовать его в качестве водяного знака на изображениях продуктов. Я пытался удалить фон из логотипа с помощью маскирования, но также удалял черные шрифты из логотипа. Мне нужна помощь в удалении фона без изменения логотипа. изображения прикреплены ниже. выходное изображение - это изображение, которое я получаю в качестве вывода с помощью этого кода. изображение логотипа: https://drive.google.com/file/d/1yMG6cDuPt8q3EqOJ4Amzp_czWq5hrGS5/view?usp=sharing изображение продукта: https://drive.google.com/file/d/13SmkTgBtWD3yIJq-qGI0aZJ-hjaLbyuB/view?usp=sharing выходное изображение: https://drive.google.com/file/d/1k-fQ9tPUEJKQXPdmdB2ajtliAAG4irNs/view?usp=sharing

это мой код

import cv2
import numpy as np
img = cv2.imread('images/1L2Z3A443AAMC.jpg')
logo = cv2.imread('water2.png')
logo = cv2.resize(logo,(int(img.shape[0]/1.2),int(img.shape[1]/2)))
logo_gray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
ret,mask= cv2.threshold(logo_gray,245,255,cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
logo_final = cv2.bitwise_and(logo,logo, mask=mask_inv)


h_img,w_img,_ = img.shape
h_logo,w_logo,_ = logo.shape
center_y = int(h_img/2)
center_x = int(w_img/2)
top_y = center_y - (int(h_logo/2)) 
left_x = center_x - (int(w_logo/2)) 
bottom_y = top_y + h_logo
right_x = left_x + w_logo

roi = img[top_y:bottom_y,left_x:right_x]
result = cv2.addWeighted(roi,1,logo_final,1,0)
img[top_y:bottom_y,left_x:right_x] = result
cv2.imwrite('sample.jpg',img)

person muzammil javed    schedule 16.08.2020    source источник
comment
В чем вопрос? Пожалуйста, отредактируйте свой пост, чтобы четко указать, о чем вы спрашиваете.   -  person Cris Luengo    schedule 16.08.2020
comment
@КрисЛуенго хорошо   -  person muzammil javed    schedule 16.08.2020
comment
Когда вы помещаете черный текст из логотипа почти на черный цвет фонового изображения, черный текст не отображается. Что вы ожидаете от него?   -  person fmw42    schedule 16.08.2020
comment
@ fmw42 этот логотип предоставлен клиентом.   -  person muzammil javed    schedule 16.08.2020
comment
Уменьшите логотип и поместите его в один из углов белой области.   -  person fmw42    schedule 16.08.2020
comment
Клиент @fmw42 хочет, чтобы логотип был в центре изображения.   -  person muzammil javed    schedule 17.08.2020
comment
Единственный способ, которым я могу помочь, - это увеличить яркость фонового изображения. Если логотип черный, а изображение черное, черный цвет в логотипе будет нечитаемым. Альтернативой является изменение логотипа вашим клиентом.   -  person fmw42    schedule 17.08.2020
comment
@ fmw42 fmw42 вы правы, я пробовал несколько способов и потерпел неудачу. Я попросил своего клиента изменить логотип на давайте посмотрим.   -  person muzammil javed    schedule 18.08.2020


Ответы (1)


Для того, чтобы убрать фон с логотипа. Нам нужно использовать маскировку. Маскировка для переднего плана и другая маскировка для фона.

logo = cv2.imread("water2.png", -1)
logo_mask = logo[:,:,3]
logo_mask_inv = cv2.bitwise_not(logo_mask)
logo = logo[:,:,0:3]

logo_background = cv2.bitwise_and(roi, roi, mask=logo_mask_inv)
logo_foreground = cv2.bitwise_and(logo, logo, mask=logo_mask)
final_logo = cv2.add(logo_background, logo_foreground)
person dannyyyz    schedule 16.08.2020
comment
Этот код работает так же, как мой код. Получил такие же результаты - person muzammil javed; 17.08.2020