如何在图像上叠加蒙版以及如何保留与蒙版值相对应的2D点?

时间:2019-02-07 19:41:56

标签: python image opencv image-processing computer-vision

我是python图像处理的新手,不胜感激有关2个问题的一些建议。

我有一张图像:image及其遮罩:enter image description here

并按如下所示打开它:

import cv2
import matplotlib.pyplot as plt

mask = cv2.imread('img_mask.jpg')
img = cv2.imread('img.jpg')

1)我有以下(x,y)像素位置:

pt1 = 43.35, 22.49
pt2 = 49.035, 46.985
pt3 = 18.326, 21.822

在蒙版上,pt1pt2的像素值为0,在pt3的像素值为16。给定三个(x,y)像素位置作为列表以及所提供的蒙版。如何有效地过滤遮罩上值为0的位置?

2)如何有效地创建一个新的thresholded masked image,然后将其覆盖在原始图像上,使得thresholded mask image是一幅图像,其中蒙版的像素值仅为16原始蒙版中值为16的位置。

1 个答案:

答案 0 :(得分:0)

对于第一部分,我不知道为什么你的点不是整数。我在问题中下载了遮罩,此代码可用于打印像素值= 0的线对。我读了灰度格式的蒙版。

img = cv2.imread('mask.jpg',0)
for i in range(0,img.shape[0]):
    for j in range(0,img.shape[1]):
        if img[i,j] == 0:
            print(i,j)

对于第二部分,可以使用常规阈值。有关thresholding的更多信息,请参考opencv文档。我将图像放大了4倍,以获得更好的视图。然后,创建两个阈值分别为16和17的阈值,并对它们进行按位异或运算以获得结果。

zoom = cv2.resize(img, None, fx = 4, fy = 4, interpolation = cv2.INTER_CUBIC)
ret,thresh1 = cv2.threshold(zoom, 16, 255, cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(zoom, 17, 255, cv2.THRESH_BINARY)
output = cv2.bitwise_xor(thresh1, thresh2)
cv2.imshow('threshold with 16', thresh1)
cv2.imshow('threshold with more than 16', thresh2)
cv2.imshow('result', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

mask with threshold as 16

阈值1

mask with threshold as 17

阈值2

mask with only pixels=16

输出