image - 如何使用opencv从文本图像中分离连接和融合的字符
问题描述
我一直在开发一个ocr系统。我能够相当容易地从图像中分割出线条和单词,但我完全坚持字符分割。我如何从这些块中提取字符。我在论坛上阅读了很多答案,但它们已应用于两个字符之间有足够间距的文本。我曾尝试使用直方图方法将字符从单词中分离出来,但结果并不令人满意。我的话是这样的。人物相互接触的图像 和另一个样本。阈值处理只会通过进一步融合字符来增加问题。如何分割这些字符。这是我到目前为止所做的:函数接受一个二维列表,其中包含要分割的大小为 500*500 像素的单词:
import cv2
import numpy as np
def character_detector(words):
characters=[]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
for i in words:
j=i
l=[]
for k in j:
s=k
f=k
from cv2.ximgproc import THINNING_ZHANGSUEN
s = cv2.ximgproc.thinning(k,s,thinningType=THINNING_ZHANGSUEN )
s = cv2.dilate(s,kernel,iterations=3)
k = cv2.threshold(k,75,255,cv2.THRESH_OTSU)[1]
m = cv2.Canny(k,100,200)
k=k-m
i=0
while i<5:
m = cv2.Canny(k,100,200)
k = k-m
i+=1
y_sum = cv2.reduce(k, 0, cv2.REDUCE_AVG)
y_sum=y_sum[0]
y_avg = sum(y_sum)//500
hist =[]
for i in range(0,500):
if(y_sum[i]==0):
hist.append(False)
else:
hist.append(True)
j=1
y_start=0
y_end = 0
y_coord=[]
i=0
while i<500:
j=1
if not(hist[i]):
i=i+1
continue
else:
y_start = i
temp = i
j=0
while temp<500 and hist[temp]:
temp+=1
j+=1
i= i+j
y_end = y_start+j
y_coord.append((y_start,y_end))
for i in range (0,len(y_coord),1):
roi = f[0:500,y_coord[i][0]:y_coord[i][1]]
cv2.imshow('thresh',roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
解决方案
推荐阅读
- ruby - RSpec 并期待 PG:RaiseException
- linear-programming - 对于线性规划求解器,我们可以期待什么样的求解质量?
- windows - 删除用户文件
- ruby-on-rails - 如何在 Ruby on Rails 中使用带有 OTP 的电话进行注册
- javascript - for 循环中的 AJAX 问题:如何对数组的每个元素进行 ajax 调用?
- linux - 对具有多个 netCDF 文件的目录同时执行 shell 和 cdo 操作
- python - Python Django - 根据作为用户的所有者计算对象
- sql - 如何从数据库中的月份之间选择数据库中的数据?
- javascript - AJAX POST 实际上并未使用 Django 发送 POST 数据
- java - 使用 BroadcastState 模式时如何触发下游 onEventTime() 方法?