【opencv】opencv透视变换和ocr识别实验

实验环境:anaconda、jupyter notebook

实验用到的包opencv、numpy、matplotlib、tesseract

一、opencv透视变换

原图

图片是我拍的耳机说明书,哈哈哈哈,你也可以使用自己拍的照片,最好是英文内容,tesseract默认识别英文,识别中文需要额外训练

包导入

python 复制代码
import cv2
import matplotlib.pyplot as plt
import numpy as np

图像预处理(比例放缩)

python 复制代码
page = cv2.imread('page.jpg')
ratio  = 500.0 / page.shape[0]
# 放缩比例
page_original = page.copy()
page_resize = cv2.resize(page_original,(int(page.shape[1] * ratio),500))

plt.imshow(cv2.cvtColor(page_resize, cv2.COLOR_BGR2RGB))
plt.show()

图像转为二值图像

python 复制代码
# 转灰度图
page_gray = cv2.cvtColor(page_resize, cv2.COLOR_BGR2GRAY)
# 高斯滤波,去除噪点
page_guassion = cv2.GaussianBlur(page_gray,(5,5),0)
# canny边缘检测
page_canny = cv2.Canny(page_guassion, 30, 100)

plt.figure(figsize=(20,25))
plt.subplot(131)
plt.imshow(page_gray, 'gray')

plt.subplot(132)
plt.imshow(page_guassion, 'gray')

plt.subplot(133)
plt.imshow(page_canny, 'gray')

plt.show()

获得目标图像外轮廓

轮廓检测会得到很多的轮廓,这里通过周长比较,拿到周长最长的(在实验图像中,显然周长最长的轮廓是外轮廓)

