opencv:实现图像的自动裁剪与优化

随着计算机视觉技术的发展,图像处理已成为一项重要的技能。今天,我们将探讨如何使用Python中的OpenCV库来实现对图像的自动裁剪以及一些基本的图像优化技巧。我们的目标是对一张发票图片进行处理,使其更加清晰且便于阅读。

准备工作

首先,确保你的环境中已经安装了numpyopencv-python这两个库。如果没有安装,可以使用pip进行安装:

python 复制代码
pip install numpy opencv-python

代码解析

1. 导入所需模块

我们从导入必要的模块开始:

python 复制代码
import numpy as np
import cv2

2. 定义辅助函数

接着定义几个辅助函数,如显示图像、排序坐标点以及进行四点变换等。

python 复制代码
def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)

def order_points(pts):
    rect = np.zeros((4,2),dtype = "float32")
    s = pts.sum(axis=1)
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]
    diff = np.diff(pts, axis=1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]
    return rect

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

def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    dim = None
    (h, w) = image.shape[:2]
    if width is None and height is None:
        return image
    if width is None:
        r = height / float(h)
        dim = (int(w * r), height)
    else:
        r = width / float(w)
        dim = (width, int(h * r))
    resized = cv2.resize(image, dim, interpolation=inter)
    return resized

3. 处理图像

然后加载图像,并调整其大小以便处理:

python 复制代码
image = cv2.imread('picture_video/fapiao.jpg')
ratio = image.shape[0] / 500.0
orig = image.copy()
image = resize(orig, height=500)

4. 轮廓检测与变换

接下来是轮廓检测,找到最大的轮廓,并对其进行透视变换:

python 复制代码
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]
screenCnt = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
peri = cv2.arcLength(screenCnt, True)
screenCnt = cv2.approxPolyDP(screenCnt, 0.02 * peri, True)
warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)

5. 最终处理

最后,对变换后的图像进行灰度化处理、阈值分割以及旋转等操作:

python 复制代码
warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
ref = cv2.threshold(warped, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
kernel = np.ones((2, 2), np.uint8)
ref_new = cv2.morphologyEx(ref, cv2.MORPH_CLOSE, kernel)
rotated_image = cv2.rotate(ref_new, cv2.ROTATE_90_COUNTERCLOCKWISE)

6.输出结果

结论

以上就是利用Python和OpenCV实现图像自动裁剪的一个简单示例。这种方法可以广泛应用于各种需要图像预处理的场合,比如文档扫描、车牌识别等。当然,实际应用中可能还需要考虑更多细节来提高准确性和鲁棒性。希望这篇教程能够帮助到正在学习图像处理的你!

相关推荐
cnbestec37 分钟前
协作机器人UR7e与UR12e:轻量化设计与高负载能力助力“小而美”智造升级
人工智能·机器人·协作机器人·ur协作机器人·ur7e·ur12e
zskj_zhyl40 分钟前
毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线
人工智能·安全·重构
gaosushexiangji2 小时前
利用sCMOS科学相机测量激光散射强度
大数据·人工智能·数码相机·计算机视觉
ai小鬼头3 小时前
AIStarter新版重磅来袭!永久订阅限时福利抢先看
人工智能·开源·github
说私域3 小时前
从品牌附庸到自我表达:定制开发开源AI智能名片S2B2C商城小程序赋能下的营销变革
人工智能·小程序
飞哥数智坊4 小时前
新版定价不够用,Cursor如何退回旧版定价
人工智能·cursor
12点一刻4 小时前
搭建自动化工作流:探寻解放双手的有效方案(2)
运维·人工智能·自动化·deepseek
未来之窗软件服务4 小时前
东方仙盟AI数据中间件使用教程:开启数据交互与自动化应用新时代——仙盟创梦IDE
运维·人工智能·自动化·仙盟创梦ide·东方仙盟·阿雪技术观
JNU freshman5 小时前
计算机视觉速成 之 概述
人工智能·计算机视觉
说私域5 小时前
基于开源AI大模型AI智能名片S2B2C商城小程序源码的私域流量新生态构建
人工智能·开源