A computer-implemented method of colorizing a three-dimensional point cloud, the method comprising: receiving the 3D point cloud, the 3D point cloud acquired by a 3D imaging device positioned at a first location and including 3D coordinates and intensity data for a set of points representing surfaces of one or more objects; receiving a two-dimensional color image of the one or more objects acquired by a camera (410, 610) positioned at an approximately known second location and an approximately known orientation, the camera having an approximately known set of intrinsic optical parameters; creating a 2D intensity image of the 3D point cloud using the intensity data by projecting the 3D point cloud onto a 2D image area from a view point of the second location based on the set of intrinsic optical parameters, the second location, and the orientation of the camera, the 2D image area having a size that is same as a size of the 2D color image; generating a set of refined camera parameters for projecting the 3D point cloud onto the 2D image area by matching the 2D intensity image and the 2D color image; creating a depth buffer for the 3D point cloud, the depth buffer having an image area of a size that is same as the size of the 2D color image and a pixel size that is same as a pixel size of the 2D color image, the depth buffer including depth data for the set of points in the 3D point cloud as the set of points are projected onto pixels of the depth buffer using the set of refined camera parameters; determining a foreground depth for each respective pixel of the depth buffer by detecting a closest point among a subset of the set of points corresponding to the respective pixel; and coloring the point cloud by, for each respective point of the set of points: comparing a depth of the respective point with a foreground depth of a corresponding pixel in the depth buffer; upon determining that the depth of the respective point is within a predetermined threshold value from the foreground depth of the corresponding pixel, assigning a color of a corresponding pixel in the 2D color image to the respective point; and upon determining that the depth of the respective point differs from the foreground depth of the corresponding pixel by an amount greater than the predetermined threshold value, not assigning any color to the respective point. receiving the 3D point cloud, the 3D point cloud acquired by a 3D imaging device positioned at a first location and including 3D coordinates and intensity data for a set of points representing surfaces of one or more objects; receiving a two-dimensional color image of the one or more objects acquired by a camera (410, 610) positioned at an approximately known second location and an approximately known orientation, the camera having an approximately known set of intrinsic optical parameters; creating a 2D intensity image of the 3D point cloud using the intensity data by projecting the 3D point cloud onto a 2D image area from a view point of the second location based on the set of intrinsic optical parameters, the second location, and the orientation of the camera, the 2D image area having a size that is same as a size of the 2D color image; generating a set of refined camera parameters for projecting the 3D point cloud onto the 2D image area by matching the 2D intensity image and the 2D color image; creating a depth buffer for the 3D point cloud, the depth buffer having an image area of a size that is same as the size of the 2D color image and a pixel size that is same as a pixel size of the 2D color image, the depth buffer including depth data for the set of points in the 3D point cloud as the set of points are projected onto pixels of the depth buffer using the set of refined camera parameters; determining a foreground depth for each respective pixel of the depth buffer by detecting a closest point among a subset of the set of points corresponding to the respective pixel; and coloring the point cloud by, for each respective point of the set of points: comparing a depth of the respective point with a foreground depth of a corresponding pixel in the depth buffer; upon determining that the depth of the respective point is within a predetermined threshold value from the foreground depth of the corresponding pixel, assigning a color of a corresponding pixel in the 2D color image to the respective point; and upon determining that the depth of the respective point differs from the foreground depth of the corresponding pixel by an amount greater than the predetermined threshold value, not assigning any color to the respective point. comparing a depth of the respective point with a foreground depth of a corresponding pixel in the depth buffer; upon determining that the depth of the respective point is within a predetermined threshold value from the foreground depth of the corresponding pixel, assigning a color of a corresponding pixel in the 2D color image to the respective point; and upon determining that the depth of the respective point differs from the foreground depth of the corresponding pixel by an amount greater than the predetermined threshold value, not assigning any color to the respective point.