步骤2:用于可视化从输入中获取的分割图像的功能。def run_visualization():
"""Inferences DeepLab model and visualizes result."""
try:
original_im = Image.open(IMAGE_NAME)
except IOError:
print('Cannot retrieve image. Please check url: ' + url)
returnprint('running deeplab on image')
resized_im, seg_map = MODEL.run(original_im)
vis_segmentation(resized_im, seg_map)
return resized_im, seg_map
2.1:使用前面显示的图像调用上述功能。IMAGE_NAME = 'download2.jpg'
resized_im, seg_map = run_visualization()
分割后输出。
2.2:现在,我们读取输入图像并将其转换为numpy数组。print(type(resized_im))
numpy_image = np.array(resized_im)
步骤3:分离背景和前景。在此步骤中,我们创建图像的副本,然后,通过将背景中的值替换为0,并在已创建蒙版的位置保留255,将背景和前景与分割后的图像分开,此处7表示汽车类别。person_not_person_mapping = deepcopy(numpy_image)
person_not_person_mapping[seg_map != 7] = 0
person_not_person_mapping[seg_map == 7] = 255
3.1:可视化分离的蒙版图像plt.imshow(person_not_person_mapping)
正如上一步中所述,背景已被黑色替换,汽车蒙版已变为白色,同样,通过替换这些值,我们也没有丢失任何重要信息。
3.2:调整蒙版图像的大小使其等于原始图像。在分割过程之后,图像的大小减小了,在我们的例子中,图像的大小减小为(300 x 500),因此我们将图像的大小调整为原始大小,即(900 x 596)。orig_imginal = Image.open(IMAGE_NAME)
orig_imginal = np.array(orig_imginal)mapping_resized = cv2.resize(person_not_person_mapping,
(orig_imginal.shape[1],
orig_imginal.shape[0]),
Image.ANTIALIAS)
mapping_resized.shape
3.3:二值化由于调整了大小,图像生成的值在0,1,2…255之间,为了再次将值限制在0–255之间,我们必须使用Otsu的Binarization技术对图像进行二值化。简而言之,Otsu的Binarization是一种寻找灰度图像阈值的自适应方法,它遍历0-255范围内的所有可能阈值,并找到给定图像的最佳可能阈值。在内部,它基于一些统计概念(例如方差),以根据所选阈值找出类别。一旦选择了最佳阈值,则大于阈值的像素值将被视为白色像素,小于阈值的像素值将被视为黑色像素。
gray = cv2.cvtColor(mapping_resized, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray,(15,15),0)
ret3,thresholded_img = cv2.threshold(blurred,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
plt.imshow(thresholded_img)