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

opencv QR二维码 python opencv 二维码_opencv QR二维码

首先创建一个搜索条形码.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)


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

二值化之后的图像中除了条形码位置外,还有别的地方也有一些白色的区域,可以用形态学的方法把他们处理掉

opencv QR二维码 python opencv 二维码_灰度_02

Kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(21,7))
dst=cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,Kernel)
dst=cv2.erode(dst,None,iterations=5)
通过erode腐蚀操作后图像除了条形码后的大部分其他的干扰都已经没有了,但是条形码的大体形状也不是很完整了,在通过膨胀操作,是条形码的形状有大致的恢复

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

下次接着写完