# 图像处理智能化的探索[二]:文字区块识别

## 2. 探索

• 均值计算

`mean, std = cv2.meanStdDev(img)  `

• OCR

• 边缘检测

## 4. 实践

### 4.1 图像降噪

```gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)  ```

`dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])  `

### 4.2 膨胀与腐蚀

```c1 = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 8))
c2 = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 6))

ret, bimg = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
dilation = cv2.dilate(bimg, c2, iterations=1)  ```

```erosion = cv2.erode(dilation, c1, iterations=1)
img_edge = cv2.dilate(erosion, c2, iterations=1)  ```

### 4.3 筛选文字区域

`contours, hierarchy = cv2.findContours(img_edge, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  `

```# 记录文字区块数量
area_text_num = 0
region = []

# 根据边缘连接得到所有轮廓
contours, hierarchy = cv2.findContours(img_edge, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):
cnt = contours[i]
area = cv2.contourArea(cnt)

# 筛掉面积过小的区块
if area < 1000:
continue

# 得到最小矩形区域，转换为顶点坐标形式（矩形可能会有角度）
rect = cv2.minAreaRect(cnt)
box = cv2.cv.BoxPoints(rect)
box = np.asarray(box)
box = box.astype(int)

x0 = box[0][0] if box[0][0] > 0 else 0
x1 = box[2][0] if box[2][0] > 0 else 0
y0 = box[0][1] if box[0][1] > 0 else 0
y1 = box[2][1] if box[2][1] > 0 else 0
height = abs(y0 - y1)
width = abs(x0 - x1)

# 筛掉不够“扁”的的区块，它们更有可能不是文字
if height > width * 0.3:
continue
area_text_num += height * width
region.append(box)

return region, area_text_num  ```

### 4.4 边缘调整

```for i in range(len(contours)):
cnt = contours[i]
area = cv2.contourArea(cnt)

# 筛掉面积过小的区块
if area < 1000:
continue

# 得到最小矩形区域，转换为顶点坐标形式（矩形可能会有角度）
rect = cv2.minAreaRect(cnt)
box = cv2.cv.BoxPoints(rect)
box = np.asarray(box)
box = box.astype(int)

# 过滤掉过于模糊的区块
lap = cv2.Laplacian(gray[box[1][1]:box[0][1], box[0][0]:box[3][0]], cv2.CV_64F)
if lap is None or lap.var() < TEXT_LAPLACIAN_THRESHOLD:
continue

# Code...```

## 5. 尾声

0 条评论

• ### CSS居中方法集锦

这阵一直忙各路笔试面试，心越来越浮躁，也好久没有写些东西。不过也正是这些虐我千百遍的笔试面试题让我愈发地觉得确有必要整理一下知识点，让网上书上看的杂乱无章的东西...

• ### 图像处理智能化的探索[一]:人脸识别裁图

最近在对接公司一些新闻接口的时候，发现接口茫茫多：CMS接口、无线CMS接口、正文接口、列表接口……更令人捉急的是，由于新闻推送场景不同，每条新闻的配图尺寸也就...

那就是我在这里的每一篇文开头都必然是：最近工作好忙，又断更很久了……Anyway，这也不能成为偷懒的理由。我可能对记录技术有些固执的误解，总认为是要待到整理出一...

• ### 人工智能帮助医生将癌症诊断准确率提升至99.5%

2016年6月16日，美国Newswise新闻网站(www.newswise.com)发布消息称，人工智能可以帮助医生将癌症的诊断准确率提升至99.5%。 病理...

• ### java服务端推送消息有那么难吗？

今天项目经理交给我一个开发任务。如果有人在前台下了订单就给后台仓库管理一个发货通知。也就是服务端触发一个事件，推送消息到客户端。

• ### Web安全学习笔记(四)：web通信基础之HTTP

--------------------开始--------------------

• ### Python爬虫HTPP请求方法有哪些

POST：向指定资源提交数据进行处理请求（例如提交表单或者上传文件），数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

• ### 面试官：数据量很大，分页查询很慢，怎么优化？

当需要从数据库查询的表有上万条记录的时候，一次性查询所有结果会变得很慢，特别是随着数据量的增加特别明显，这时需要使用分页查询。对于数据库分页查询，也有很多种方法...