blur.py
import halide as hl
import numpy as np
from scipy.misc import imread, imsave
import os.path
def get_blur(input):
assert type(input) == hl.ImageParam
assert input.dimensions() == 2
x, y = hl.Var("x"), hl.Var("y")
clamped_input = hl.BoundaryConditions.repeat_edge(input)
input_uint16 = hl.Func("input_uint16")
input_uint16[x,y] = hl.u16(clamped_input[x,y])
ci = input_uint16
blur_x = hl.Func("blur_x")
blur_y = hl.Func("blur_y")
blur_x[x,y] = (ci[x,y]+ci[x+1,y]+ci[x+2,y])/3
blur_y[x,y] = hl.cast(hl.UInt(8), (blur_x[x,y]+blur_x[x,y+1]+blur_x[x,y+2])/3)
# schedule
xi, yi = hl.Var("xi"), hl.Var("yi")
blur_y.tile(x, y, xi, yi, 8, 4).parallel(y).vectorize(xi, 8)
blur_x.compute_at(blur_y, x).vectorize(x, 8)
return blur_y
def get_input_data():
image_path = os.path.join(os.path.dirname(__file__), "../../apps/images/rgb.png")
assert os.path.exists(image_path), \
"Could not find %s" % image_path
rgb_data = imread(image_path)
print("rgb_data", type(rgb_data), rgb_data.shape, rgb_data.dtype)
grey_data = np.mean(rgb_data, axis=2, dtype=np.float32).astype(rgb_data.dtype)
input_data = np.copy(grey_data, order="F")
return input_data
def main():
# define and compile the function
input = hl.ImageParam(hl.UInt(8), 2, "input_param")
blur = get_blur(input)
blur.compile_jit()
# preparing input and output memory buffers (numpy ndarrays)
input_data = get_input_data()
input_image = hl.Buffer(input_data)
input.set(input_image)
output_data = np.empty(input_data.shape, dtype=input_data.dtype, order="F")
output_image = hl.Buffer(output_data)
print("input_image", input_image)
print("output_image", output_image)
# do the actual computation
blur.realize(output_image)
# save results
input_path = "blur_input.png"
output_path = "blur_result.png"
imsave(input_path, input_data)
imsave(output_path, output_data)
print("\nblur realized on output image.",
"Result saved at", output_path,
"( input data copy at", input_path, ")")
print("\nEnd of game. Have a nice day!")
return
if __name__ == "__main__":
main()