您的位置:首页 > 编程语言 > Python开发

opencv自然场景文本(中文)检测(python代码+实现)+CNN理解

2019-07-14 21:12 2231 查看

学习记录:
先了解一波CNN(理解难度递增):
详解卷积神经网络(CNN)
卷积讲得比较清楚

https://blog.csdn.net/liangchunjiang/article/details/79030681

CNN卷积神经网络原理讲解+图片识别应用(附源码)
卷积和池化讲得很详细(我没试过他的代码,不知道能不能运行,我还是专心干一件事吧)

https://blog.csdn.net/kun1280437633/article/details/80817129

一文让你彻底了解卷积神经网络
我发现了一个共同特点:为啥咱们就不能把全连接层讲清楚呢…

https://blog.csdn.net/weixin_42451919/article/details/81381294

对全连接层(fully connected layer)的通俗理解:

https://blog.csdn.net/qq_39521554/article/details/81385159

全连接层(Fully Connected Layer)

https://blog.csdn.net/bestrivern/article/details/89525816

CNN学习自我总结:
卷积层:
卷积层的作用其实就是,对于每一个独立区域,通过输入层与卷积核(权重)相乘,不断改变卷积核,来确定能初步表征该图片区域特征的有用的卷积核是哪些,再得到与相应的卷积核相乘后的输出矩阵。

池化层:
通过选取指定区域具有代表的数字来代表这片区域(有最大池化,均值池化等)
是为了减少训练参数的数量,降低卷积层输出的特征向量的维度,减小过拟合现象,保留最有用的图片信息

全连接层:
我,没看太明白…那我就暂且理解为全连接层是把卷积池化操作后得到的特征矩阵汇合,用于生成分类器分类(别打脸)。希望随着以后的继续接触能对这些有更深更准确地理解。

opencv自然场景文本(中文)检测:
原文地址:https://blog.csdn.net/weixin_39059031/article/details/82415226
不知道是不是因为用的的是east文本检测框架,适用于自然场景下的短文本,所以对于类似作业题目文本检测真的是…一言难尽
但是我目前想检测的是书本上的,所以又发现找了一个文本检测方法。
最简单的简单场景形态学操作

https://blog.csdn.net/weixin_42831704/article/details/90599766

然后加上上篇中用到的tesseract-OCR对检测出的文本框内的文本进行识别
测试运行代码如下:

import cv2
import numpy as np
import pytesseract

# 读取图片
imagePath = '2.jpg'
img = cv2.imread(imagePath)
orig = img.copy()
origH, origW = img.shape[:2]

# 转化成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 利用Sobel边缘检测生成二值图
sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)
# 二值化
ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)

# 膨胀、腐蚀
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 9))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (24, 6))

# 膨胀一次,让轮廓突出
dilation = cv2.dilate(binary, element2, iterations=1)

# 腐蚀一次,去掉细节
erosion = cv2.erode(dilation, element1, iterations=1)

# 再次膨胀,让轮廓明显一些
dilation2 = cv2.dilate(erosion, element2, iterations=2)

#  查找轮廓和筛选文字区域
region = []
boxes = []
binary,contours, hierarchy = cv2.findContours(dilation2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):
cnt = contours[i]
# 计算轮廓面积,并筛选掉面积小的
area = cv2.contourArea(cnt)
if (area < 1500):
continue
# 找到最小的矩形
rect = cv2.minAreaRect(cnt)
# box是四个点的坐标
box = cv2.boxPoints(rect)
box = np.int0(box)
# 计算高和宽
height = abs(box[0][1] - box[2][1])
width = abs(box[0][0] - box[2][0])

# 根据文字特征,筛选那些太细的矩形,留下扁的
if (height > width * 1.3):
continue
#记录起始坐标结束坐标对应的X,Y值
boxes.append((box[1][1],box[0][0],box[0][1],box[2][0]))
region.append(box)
padding = 0.0
results = []
for (startY, startX, endY,endX) in boxes:
# extract the actual padded ROI
roi = orig[startY:endY, startX:endX]

# use Tesseract v4 to recognize a text ROI in an image
text = pytesseract.image_to_string(roi,lang='chi_sim')
text = text.split()
text = ''.join(text)

# add the bounding box coordinates and actual text string to the results list
results.append(((startX, startY, endX, endY), text))

# sort the bounding boxes coordinates from top to bottom based on the y-coordinate of the bounding box
results = sorted(results, key=lambda r:r[0][1])

output = orig.copy()
# loop over the results
for ((startX, startY, endX, endY), text) in results:
# display the text OCR'd by Tesseract
print("{}\n".format(text))

# draw the text and a bounding box surrounding the text region of the input image
cv2.rectangle(output, (startX, startY), (endX, endY),(0, 255, 0), 1)

# show the output
cv2.imshow("Text Detection", output)
cv2.waitKey(0)

我发现对于不同长宽比例的文本,采用不同像素输入图片结果会差很多,这是个例子下相对较好的结果:

识别结果:

名晚上,我由广东湛江市搭乘火车到广州去,八个多小时的路程,买了四人同室的软卧票。尽管觉

一件十分别扭的事,然而,别无其他选择,也只好随遇而安了。

@@进入那间极为局促的车厢窜室时,已有一位年过六旬的妇人坐在里面了。浅灰色的高领套头毛

衣,极为得体地配以铁灰色的西式套装衣裤了的短发,一丝不苟地梳得整整齐齐;方形的细

框眼镜,攻|6

回攀谈之下,知道她是广州一知性杂志的主编,几天前专程到湛江去约稿,现在,大功告成,启程

回家由于志趣相投,我们谈得十分投缘。就在这时,火车站的扩音器突然响起:“请各位注意:软

卧的车票还有几张,有意购买的人赶快去买!“妇人转头对我说道:“真希望这间害室没有人再进

来,图个清静。“我一听,便笑了起来,因为我心里也正转着同一个念头。

这已经是较好的结果了…emmmm
继续学习,争取下次得到更好的识别结果
加油~
题外话:同学用网上下的模型和数据集训练了一个手写体识别,全错,
气的她一句:"人工智障,不是你疯就是我疯…"哈哈哈,好可爱有没有。
收工,打游戏去了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: