def erase_specular(image,lower_threshold=0.0, upper_threshold=150.0):
"""erase_specular: removes specular reflections
within given threshold using a binary mask (hi_mask)
"""
thresh = cv2.inRange(image,
np.asarray(float(lower_threshold)),
np.asarray(256.0))
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
hi_mask = cv2.dilate(thresh, kernel, iterations=2)
specular = cv2.inpaint(image, hi_mask, 2, flags=cv2.INPAINT_TELEA)
# return cv2.max(hi_mask,image)
return specular
python类inpaint()的实例源码
def inpaint(self, win_size=3, rescale_factor=1.0):
""" Fills in the zero pixels in the image.
Parameters
----------
win_size : int
size of window to use for inpainting
rescale_factor : float
amount to rescale the image for inpainting, smaller numbers increase speed
Returns
-------
:obj:`ColorImage`
color image with zero pixels filled in
"""
# resize the image
resized_data = self.resize(rescale_factor, interp='nearest').data
# inpaint smaller image
mask = 1 * (np.sum(resized_data, axis=2) == 0)
inpainted_data = cv2.inpaint(resized_data, mask.astype(np.uint8),
win_size, cv2.INPAINT_TELEA)
inpainted_im = ColorImage(inpainted_data, frame=self.frame)
# fill in zero pixels with inpainted and resized image
filled_data = inpainted_im.resize(
1.0 / rescale_factor, interp='bilinear').data
new_data = self.data
new_data[self.data == 0] = filled_data[self.data == 0]
return ColorImage(new_data, frame=self.frame)
def inpaint(self, rescale_factor=1.0):
""" Fills in the zero pixels in the image.
Parameters
----------
rescale_factor : float
amount to rescale the image for inpainting, smaller numbers increase speed
Returns
-------
:obj:`DepthImage`
depth image with zero pixels filled in
"""
# form inpaint kernel
inpaint_kernel = np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1]])
# resize the image
resized_data = self.resize(rescale_factor, interp='nearest').data
# inpaint the smaller image
cur_data = resized_data.copy()
zeros = (cur_data == 0)
while np.any(zeros):
neighbors = ssg.convolve2d((cur_data != 0), inpaint_kernel,
mode='same', boundary='symm')
avg_depth = ssg.convolve2d(cur_data, inpaint_kernel,
mode='same', boundary='symm')
avg_depth[neighbors > 0] = avg_depth[neighbors > 0] / \
neighbors[neighbors > 0]
avg_depth[neighbors == 0] = 0
avg_depth[resized_data > 0] = resized_data[resized_data > 0]
cur_data = avg_depth
zeros = (cur_data == 0)
# fill in zero pixels with inpainted and resized image
inpainted_im = DepthImage(cur_data, frame=self.frame)
filled_data = inpainted_im.resize(
1.0 / rescale_factor, interp='bilinear').data
new_data = np.copy(self.data)
new_data[self.data == 0] = filled_data[self.data == 0]
return DepthImage(new_data, frame=self.frame)
def remove_crosshair(images, crosshair_mask):
result = []
mask = cv2.imread(crosshair_mask)
mask = cv2.split(mask)[0]
for i, img in enumerate(images):
result.append(cv2.inpaint(img, mask, 6, cv2.INPAINT_NS))
return result