After you apply the RescaleSlope and RescaleIntercept, make sure that the output data type is signed, because CT values are signed. Usually they range from -1000 to around +3000.
If you do not do this, but instead use unsigned values and clamp all negative values to zero, then the result will look like your first image above.
If you are using vtkImageShiftScale, use SetOutputScalarTypeToShort() or even SetOutputScalarTypeToFloat().