用未分割部分替换图像的分割部分
我想用Python中的OpenCV把一张图片的某个分割部分替换成它的未分割部分。看下面的图片,你就能明白我说的是什么。
这是第一张图片,分割之前的样子:
这是分割之后的图片:
这是第三张图片,做完我想做的事情后的效果:
我该怎么做呢?谢谢你的帮助!
2 个回答
1
简单来说,你有一个分割掩码和一张图片。你需要做的就是把图片中和掩码中对应的像素复制过来。一般情况下,掩码的尺寸和图片的尺寸是一样的(如果不一样,你需要把掩码调整到和图片一样的尺寸)。而且,特定掩码对应的分割像素会有相同的整数值(比如1、2、3等等,背景像素的值是0)。所以,你要找出哪些像素坐标的值和掩码的值相对应,然后用这些坐标去查找图片中的亮度值。如果你知道怎么访问像素坐标,如何在你使用的编程环境中读取图片,按照上面说的步骤去做,你就能完成这个任务。
2
其实这很简单。你只需要在分割后拍一张你的图片,然后用一个遮罩去乘这个图片。这个遮罩的规则是:遮罩里像素值为0的地方变成1,其他地方变成0。
这样做的结果就是,除了遮罩里值为1的像素,其他的像素都会变成黑色。通过把你图片里的每个像素和遮罩相乘,你就能得到你在图中展示的效果,只不过背景是黑色的。接下来,你只需要找出遮罩里哪些地方是白色的,然后把输出图片中对应的位置设置为白色。换句话说:
import cv2
# Load in your original image
originalImg = cv2.imread('Inu8B.jpg',0)
# Load in your mask
mask = cv2.imread('2XAwj.jpg', 0)
# Get rid of quantization artifacts
mask[mask < 128] = 0
mask[mask > 128] = 1
# Create output image
outputImg = originalImg * (mask == 0)
outputImg[mask == 1] = 255
# Display image
cv2.imshow('Output Image', outputImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
请注意,我是从你的帖子里下载了图片,然后从我的电脑加载的。另外,你的遮罩因为JPEG压缩有一些量化伪影,所以我把阈值设定为128,以确保你的图片里只有0和1。
这是我得到的输出:
希望这对你有帮助!