I am trying to do OCR text detection with an image that has low contrast.
Raw:

I am currently using this approach: use these filters for the preprocess:
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
img_output = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
img = img.filter(ImageFilter.GaussianBlur)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh, im_bw = cv2.threshold(img, 210, 230, cv2.THRESH_BINARY)
data = Image.fromarray(im_bw)
After pre-processing, this is what I get

How can I improve my approach?
Your input image is heavily noised with salt-pepper like noise (see) therefore you should use median blurring instead of gaussian.Also it has varying light levels throughout the image therefore you should use adaptive thresholding to minimize the effect of varying light. Furthermore, because image is heavily noised when you apply histogram equalization it also amplifies the noise.
I divided your image into 3 horizontal pieces and filter them with
Otsu Thresholdingthen combined again. Let me show you the effect of Gaussian Blur, Median Blur and Histogram Equalization with filtered images.This is original image:
This is Gaussian Blurred and Thresholded:
This is Median Blurred and Thresholded:
As you can see Median Blur is more suited to your image because it has salt-peper like noise throughout the whole image.
Now lets look at the effect of equalization on a hevily noised image. This is the YUV equalized image:
This is the Gaussian Blurred version:
This is the Median Blurred version:
So you can achieve the best result using the original image without the equalization and with median blurring. You can also use morphological operations to further improve the image.
This is the code i used: