如何使用 OpenCV 从图像中裁剪和提取图章?

2023-12-25

我是 OpenCV 新手。 我有一个“简单”的邮票图像,我已经对其进行了一些处理,如下面的代码所示。 现在我遇到了裁剪图像以获得印章的问题。 边缘上的点和条纹会干扰我当前识别邮票的代码。 图像可能不同,因此无法修复图像的位置。

Code:

img = cv2.imread('./images/image.JPG')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0) 
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200)

Real Images First Real Example Image


这是一个简单的方法:

  1. 获取二值图像。我们加载图像,转换为灰度,高斯模糊,然后Otsu阈值以获得二值图像。

  2. 消除小伪影和噪音。创建一个矩形结构元素并变形打开以消除少量噪音。然后,假设印章是单个轮廓,则变形接近以将各个轮廓组合成单个轮廓。

  3. 检测并提取邮票投资回报率。查找轮廓,使用轮廓面积和形状近似进行过滤。这个想法是,如果轮廓有四个顶点,那么它就是正方形。我们可以使用 Numpy 切片提取邮票 ROI 并保存邮票


提取的 ROI 结果

这是评论中其他两个输入图像的结果。假设对于每个图像,只有一个图章或一组相邻的图章。对于这些情况,我们按轮廓区域排序并假设最大的轮廓是印章。

Code

import cv2

# Load image, grayscale, Gaussian blur, Otsu's threshold
image = cv2.imread("1.jpg")
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Morph operations to remove small artifacts and noise
open_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, open_kernel, iterations=1)
close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, close_kernel, iterations=2)

# Find contours, filter using contour area, and shape approximation
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
for c in cnts:
    peri = cv2.arcLength(c, True)
    area = cv2.contourArea(c)
    approx = cv2.approxPolyDP(c, 0.05 * peri, True)
    # Assumption is if the contour has 4 vertices then its a square shape
    # 2nd assumption is that there's only one stamp, or one group of stamps
    if len(approx) == 4 and area > 100:
        x,y,w,h = cv2.boundingRect(approx)
        ROI = original[y:y+h, x:x+w]
        cv2.imshow("ROI", ROI)
        cv2.imwrite("ROI.png", ROI)
        break
