因为最近在做交互式图像分割方面的东西,当用户去点击图片上的某一点时,即标注点,要计算该图像上所有的像素点到这个点的距离,作为后续步骤的预处理。
scipy.ndimage.distance_transform_edt
一、导入所需的库和读取图片,并生成和图片同样大小的1矩阵:
import os
import numpy as np
import cv2
from scipy import ndimage
src_pic_path = '/home/wanwanvv/workspace/osvos/car-shadow/JPEGImages/00000.jpg'
input_image = cv2.imread(src_pic_path, -1) #-1表示加载彩色图片包括alpha通道
iH, iW, _ = input_image.shape
int_pos = np.uint8(255*np.ones([iH,iW]))
二、将整个矩阵值赋值为0,中心点的值设为1,这里假设中心点是[0,0]:
clk_pos = (int_pos==0)
clk_pos[0,0] = 1
此时的矩阵变为:
[[ True False False ... False False False]
[False False False ... False False False]
[False False False ... False False False]
...
[False False False ... False False False]
[False False False ... False False False]
[False False False ... False False False]]
三、运用函数ndimage.distance_transform_edt:
int_pos = ndimage.distance_transform_edt(1-clk_pos)
结果为:
[[ 0. 1. 2. ... 851. 852. 853. ]
[ 1. 1.41421356 2.23606798 ... 851.00058754 852.00058685 853.00058617]
[ 2. 2.23606798 2.82842712 ... 851.00235017 852.00234741 853.00234466]
...
[477. 477.00104822 477.00419285 ... 975.56650209 976.43893818 977.31161868]
[478. 478.00104602 478.00418408 ... 976.05583857 976.92783766 977.80008182]
[479. 479.00104384 479.00417535 ... 976.54595386 977.4175157 978.28932326]]
四、将值的范围控制到[0,255]:
int_pos = np.uint8(np.minimum(np.maximum(int_pos, 0.0), 255.0))
结果:
[[ 0 1 2 ... 255 255 255]
[ 1 1 2 ... 255 255 255]
[ 2 2 2 ... 255 255 255]
...
[255 255 255 ... 255 255 255]
[255 255 255 ... 255 255 255]
[255 255 255 ... 255 255 255]]
五、可视化距离并保存为图片查看:
cv2.imwrite('xx.png' % (xx), int_pos)
结果: