2 回答

TA貢獻1858條經驗 獲得超8個贊
加載庫并讀取圖像
from __future__ import division
import cv2
import numpy as np
guy_img = cv2.imread('path')
target_img = cv2.imread('path')
獲取男人(每個非零像素)和目標蒙版(粉紅色區域)的邊界框。
a = np.where(guy_img > 0)
b = np.where(target_img == 129) # picked one of the channels in your image
bbox_guy = np.min(a[0]), np.max(a[0]), np.min(a[1]), np.max(a[1])
bbox_mask = np.min(b[0]), np.max(b[0]), np.min(b[1]), np.max(b[1])
請注意,當我加載目標圖像時,值與您提供的值不同。圖像邊緣也有一些白色像素。這可能只是因為圖像被上傳到 imgur 并被下載。如果您的值是正確的,并且除了粉紅色區域之外,您的圖像的其余部分都是完全黑色的,您可以像使用np.where(target_img > 0).
現在只獲取 Guy 和 mask 區域的值
guy = guy_img[bbox_guy[0]:bbox_guy[1], bbox_guy[2]:bbox_guy[3],:]
target = target_img[bbox_mask[0]:bbox_mask[1], bbox_mask[2]:bbox_mask[3],:]
將人調整為與面具相同的比例/形狀
guy_h, guy_w, _ = guy.shape
mask_h, mask_w, _ = target.shape
fy = mask_h / guy_h
fx = mask_w / guy_w
scaled_guy = cv2.resize(guy, (0,0), fx=fx,fy=fy)
使用男人圖像值重新分配目標圖像的遮罩區域
for i, row in enumerate(range(bbox_mask[0], bbox_mask[1])):
for j, col in enumerate(range(bbox_mask[2], bbox_mask[3])):
target_img[row,col,:] = scaled_guy[i,j,:]
cv2.imshow('', target_img)
cv2.waitKey(0)

TA貢獻1802條經驗 獲得超10個贊
首先,在繼續實施之前,您需要考慮幾件事。
蒙版圖像的背景一致嗎?蒙面斑點的顏色一致?
蒙版的大小和要添加圖像的對象。
我建議您首先在粉紅色分割圖像上找到 ROI 的大小、顏色和位置。根據遮罩圖像縮放對象(男孩圖像)的尺寸,因此更容易將對象圖像遮罩到粉紅色部分。
然后,您可以創建一個尺寸類似于蒙版圖像的圖像(我們稱之為第一步圖像)。將縮放的對象圖像添加到從粉紅色斑點分析獲得的位置。這樣,您將擁有兩個具有相似尺寸和相似比例的圖像。
使用第一步圖像和粉紅色 ROI 應該很容易在視覺上重疊。
如果您想要精確的粉紅色,那么如果蒙版圖像上的相同位置像素為黑色,則將第一步圖像上的所有像素替換為黑色像素。否則就讓它成為它本來的樣子。
if(mask[i][j] == black){ step_one[i][j] = black }
這使得粉紅色部分被對象圖像掩蓋了。
添加回答
舉報