What kind of denoising must follow locally adaptive binarization? I am experimenting with local (adaptive) grey threshold for the binarization of B&amp;W photographs of yellowed manuscripts:



I got adaptive thresholding working in both scikit-image and cv2. In both cases (grey &lt; threshold_niblack() in scikit-image and cv.adaptiveThreshold() in cv2 -- all Python) the result I get is successfully binarized, with the background pretty much uniform -- and completely full of noise:



What kind of step do I now need to separate the text from this background noise?
Besides the suggestions in comments, I would suggest a high pass filtering to get rid of the low frequency noise, before running your local thresholding. Here an example with GIMP, that you can probably easily reproduce with opencv as well.