<p>当matlab和opencv似乎都使用相同的算法时,它们之间的差别有多大,我感到惊讶。为什么要运行<code>imbinarize</code>两次?sensitivity关键字的实际作用是什么(从数学上讲,在后台)。因为它们显然比光秃秃的大冢还要多出好几步。在</p>
<pre><code>import cv2
import numpy as np
import matplotlib.pyplot as plt
def show(img):
plt.imshow(img, cmap="gray")
plt.show()
img = cv2.imread("letters.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3,3), np.uint8)
blur = cv2.GaussianBlur(img,(3,3), 0)
erosion = cv2.erode(blur, kernel, iterations=3)
opening = cv2.dilate(erosion, kernel)
th3 = cv2.adaptiveThreshold(opening, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 45, 2)
show(th3)
kernel2 = cv2.getGaussianKernel(6, 2) #np.ones((6,6))
kernel2 = np.outer(kernel2, kernel2)
th3 = cv2.dilate(th3, kernel2)
th3 = cv2.erode(th3, kernel)
show(th3)
</code></pre>
<p>显示的图像包括:</p>
<p><a href="https://i.stack.imgur.com/K6eRd.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/K6eRd.png" alt="First image, the immediate result of thresholding"/></a></p>
<p>经过一番清理:</p>
<p><a href="https://i.stack.imgur.com/adieh.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/adieh.png" alt="A bit more cleaned up and lean. Not really as nice as matlab output."/></a></p>
<p>所以总的来说不一样,当然也没有matlab好。但基本原理似乎是一样的,只是数字需要玩玩。在</p>
<p>一个更好的方法可能是用图像的平均值来做一个阈值,然后用它的输出作为掩模来自适应阈值化原始图像。希望结果会比opencv和matlab都好。在</p>
<p>试着用自适应的THRESH做这个,你可以得到一些非常好的结果,但是周围有更多的垃圾。同样,如果你可以用它作为一个遮罩来隔离文本,然后再做一次tresholding,它可能会更好。同时,侵蚀和膨胀的核的形状也会造成很大的不同。在</p>