Removing noisy lines from image - opencv - python I want to process different type of  image to extract actual text from noisy image .I am using open cv to do this job it is working fine but the problem is I need to set different lower threshold to convert noisy image to readable text.Is it possible to set single threshold which removes noise from all images by doing some pre processing ?

Main goal : I am trying to remove that wavy horizontal line and make the character clear to read

Code used:

import cv2

# Load an color image in grayscale
img = cv2.imread('it_captcha3.jpg',0)
ret, thresh_img = cv2.threshold(img, 180, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('grey image',thresh_img)
cv2.imwrite("result11.jpg", thresh_img)
cv2.waitKey(0)
cv2.destroyAllWindows()


Captcha1 : 

  

Processed image : threshold used -> low: 180 high ->255,



CAPTCHA : 2



PROCESSED IMAGE: threshold used -> low: 200 high ->255



captcha : 3



processed : low -> 165 high : 255
first of all remember that there is no single solution for all kind of noise and all kind of images. that being said i can think of two solution.
first is using Otsu thresholding:

ret,thresh_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)


this will try to guess a good threshold for the image being used.

the other solution would be using "close" morphology transform after thresholding. it will first dilate and then erode the image and using a good kernel( it is also called structuring element ) you can remove the line(although you may remove some of the useful pixels too!!)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4,8))
morph_img = cv2.morphologyEx(thresh_img, cv2.MORPH_CLOSE, kernel)




above is the result of using both otsu threshold and morphology close