I have a large point cloud (LAS file) and I am trying to thin this using a complex technique. I know it is possible to thin a point cloud using simple techniques such as extracting every nth point. However the point cloud I am working with is more dense in some areas and less dense in other areas. I would like to be able to thin the cloud so that the denser areas are thinned more heavily than the less dense areas. To do this manually one could create a grid and select certain number of points within each cell. (ie one at each corner and one in the center) However this point cloud is much too large for this task. I am trying to figure out if there are any existing solutions to this problem such as a complex selection query, other automated process, or existing software application that could be used.
It sounds like you want either a voxel-based thinning or maybe a Poisson-based one. PDAL can do either. See PDAL's tutorial on the topic at https://pdal.io/tutorial/sampling/index.html
As far as the size of the file, please define "large". Just about any technique except simple rank decimation (remove n-th points) is going to want to have access to the entire file in memory. Other options would require a more sophisticated two-stage index+sampling technique to avoid that requirement.
You can give lasthin or lasduplicate from LAStools a try. With lasthin you can keep the '-lowest', '-highest', '-random', or most '-central' point on a 2D grid in the x/y plane with user-defined '-step 0.5' size. With lasduplicate you can specify to remove all points that are '-nearby 0.005' in 3D from all previously appearing points. See the linked README file for more details.
You can use FUSION's
ThinData command for this (Documentation p.130).
ThinData is really handy because it allows you to thin point cloud data to a desired pulse density per square unit. From FUSION's documentation:
ThinData [switches] OutputFile Density CellSize DataFile
ThinData allows you to thin LIDAR data to specific pulse densities. This capability is useful when comparing analysis results from several LIDAR acquisitions that were collected using different pulse densities. ThinData is also useful when the density within a single LIDAR data set is not uniform. This is often the case with data collected from a slow-flying helicopter or when flightline overlap was not closely monitored. ThinData has also been used in simulation experiments to assess the effect of LIDAR pulse density on the accuracy of estimated forest inventory metrics such as overall tree height.
You can use LiDAR360, download the 30 days free trial version from GreenValley International website. LiDAR360 offers three methods for subsampling: minimum point spacing, sampling rate, and octree. Minimum point spacing method needs to set a minimum point spacing between two points so that the minimum three-dimensional distance between any two points in the sampled point cloud will not be less than this value. Sampling rate method needs to set the percentage of reserved points. In this mode, LiDAR360 will randomly retain the specified number of points. Reserved Points = Total Number of Points * Sample Rate. Octree method allows users to select an "octree" subdivision level and build 3D voxels for the input point cloud. Only the point closest to each voxel center will be retained.