【发布时间】:2018-11-18 02:50:46
【问题描述】:
我的目标是正确分割图像中的字符
如何正确分割连接的 B 和 W?此外,我的代码似乎发现 750 也都已连接。我如何对它们进行细分?
我必须应用哪种转换?我试过侵蚀,但没有帮助?如何为这样的图像选择内核大小? 5 和 M 上的噪音应该如何去除?
我应该对我的代码进行哪些更改以正确分割和隔离每个字符? 代码:
img = cv2.imread('C:\\xx\\testimages\\X\\plate4.jpg', 0)
cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU,img)
image, contours, hier = cv2.findContours(img, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
contours = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0])
d=0
for ctr in contours:
# Get bounding box
x, y, w, h = cv2.boundingRect(ctr)
# Getting ROI
if w>20 and h>20 and w<60: #Boundary conditions to isolate a character
print(x, y, w, h)
roi = image[y:y+h, x:x+w]
#roi=cv2.resize(roi,(20,35))
#kernel = np.ones((3,3), np.uint8)
#roi = cv2.morphologyEx(roi, cv2.MORPH_CLOSE, kernel)
#roi = cv2.erode(roi, kernel, iterations=1)
# kernel_1=np.ones((1,1),np.uint8)
# roi=cv2.dilate(roi,kernel,iterations=1)
cv2.imshow('character: %d' % d, roi)
cv2.imwrite('C:\\xx\\ValidationSet\\character_%d.png'%d, roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
d+=1
【问题讨论】:
-
在轮廓之前(而不是之后)侵蚀图像应该会有所帮助。
-
@jedwards 为腐蚀选择内核大小的依据是什么?
-
这在很大程度上取决于图像的分辨率和其中字符的大小(按像素计算)。您可以手动尝试并尝试找出合理的内核大小,或者可能检测相对于其他检测到的轮廓“太宽”的轮廓并在这种情况下自适应侵蚀。不幸的是,在这种情况下没有万能的答案。
-
@jedwards 我在塑造轮廓之前腐蚀了图像。它帮助我将“7”与 50 区分开来,但不适用于 BW 和 50。增加内核大小只会使其他字符分割恶化,因为它们变得无法识别。我该怎么办?
-
您可以尝试使用更小的内核进行更多迭代,而不是使用更大的内核。但我同意,不要“太大”。
标签: python opencv image-processing ocr image-segmentation