<p>您可以使用稍微复杂一点的方法,通过在频域而不是空间域中进行滤波来找到解决方案。阈值可能需要一些调整,具体取决于tesseract对输出图像的执行情况</p>
<p><strong>实施:</strong></p>
<pre><code>import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('C:\\Test\\number.jpg', cv2.IMREAD_GRAYSCALE)
# Perform 2D FFT
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))
# Squash all of the frequency magnitudes above a threshold
for idx, x in np.ndenumerate(magnitude_spectrum):
if x > 195:
fshift[idx] = 0
# Inverse FFT back into the real-spatial-domain
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.real(img_back)
img_back = cv2.normalize(img_back, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
out_img = np.copy(img)
# Use the inverted FFT image to keep only the black values below a threshold
for idx, x in np.ndenumerate(img_back):
if x < 100:
out_img[idx] = 0
else:
out_img[idx] = 255
plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(img_back, cmap = 'gray')
plt.title('Reversed FFT'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(out_img, cmap = 'gray')
plt.title('Output'), plt.xticks([]), plt.yticks([])
plt.show()
</code></pre>
<p><strong>输出:</strong></p>
<p><a href="https://i.stack.imgur.com/58SJe.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/58SJe.png" alt="output"/></a></p>
<p><strong>中值模糊实现:</strong></p>
<pre><code>import cv2
import numpy as np
img = cv2.imread('C:\\Test\\number.jpg', cv2.IMREAD_GRAYSCALE)
blur = cv2.medianBlur(img, 3)
for idx, x in np.ndenumerate(blur):
if x < 20:
blur[idx] = 0
cv2.imshow("Test", blur)
cv2.waitKey()
</code></pre>
<p><strong>输出:</strong></p>
<p><a href="https://i.stack.imgur.com/BSZie.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/BSZie.png" alt="enter image description here"/></a></p>
<p><strong>最终编辑:</strong></p>
<p>因此,使用Eumel的解决方案,并在其底部结合这段代码,可获得100%的成功结果:</p>
<pre><code>img[pat_thresh_1==1] = 255
img[pat_thresh_15==1] = 255
img[pat_thresh_2==1] = 255
img[pat_thresh_25==1] = 255
img[pat_thresh_3==1] = 255
img[pat_thresh_35==1] = 255
img[pat_thresh_4==1] = 255
# Eumel's code above this line
img = cv2.erode(img, np.ones((3,3)))
cv2.imwrite("out.png", img)
cv2.imshow("Test", img)
print(pytesseract.image_to_string(Image.open("out.png"), lang='eng', config=' psm 10 oem 3 -c tessedit_char_whitelist=0123456789.,'))
</code></pre>
<p><strong>输出图像示例:</strong></p>
<p><a href="https://i.stack.imgur.com/Diu7F.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Diu7F.png" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/RRAEh.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/RRAEh.png" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/ULbs8.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ULbs8.png" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/jpFyI.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/jpFyI.png" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/4XJ7v.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/4XJ7v.png" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/lviqm.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/lviqm.png" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/RoATt.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/RoATt.png" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/KDwPW.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/KDwPW.png" alt="enter image description here"/></a></p>
<p>将tesseract字符列入白名单似乎对防止错误识别也有很大帮助</p>