openCV实战-系列教程13:文档扫描OCR识别下(图像轮廓/模版匹配)项目实战、源码解读

news/2024/7/21 5:09:15 标签: opencv, 计算机视觉, python, 图像处理, ocr

🧡💛💚💙💜OpenCV实战系列总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传

上篇内容:
openCV实战-系列教程11:文档扫描OCR识别上(图像轮廓/模版匹配)项目实战、源码解读

5、透视变换调整图像

现在需要做的是将原来的图像转换成一个类似于pdf文档的那种可以正常看出来文字的那种形式的图像,但是图像并不是一个规矩的矩形,需要用坐标变换。也就是说使用透视变换,将不规整的图像转换成规整的矩形。

5.1 透视变换函数

python">def four_point_transform(image, pts):
    rect = order_points(pts)
    (tl, tr, br, bl) = rect
    widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
    widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
    maxWidth = max(int(widthA), int(widthB))
    heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
    heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
    maxHeight = max(int(heightA), int(heightB))
    dst = np.array([
        [0, 0],
        [maxWidth - 1, 0],
        [maxWidth - 1, maxHeight - 1],
        [0, maxHeight - 1]], dtype="float32")
    M = cv2.getPerspectiveTransform(rect, dst)
    warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
    return warped
  1. 需要传进去两个参数,image:原始输入图像,pts:原始轮廓的四个点坐标
  2. 这里有一个函数就是4中的内容,原始轮廓的四个点的坐标,通过函数order_points的进行排序,得到方便我们进行计算近似矩形的四个顶点的顺序
  3. 取出这四个点的坐标,分别记为(tl, tr, br, bl),即(topLeft, TopRight, BottomRight, BottomLeft)
  4. 分别计算出“第3个点和第4个点的横坐标的差值的平方、以及纵坐标的差值的平方”的和的绝对值保存为widthA
  5. 分别计算出“第1个点和第2个点的横坐标的差值的平方、以及纵坐标的差值的平方”的和的绝对值保存为widthB
  6. 取出widthA和widthB中之间的较大值保存为maxWidth
  7. 分别计算出“第1个点和第4个点的横坐标的差值的平方、以及纵坐标的差值的平方”的和的绝对值保存为heightA
  8. 分别计算出“第2个点和第3个点的横坐标的差值的平方、以及纵坐标的差值的平方”的和的绝对值保存为heightB
  9. 取出heightA 和heightB中之间的较大值保存为maxHeight
  10. 构造矩形的四个顶点,保存为dst 的2*4的二维list
  11. 第一个坐标为(0,0)
  12. 根据maxHeight 和maxWidth以及第一个坐标计算出其他三个坐标,因此13、14行略
  13. 用输入的四个点rect和输出的四个点dst,使用getPerspectiveTransform函数计算变换矩阵,这个过程是一个投影的变换,最后的计算结果是一个映射矩阵,保存为M
  14. 用原始图像image、映射矩阵M、我们想要的矩形长宽,使用warpPerspective函数进行透视变换
  15. 返回透视变换结果warped

5.2 图像透视变换

原始图像里面有一张不规整的小票,我们有一个函数把这个小票转换为规整的图像,这个函数在5.1部分已经讲解

python">warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)
warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
ref = cv2.threshold(warped, 100, 255, cv2.THRESH_BINARY)[1]
cv2.imwrite('scan.jpg', ref)
print("STEP 3: 变换")
cv2.imshow("Original", resize(orig, height=650))
cv2.imshow("Scanned", resize(ref, height=650))
cv2.waitKey(0)
  1. four_point_transform是已经解析过的函数,orig是原始图像,screenCnt是小票轮廓,ratio是在前面提到过的,图像经过resize的前后比例,最后返回透视变换的图像保存为warped
  2. 灰度处理
  3. 二值处理
  4. 打印文章

上篇内容:

openCV实战-系列教程11:文档扫描OCR识别上(图像轮廓/模版匹配)项目实战、源码解读


http://www.niftyadmin.cn/n/4987971.html

相关文章

机器人编程怎么入门?

机器人已经在我们中间存在了二三十年。如今,机器人在我们的文化中比以往任何时候都更加根深蒂固。大多数机器人机器用于各种装配线,或在世界各地的矿山或工业设施中执行密集的物理操作。 还有一些家用机器人,工程师正在对机器人进行编程&…

降噪音频转录 Krisp: v1.40.7 Crack

主打人工智能降噪服务的初创公司「Krisp」近期宣布推出音频转录功能,能对电话和视频会议进行实时设备转录。该软件还整合的ChatGPT,以便快速总结内容,开放测试版于今天上线。 随着线上会议越来越频繁,会议转录已成为团队工作的重…

为什么别的职业都是越老越值钱,唯独程序员越老越容易失业?

因为其他职业都是技术稀缺型产业,而程序员却是技术密集型产业。 那些越老越值钱的职业有一个特征:越资深越稀缺,靠技术经验积累或是人脉资源吃饭,如医生、律师、老师等,而程序员这一职业的技术经验、人脉资源的积累相对…

el-table中保留分页选中

场景:对数据表格中数据进行选取,然后保存的数据操作。 对于数据表格,貌似这种需求不是非常常用,对于小数据量来说,checkbox就已经能够足够满足我们的要求,但往往对于大数据量可能需要通过表格来实现选择。 …

解决legend数据过多,使用滚动,但进行后图形样式发生变化

前言: 滚动前: 滚动后: 滚动前后,饼状图中的内容除了“城市规划”和“城市管理部件”两个分类进行了位置的交换,没有其他的变化,数据也没有增加,但是,样式就是不知道为啥发生了变化。…

window关闭chrome

os.system("taskkill /F /IM chrome.exe") os.system("taskkill /F /IM chromedriver.exe")

PAT甲级题库打卡—【最近考题A1132—后】—最新23.8.31

1 1132 Cut Integer 简单题&#xff0c;最后自己给自己挖了个坑。AC&#xff1a; #include<bits/stdc.h> using namespace std;//模拟typedef long long ll;int main() {int n;cin >> n;while(n--){string x;cin >> x;int x1 stoi(x);int num x.size() /…

shell超基础入门(超详细)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…