Ich möchte im Voraus sagen, dass es nicht Niblack-Algorithmus ist, sondern eine Implementierung, die besseres Ergebnis gibt. Ich weiß nicht, wo diese Implementierung fehlschlägt, aber ich habe versucht, das obige Bild zu binarisieren und das Ergebnis ist wie folgt.

teilte ich das Bild in 25 * 25 Pixel-Block und verwendet dann einen globalen Satz Mittelwert von 90 und globalen Satz Mittelwert von 20. Und dann Otsu des Digitalisierungs auf kleine Fenster angewendet.
set_mean = 90
set_sd = 20
mean_block = np.mean(block)
sd_block = np.std(block)
if sd_block > set_sd:
ret, block = cv2.threshold(block, 0, 255, cv2.THRESH_OTSU)
elif sd_block < set_sd:
if mean_block > set_mean:
block[:] = 255 #white
else:
block[:] = 0 #black
return block
Wenn die Standardabweichung des kleinen Fensters (SD) größer ist als der Satz ein, dann otsu die Schwellwertbildung verwendet wird, sonst basierend auf, ob der Mittelwert größer oder kleiner als Satz bedeuten, werden die Pixel in dem Fenster gesetzt um schwarz oder weiß zu vervollständigen.
Sind Sie sicher über das Bild für lokale Std? Ich habe versucht, meine eigene Implementierung in Java mit dem von Ihnen bereitgestellten Graustufenbild zu testen, und die Ergebnisse sind ziemlich unterschiedlich. Es sieht so aus, als ob unser Standard der gleiche ist wie der Mittelwert? – user2700896