Opencv変換色空間変更画像背景

3356 ワード

考え方:1、BGRをHSV色空間に変換する2、マスクを設置する3、ビット演算
ここでは、モトローラのロゴの背景を変更する例として、画像は必ず画像を検索して、具体的なコードは以下の通りです.
import numpy as np
import cv2
from imageio import imread
import matplotlib.pyplot as plt

def show(img,winname = "img"):
    cv2.namedWindow(winname,cv2.WINDOW_GUI_NORMAL)
    cv2.imshow(winname,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

imgpath = r'motorola.jpg'

img = imread(imgpath)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
if img.shape == 4:
    img = img[:,:,:3]

show(img)
print(img.shape)

bgd = np.ones(img.shape,dtype=np.uint8)
bgd[:,:,:] = 255    #       
show(bgd,"white")
#       
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# show(hsv)
#       ,  inRange  
# lowergreen = np.array([35,43,46],dtype = np.uint8)
# uppergreen = np.array([77,255,255],dtype=np.uint8)
# maskgreen = cv2.inRange(hsv,lowergreen,uppergreen)
# show(maskgreen)

#       ,  inRange  
lowerblue = np.array([100,43,46],dtype = np.uint8)
upperblue = np.array([124,255,255],dtype=np.uint8)
maskblue = cv2.inRange(hsv, lowerblue, upperblue)
maskblue_inv = cv2.bitwise_not(maskblue)
show(maskblue,'maskblue')
show(maskblue_inv,'maskblue_inv')
#     
kernel_erode = np.ones((3,3),dtype = np.uint8)
erode = cv2.erode(maskblue,kernel_erode)

#     
kernel_dilate = np.ones((5,5),np.uint8)
dilate = cv2.dilate(erode, kernel = kernel_dilate)

show(erode,'erode')

#             
fg = cv2.bitwise_and(img,img,mask = maskblue)
show(fg,'fg')
#            
bg = cv2.bitwise_and(bgd,bgd,mask = maskblue_inv)
show(bg,'bg')
#          
dst = cv2.add(bg,fg)
show(dst,'dst')


参照リンク:https://blog.csdn.net/wanggsx918/article/details/23272669