朋友们!有两个输入图像。一个背景图像,另一个蒙版图像。我需要得到面具的彩色部分。
我需要得到的:背景,面具,结果图像
但我得到的东西……
如果Python可以激发你的灵感,那么Python的结果也是如此:
import cv2 import numpy as np # Read files img1 = cv2.imread("All1.jpg",cv2.IMREAD_COLOR); img = cv2.imread("OriginalMask.jpg",cv2.IMREAD_GRAYSCALE) # loading in grayscale # Threshold and MedianBlur mask _, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) # corrected to 127 instead of 0 img = cv2.medianBlur(img, 13) # fill with white dest= np.full(np.shape(img1),255,np.uint8) # Assuming dst and src are of same sizes # only copy values where the mask has color > 0 dest[img>0] = img1[img>0] # after @T.Kau's suggestion cv2.imshow('dest',dest) cv2.waitKey(0) cv2.destroyAllWindows()
只是为了添加一个小细节 HanseHirse 的答案:
如果你为面具添加高斯模糊(正如你在问题中所做的那样) CvInvoke.MedianBlur(img, img, 13); )当放置在另一个图像的顶部时,遮罩的边缘将更平滑并且输出图像看起来更好。
CvInvoke.MedianBlur(img, img, 13);
您只需将输出图像的第四个通道直接设置为模糊蒙版即可。
而不是
if (mask.at<uint8_t>(y, x) != 0) resultTransparent.at<cv::Vec4b>(y, x)[3] = 0; else resultTransparent.at<cv::Vec4b>(y, x)[3] = 255;
你可以试试
resultTransparent.at<cv::Vec4b>(y, x)[3] = mask.at<uint8_t>(y, x);