Going off of @corey979 's comment. 
A slightly more rigorous way to fix your problem with corey's answer is to use the `standard deviation`, as opposed to the arbitrary rounding of `1`.

        Length /@ 
     DeleteDuplicates /@ {Round[#, 
          StandardDeviation[pts][[1]]/35] & /@ 
        Transpose[
          pts][[1]], (Round[#, 
           StandardDeviation[pts][[2]]/36] & /@ 
         Transpose[pts][[2]])}

Note that the `35` is arbitrary, and you should modify it to whatever works best for you. 

Also, this works for `pts*100`

P.S. A prettier version of the code doesn't give the correct answer, unfortunately

    Length /@ 
     DeleteDuplicates /@ (Round[#, StandardDeviation[#]/35] & /@ 
        Transpose[pts])