cv2.waitKey()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 OpenCV 从图像中裁剪和提取图章? 的相关文章

  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • 在Python3.6中调用C#代码

    由于完全不了解 C 编码 我希望在我的 python 代码中调用 C 函数 我知道有很多关于同一问题的问答 但由于一些奇怪的原因 我无法从示例 python 模块导入简单的 c 类库 以下是我所做的事情 C 类库设置 我使用的是 VS 20
  • 如何确定非阻塞套接字是否真正连接?

    这个问题不仅限于Python 这是一个一般的套接字问题 我有一个非阻塞套接字 想要连接到一台可访问的机器 在另一端 该端口不存在 为什么 select 仍然成功 我预计会超时 sock send 因管道损坏而失败 select 之后如何确定
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • 如何从 PyCharm 项目中获取我的“exe”[重复]

    这个问题在这里已经有答案了 通过 PyCharm 在 Python 上编写一些项目 我想从中获取一个exe文件 我尝试过 另存为 gt XXX exe 但是 当我尝试执行它时出现错误 此类操作系统不支持该文件 附注 我有win7 x64 它
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • 定义函数后对其进行修饰?

    I think答案是否定的 但我似乎找不到明确的说法 我有以下情况 def decorated function function functools wraps function def my function print Hello s
  • matplotlib matshow 标签

    我一个月前开始使用 matplotlib 所以我仍在学习 我正在尝试用 matshow 制作热图 我的代码如下 data numpy array a reshape 4 4 cax ax matshow data interpolation
  • 如何在Python和Selenium中通过标签名称或id获取元素[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 和 Selenium 获取输入 但它向我显示错误 我该如何解决这个错误 inputElement send keys getStock getStocklFunc 0 Error i
  • 为什么我用 beautifulSoup 刮的时候有桌子,但没有 pandas

    尝试抓取条目页面转换为制表符分隔格式 主要拉出序列和 UniProt 登录号 当我跑步时 url www signalpeptide de index php sess m listspdb bacteria s details id 10
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • 为什么我们应该在 def __init__(self, n) -> None: 中使用 -> ?

    我们为什么要使用 gt in def init self n gt None 我读了以下摘录来自 PEP 484 https www python org dev peps pep 0484 the meaning of annotatio
  • 来自 django 教程 was_published_recently.admin_order_field = 'pub_date'

    From Django 教程 https www jetbrains com help pycharm 2017 1 creating and running your first django project html d28041e21
  • 使用 Python 生成类似于 Messenger 或 kik 代码的圆形二维码

    我可以使用 Python 生成圆形 QR 码 就像 Facebook Messenger 或 kik 使用的那样吗 我访问了很多网站 但找不到这种类型的二维码 默认情况下 Python 生成方形 QR 码 但在我的项目中我想要圆形 QR 码

随机推荐

  • 如何根据控制台输出中的文本使 GitLab 的 CI/CD 作业失败?

    我在用Lerna https github com lerna lerna管理多包存储库 在我的部署工作中 我使用 Lernapublish命令 对我来说 如果包中的代码发生更改 它应该始终向我们的 Artifactory 发布新版本 如果
  • Rails/ActiveRecord - 如何使其更简洁?

    在我看来 我有如下一行 看来我必须经常做这种事情 因为有些字段可以为空 有更好的方法来写这个吗 我可以在模型层处理它 但据我所知 这并不是真正的模型层功能 您可以使用delegate http api rubyonrails org cla
  • Android 的代码覆盖率 (calabash-android BDD)

    我正在使用测试我的 Android 应用程序葫芦安卓 https github com calabash calabash android它提供了它自己的 测试项目 以及一个重命名其包以反映测试下的应用程序的脚本 然后使用 Instrume
  • 您希望 Ruby 语言有哪些改进?

    您希望 Ruby 以及更广泛的 Ruby 社区 改进哪些方面 I read 某处 http blog hasmanythrough com 2008 6 20 recursive lambdaRuby 是 Smalltalk 和 LISP
  • 如何在不使用任何 html 标签的情况下向 html 文本添加换行符

    我想在网站上的个人资料文本中插入换行符 该网站只允许插入文本 因此我不能使用任何 html 标签 我想知道是否有任何方法可以像使用 ASCII 代码插入空格或制表符一样插入换行符 您可以设置white space to pre line 这
  • 在 Angular 2 材质的 md-grid-list 中使用 md-cards

    我是 Angular 2 材料设计的新手 我想要实现的是使用 angular2 材质创建一个网格列表并将 md cards 放入 md grid tile 中 虽然 md card 有position relative 但它们溢出了 md
  • C++ STL 向量保留

    我已经用下面的代码对 stl 矢量进行了测试 struct structA char charArray 256 structA a assign 256 characters to a charArray vector
  • 使用 MS Symbol Server 调试 .NET 代码 - VS 不显示变量值

    当我使用 NET 的 Microsoft 调试符号调试 ASP NET 网站代码时 当我调试 NET 框架代码 当然是由Microsoft Symbol Server 我告诉 VS2008 从中获取信息 Cannot obtain valu
  • ?android:attr/selectableItemBackground 在深色背景上不够明显

    在 Android Lollipop 上 我使用的是 android background android attr selectableItemBackground 当我单击按钮时获得材料动画反馈 当我有一个包含在白色 浅色布局中的按钮
  • Delphi Graphics32 相对鼠标位置(相对于图层)

    我有一个 ImgView32 它锚定到所有表单边距 表格被最大化 ImageView的位图不固定 可以是不同大小 我试图使用这个问题的代码在透明层上画一条线 在图层上画线 https stackoverflow com questions
  • Spring 3 拦截器顺序

    我有一个 Spring 3 Web 应用程序 它实现了两个拦截器 我使用一个带有 Configuration注释的配置类 代码如下 Override public void addInterceptors InterceptorRegist
  • 如何从另一个对象访问我的应用程序委托的窗口访问器方法?

    如前所述 我是 Objective C 的初级新手 但在阅读了 4 本有关该主题的实体书以及大量电子书和文档后 我仍然找不到我想要的东西 我有一个顶级内容视图控制器 想要从应用程序委托的窗口属性的物理尺寸配置其视图属性 这是几个人已经提出的
  • 追踪流星/节点光纤中的堆栈溢出

    我现在看到了这个崩溃 并且对节点光纤基础设施不够熟悉 不知道从哪里开始解释错误或检测代码 Meteor server running on http localhost 3000 W202407 10 06 05 740 8 STDERR
  • go get:忽略 Git 设置

    我正在使用 Golang 和 GitLab CI 并且我有一个 GitLab CI 配置 它非常适合 12 个项目 但不适用于第 13 个项目 我遇到的问题是我正在尝试go get一些私人存储库 其中go get尝试通过已关闭的 HTTPS
  • 带 www 或不带 www 的默认 URL 有何优缺点?

    我们需要将默认 URL 设置为唯一名称 如果是 www 则没有前缀 反之亦然 因此要做出的决定是坚持使用 www 或不使用前缀 没有为所有子域设置前缀 cookie 它还有什么其他缺点 还是好处 基本上我们需要 OpenID 这个 因为如果
  • SQL Server:对于不存在的行,用 0 填充 MAX(列)值

    我想为表中不存在的行的 MAX TIER 返回 0 到目前为止 这是我的代码 SELECT LAST YARD BAY LAST YARD ROW MAX LAST YARD TIER as MAX TIER FROM Handlift W
  • 向 SQL Server 中的存储过程添加参数

    我是新来的K2and SQL Server 我想向存储过程添加一个参数 稍后将其绑定到K2相应视图和表单的智能对象 目前它接受 1 个参数 lang 这是来自标签的输入K2智能形式视图 我添加了一个标签labelHideInactiveCo
  • 首次折叠的 K 次折叠精度较低

    我创建了一个文本分类器 并且正在尝试利用 K 折交叉验证 我不明白为什么我的第一次折叠的准确度为 55 而我的其他折叠则在 99 100 的准确度下过度拟合 我的数据集是一个 5109x2 数据框 其中列 df Features 作为特征
  • CS0120:非静态字段、方法或属性“foo”需要对象引用

    考虑 namespace WindowsApplication1 public partial class Form1 Form public Form1 InitializeComponent private void button1 C
  • 如何使用 OpenCV 从图像中裁剪和提取图章?

    我是 OpenCV 新手 我有一个 简单 的邮票图像 我已经对其进行了一些处理 如下面的代码所示 现在我遇到了裁剪图像以获得印章的问题 边缘上的点和条纹会干扰我当前识别邮票的代码 图像可能不同 因此无法修复图像的位置 Code img cv