Python+Opencv框出图像二维码

本文介绍如何使用Python和OpenCV识别图像中的条形码。通过Sobel算子进行边缘检测,结合阈值处理和形态学操作,有效定位并突出显示条形码区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   这是我第一次写博客,主要是为了做一些学习笔记。Python现在的流行度日渐增高,Python中也有opencv的接口,不过只支持opencv2.昨天在别人的博客上发现一个用Python和opencv框出图像中的二维码,我实现了一遍,其中有些知识点不是很详细,我这里详细的说明一下,为刚开始学习这两者的朋友提供一些参考。
**(这个例子并不能框出所有类型图片的条形码,但可以提供实现问题的思路)**

这是要检测的图像

首先创建一个搜索条形码.py的文件,然后编辑
import numpy as np
import cv2

#加载图片并把它转换成灰度图片
image=cv2.imread('codetwo.jpg')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#sobel算子主要用于边缘检测,在技术上,它是一离散性差分算子,
#用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,
#将会产生对应的灰度矢量或是其法矢量
gradX=cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)
gradY=cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=0,dy=1,ksize=-1)
#x灰度减去y灰度
gradient=cv2.subtract(gradX,gradY)
gradient=cv2.convertScaleAbs(gradient)
cv2.imshow('Image',graident)
cv2.waitKey(0)

![这里写图片描述](https://img-blog.csdn.net/20170519181820546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxpeWFuYWhf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

sobel是一个用于检测边缘的一阶离散微分算子,它需要在两个方向(x,y)上求导。其函数原型是:

 gradX=cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)
 第一个参数:要处理的对象(图像)
 第二个参数:图像的深度,-1 表示采用的是与原图像相同的深度
 第三个参数:int类型,表示x方向上的求导阶数
 第四个参数:int类型,表示y方向上的求导阶数
 (sobel是一阶求导的微分离散算子,所以一般取dx=1,dy=1,0表示这个方向上没有求导)
 第五个参数:表示sobel卷积核的大小,默认值为3,他必须取1、3、5、7
通过求x与y方向的一阶求导图像后,将减去gradX-GradY,通过这一步减法操作,最终得到包含高水平梯度和低竖直梯度的图像区域。
最后一步用convertScaleABS()函数将图像返回unit8的图像

#blur均值滤波 并且 threshold阈值化
blurred=cv2.blur(gradient,(9,9))
(_,thresh)=cv2.threshold(blurred,225,255,cv2.THRESH_BINARY)
将图像中像素值大于225的都设为255,小于225的设为0
二值化之后的图像中除了条形码位置外,还有别的地方也有一些白色的区域,可以用形态学的方法把他们处理掉

Kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(21,7))
dst=cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,Kernel)
dst=cv2.erode(dst,None,iterations=5)

![](http://img.blog.csdn.net/20170519181053282?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxpeWFuYWhf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

通过erode腐蚀操作后图像除了条形码后的大部分其他的干扰都已经没有了,但是条形码的大体形状也不是很完整了,在通过膨胀操作,是条形码的形状有大致的恢复

dst=cv2.dilate(dst,None,iterations=40)

下次接着写完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值