python 复制代码
# 轮廓检测
binary, page_contours, hierarchy = cv2.findContours(page_canny, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

page_cnt = None
page_cnt_arc = 0

# 最大面积的轮廓
for page_contour in page_contours:
    # 算近似轮廓
    page_cnt_arc_temp = cv2.arcLength(page_contour,True)
    page_cnt_arc_approx = cv2.approxPolyDP(page_contour, 0.05 * page_cnt_arc_temp, True)

    # 取最大周长的轮廓
    page_cnt_arc_temp = cv2.arcLength(page_cnt_arc_approx,True)
    if page_cnt_arc_temp > page_cnt_arc:
        page_cnt = page_cnt_arc_approx
        page_cnt_arc = page_cnt_arc_temp


page_temp = page_resize.copy()
cv2.drawContours(page_temp, [page_cnt], -1, (0,255,0),2)

plt.figure(figsize=(5,10))
plt.imshow(cv2.cvtColor(page_temp, cv2.COLOR_BGR2RGB))
plt.show()

构建透视变换的原矩阵和目标矩阵

python 复制代码
print('原始',page_cnt)
page_cnt_deal = np.float32(page_cnt[:,0,:]) / ratio
print('处理',page_cnt_deal)
A,B,C,D = page_cnt_deal 
print('顶点',A,B,C,D)

# 在原始图像上画轮廓
page_temp = page.copy()
page_cnt_deal_temp = np.array([[np.int32(A)],[np.int32(B)],[np.int32(C)],[np.int32(D)]])
print(page_cnt_deal_temp)
cv2.drawContours(page_temp, [page_cnt_deal_temp], -1, (0,255,0),10)
plt.imshow(cv2.cvtColor(page_temp, cv2.COLOR_BGR2RGB))
plt.show()

W1 = np.sqrt((A[0] - B[0]) ** 2 + (A[1] -B[1]) ** 2)
W2 = np.sqrt((C[0] -D[0]) ** 2 + (C[1] -D[1]) ** 2)
W = max(int(W1), int(W2))

H1 = np.sqrt((A[0] - C[0]) ** 2 + (A[1] -C[1]) ** 2)
H2 = np.sqrt((B[0] -D[0]) ** 2 + (B[1] -D[1]) ** 2)
H = max(int(H1), int(H2))

# 目标坐标
dest = np.array([
    [0,W],
    [H,W],
    [H,0],
    [0,0]
], dtype=np.float32)

print('目标',dest)

# 在原始图像上画轮廓
page_temp = page.copy()
page_cnt_deal_temp = np.array([[np.int32(dest[0])],[np.int32(dest[1])],[np.int32(dest[2])],[np.int32(dest[3])]])
print(page_cnt_deal_temp)
cv2.drawContours(page_temp, [page_cnt_deal_temp], -1, (0,255,0),10)
plt.imshow(cv2.cvtColor(page_temp, cv2.COLOR_BGR2RGB))
plt.show()

透视变换

这里创建出的矩阵M就是原坐标矩阵pagecntdeal到目标坐标矩阵dest的变换矩阵。

python 复制代码
# 透视变换
M = cv2.getPerspectiveTransform(page_cnt_deal, dest)
page_warped = cv2.warpPerspective(page, M, (int(H),int(W)))

plt.imshow(cv2.cvtColor(page_warped, cv2.COLOR_BGR2RGB))
plt.show()

二值化处理

这里二值化处理是为了ocr识别更清晰

python 复制代码
# 二值化
page_warped_gray = cv2.cvtColor(page_warped, cv2.COLOR_BGR2GRAY)
res,page_warped_bin = cv2.threshold(page_warped_gray, 100,255, cv2.THRESH_BINARY)

plt.imshow(page_warped_bin,'gray')
plt.show()

二、tesseract-orc识别

安装tesseract

ubuntu上安装非常容易

复制代码
sudo apt install tesseract-ocr

查看版本号

复制代码
tesseract -v

命令行使用

在当前目录下放一张图片,你可以自己画一张

复制代码
tesseract 图片名称 输出文件名称

不得不说,这个算法还是有些许偏颇,像我这样写得一手好字,居然也被认错了

安装pytesseract

复制代码
pip install pytesseract

使用tesseract识别刚刚透视转换的结果

python 复制代码
import pytesseract

text = pytesseract.image_to_string(page_warped_bin)
print(text)

牛逼!

相关推荐
科研前沿1 小时前
镜像视界 CameraGraph™+多智能体:构建自感知自决策的全域空间认知网络技术方案
大数据·运维·人工智能·数码相机·计算机视觉
ComputerInBook3 小时前
数字图像处理(4版)——第 8 章——图像压缩与水印(下)(Rafael C.Gonzalez&Richard E. Woods)
图像处理·计算机视觉·图像压缩·图像水印
weixin_408099676 小时前
身份证OCR识别如何做到99.9%准确率?揭秘石榴智能六大核心技术(矫正/完整度/翻拍检测/头像提取)
图像处理·人工智能·ocr·api接口·身份证识别·石榴智能
yuan199977 小时前
PCA源码与可见光-红外图像融合MATLAB实现
图像处理·计算机视觉·matlab
sali-tec10 小时前
C# 基于OpenCv的视觉工作流-章60-点点距离
图像处理·人工智能·opencv·算法·计算机视觉
hhzz13 小时前
(深度学习/计算机视觉)手把手教你从零部署YOLOv8目标检测算法-----环境安装(1/4)
深度学习·yolo·计算机视觉
kay_54514 小时前
YOLO26改进| 主干网络 | 提升长距离特征建模与全局上下文理解能力【CVPR】
人工智能·目标检测·计算机视觉·目标跟踪·论文·yolo26·yolo26改进
老黄编程14 小时前
大型工地实时数据处理与三维重构系统方案(极简中心化部署版)
人工智能·数码相机·计算机视觉·大数据处理·入侵检测·三维重构
小小测试开发15 小时前
EasyOCR用法全攻略:Python开源OCR工具快速上手,图文识别零门槛
python·开源·ocr
weixin_4080996716 小时前
身份证OCR API怎么选?对比4款主流产品后,我选择了石榴智能(含Python/Java调用示例)
人工智能·ocr·文字识别·api接口·身份证ocr·石榴智能·ocr api