点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本期,我们将一起学习如何从图像中提取出含有条形码的区域。下面的代码,我们将在Anaconda中采用Python 2.7 完成,当然OpenCV中的图像处理库也是必不可少的。

分割是识别图像内一个或多个对象的位置的过程。我们要介绍的技术其实非常简单,它利用了形态算子的扩张和侵蚀,以及诸如开运算,闭运算和黑帽算子的组合。

01.简介

安装Anaconda后,让我们从Anaconda的提示符下使用以下命令转到OpenCV安装:

conda install -c https://conda.anaconda.org/menpo opencv

现在,让我们从Anaconda启动器启动Spyder IDE。

Anaconda启动器

一旦运行了Spyder,建议验证OpenCV安装是否成功。在Python控制台的右下角,我们进行以下测试:

import cv2

代码讲解

我们已经创建了一个启动GitHub存储库。小伙伴可以使用以下方法直接克隆它:

git clone --branch step1
https://github.com/lucapiccinelli/BarcodesTutorial.git

现在,我们将要下载测试图像,并对他们进行读取和显示。

测试图片

import cv2
import matplotlib.pyplot as pltim = cv2.imread(r’img\barcodes.jpg’, cv2.IMREAD_GRAYSCALE)
plt.imshow(im, cmap=’Greys_r’)

接下来,我们将对图像进行二值化处理,这样可以通过阈值的设定来提取出我们感兴趣的部分。使用黑帽运算符,我们可以增加较暗的图像元素。我们可以首先使用简单的全局阈值安全地对图像进行二值化处理。黑帽运算符使我们可以使用非常低的阈值,而不必过多地关注噪声。

在应用blackhat时,我们使用的内核会更加重视垂直图像元素。内核具有固定的大小,因此可以缩放图像,这也可以提高性能(并支持某种输入归一化)。

黑帽+阈值处理

它遵循其他形态运算符的采用,顺序地将它们组合在一起以获得条形码位置中的连接组件。

#riscalatura dell'immagine
scale = 800.0 / im.shape[1]
im = cv2.resize(im, (int(im.shape[1] * scale), int(im.shape[0] * scale)))#blackhat
kernel = np.ones((1, 3), np.uint8)
im = cv2.morphologyEx(im, cv2.MORPH_BLACKHAT, kernel, anchor=(1, 0))#sogliatura
thresh, im = cv2.threshold(im, 10, 255, cv2.THRESH_BINARY)

膨胀和闭合的这种组合在测试图像上效果很好,但可能无法在其他图像上达到相同的效果。这没有关系,大家可以尝试改变参数和运算符的组合,直到对结果满意为止。

膨胀+闭运算

最后的预处理步骤是应用具有很大内核的开运算符,以删除太少而无法适合条形码形状的元素。

kernel = np.ones((21, 35), np.uint8)
im = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel, iterations=1)

这是我们希望得到的最终结果:

使用35x21内核打开

现在,我们可以运行连接的组件的检测算法,并检索带有坐标和尺寸的条形码矩形。如大家在上一张图像中所看到的那样,最后的形态学步骤并未滤除全部的噪声。但是,在这种情况下,将它们过滤掉非常简单,以矩形区域值作为阈值就可以了。

#rilettura dell'immagine, stavolta a colori
im_out = cv2.imread(r'img\barcodes.jpg')#estrazione dei componenti connessi
contours, hierarchy = cv2.findContours(im, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)unscale = 1.0 / scale
if contours != None:for contour in contours:# se l'area non è grande a sufficienza la salto if cv2.contourArea(contour) <= 2000:continue#estraggo il rettangolo di area minima (in formato (centro_x, centro_y), (width, height), angolo)rect = cv2.minAreaRect(contour)#l'effetto della riscalatura iniziale deve essere eliminato dalle coordinate rilevaterect = \((int(rect[0][0] * unscale), int(rect[0][1] * unscale)), \(int(rect[1][0] * unscale), int(rect[1][1] * unscale)), \rect[2])#disegno il tutto sull'immagine originalebox = np.int0(cv2.cv.BoxPoints(rect))cv2.drawContours(im_out, [box], 0, (0, 255, 0), thickness = 2)plt.imshow(im_out)
#scrittura dell' immagine finale
cv2.imwrite(r'img\out.png', im_out)

最后,在上面的代码中,我使用提取的矩形绘制它们,并将其覆盖在原始图像上。

最终结果,条形码以绿色框突出显示。

结论

• 提出的技术非常简单有效,但存在一些令人讨厌的缺点:

• 它对条形码偏斜非常敏感;它可以很好地工作到大约45度,然后您必须执行第二遍,修改内核的方向。

• 它只能在固定尺寸范围内找到条形码。

• 尽管对矩形区域施加了过滤,但仍有可能无法清除某些非条形码。

第一个和第二个可能不是真正的问题,但是最后一个可能会花费大家大量时间来尝试解码非条形码的内容。

一个很好的解决方案是将条形码特征(图像梯度,傅立叶变换)输入给神经网络(或一些其他一些分类器),并在第二时刻过滤掉噪声。

下面给出完整的示例代码。

import cv2
import matplotlib.pyplot as plt
import numpy as npim = cv2.imread(r'img\barcodes.jpg', cv2.IMREAD_GRAYSCALE)
im_out = cv2.imread(r'img\barcodes.jpg')#riscalatura dell'immagine
scale = 800.0 / im.shape[1]
im = cv2.resize(im, (int(im.shape[1] * scale), int(im.shape[0] * scale)))#blackhat
kernel = np.ones((1, 3), np.uint8)
im = cv2.morphologyEx(im, cv2.MORPH_BLACKHAT, kernel, anchor=(1, 0))#sogliatura
thresh, im = cv2.threshold(im, 10, 255, cv2.THRESH_BINARY)#operazioni  morfologiche
kernel = np.ones((1, 5), np.uint8)
im = cv2.morphologyEx(im, cv2.MORPH_DILATE, kernel, anchor=(2, 0), iterations=2) #dilatazione
im = cv2.morphologyEx(im, cv2.MORPH_CLOSE, kernel, anchor=(2, 0), iterations=2)  #chiusurakernel = np.ones((21, 35), np.uint8)
im = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel, iterations=1)#estrazione dei componenti connessi
contours, hierarchy = cv2.findContours(im, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)unscale = 1.0 / scale
if contours != None:for contour in contours:# se l'area non è grande a sufficienza la salto if cv2.contourArea(contour) <= 2000:continue#estraggo il rettangolo di area minima (in formato (centro_x, centro_y), (width, height), angolo)rect = cv2.minAreaRect(contour)#l'effetto della riscalatura iniziale deve essere eliminato dalle coordinate rilevaterect = \((int(rect[0][0] * unscale), int(rect[0][1] * unscale)), \(int(rect[1][0] * unscale), int(rect[1][1] * unscale)), \rect[2])#disegno il tutto sull'immagine originalebox = np.int0(cv2.cv.BoxPoints(rect))cv2.drawContours(im_out, [box], 0, (0, 255, 0), thickness = 2)plt.imshow(im_out)
#scrittura dell' immagine finale
cv2.imwrite(r'img\out.png', im_out)

基于OpenCV的条形码区域分割相关推荐

  1. 基于OpenCV的条形码区域检测(一)

    基于OpenCV的条形码区域检测(一) 1.已有方案  能够很轻松地在网上找到这一篇文章<使用Python和OpenCV检测图片上的条形码_Adrian Rosebrock>,原文:'De ...

  2. 基于OpenCV的条形码检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  3. c语言编程图片识别条形码,基于Zbar的条形码图像识别算法的制作方法

    本发明涉及条形码识别技术领域,特别是涉及一种基于Zbar的条形码图像识别算法. 背景技术: 条形码是将宽度不等的多个黑条和空白,按一定的编码规则排列,用以表达一组信息的图形标识符.随着科技的迅速发展, ...

  4. 银行卡号识别python_银行卡号识别 基于 OpenCV 光学字符识别(OCR)

    银行卡号识别 基于 OpenCV 光学字符识别(OCR) 今天的博客文章是我们最近关于光学字符识别(OCR)和计算机视觉的系列的延续. 在之前的博客文章中,我们学习了如何安装Tesseract二进制文 ...

  5. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  6. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

  7. 《OpenCV3编程入门》学习笔记7 图像变换(一)基于OpenCV的边缘检测

    第7章 图像变换 7.1 基于OpenCV的边缘检测 7.1.1 边缘检测的一般步骤 1.滤波:边缘检测算法主要基于图像强度的一阶和二阶导数,导数对噪声敏感,所以要滤波 2.增强:确定图像各点邻域强度 ...

  8. 基于OpenCV的图像梯度与边缘检测!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:姚童,Datawhale优秀学习者,华北电力大学 严格的说,梯度计 ...

  9. 基于OpenCV的图像分割处理!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:姚童,Datawhale优秀学习者,华北电力大学 图像阈值化分割是 ...

最新文章

  1. data pump工具
  2. 线段树——单点更新(二)
  3. GRE tunnel源码分析之发送流程
  4. icewm使用心得[转]
  5. matlab2c使用c++实现matlab函数系列教程-real函数
  6. linux 用户管理、权限管理
  7. 【转】博客美化(6)为你的博文自动添加目录
  8. Vue入门基础(看狂神的视频,不是很推荐……)
  9. 算法图解 -- 书评
  10. 前端度分秒与经纬度互转
  11. Eclipse快捷键自动生成返回对象
  12. java随机百分比_java随机百分比
  13. kdev-ruby 停止开发,原 maintainer 转用其它编辑器
  14. 图片的质量压缩和二次采样
  15. 高手速成android开源项目【View篇】(转)
  16. 【C语言】Bingo 猜数字
  17. 阅读《精通Python爬虫框架Scrapy》
  18. 常用git命令总结大全
  19. Altium Designer(17.0)原理图模板设计
  20. C语言 计算e的近似值

热门文章

  1. 马云:很多P2P公司披着互联网金融的外衣做非法金融服务
  2. 王劲对外发声:确已离开景驰,不是因为百度诉讼
  3. 高逼格的 SQL 写法:行行比较,别问为什么,问就是逼格高。。
  4. 蓝绿发布、滚动发布、灰度发布,有什么区别?这下明白了
  5. Spring越来越强,而我们越来越快餐!离开了Spring,居然API都写不出来了! 程序猿DD...
  6. 使用雪花id或uuid作为Mysql主键,被老板怼了一顿!
  7. Java基于Swing和Netty仿QQ界面聊天小项目
  8. 面试命中率90%的点 —— MySQL锁
  9. 【图解】算法原理!通俗理解机器学习算法
  10. 我用AI分析了《赛博朋克 2077》的评价,发现真爱粉都是来吸猫的