高水平梯度和低垂直梯度的图像区域函数原型:dst=cv2.Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,delta[,borderType]]]]])函数参数: 1. src – 需要处理的图像 2. ddepth – 图像的深度,-1表示采用的是与原图像相同的深度。
目标图像的深度必须大于等于原图像的深度 3. dx – 对x轴方向求导的阶数,一般为0、1、2,其中0表示这个方向上没有求导 4. dy – 对y轴方向求导的阶数,一般为0、1、2,其中0表示这个方向上没有求导 5. dst – 目标图像 6. ksize – Sobel算子的大小,必须为1、3、5、7 7. scale – 缩放导数的比例常数,默认情况下没有伸缩系数 8. delta – 可选增量, 将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中 9. borderType – 图像边界的模式。
这个参数默认值为cv2.BORDER_DEFAUL在经过处理后,需要用convertScaleAbs()函数将其转回原来的uint8形式,否则将无法显示图像,而只是一副灰色的窗口。
函数原型:dst=cv2.convertScaleAbs(src[,dst[,alpha[,beta]]]) 其中可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint8类型的图片#absX=cv2.convertScaleAbs(x)#转回uint8#absY=cv2.convertScaleAbs(y)代码截图在图像的读取中,会存在一些噪噪声点,如一些白噪声,因此我们需要进行去噪 *** 作opencv4种去噪 *** 作1. cv2.blur(均值滤波) 2.cv2.boxfilter(方框滤波)3. cv2.Guassiannblur(进行高斯滤波)4. cv2.medianBlur(进行中值滤波)1.cv2.blur(img, (3, 3)) 进行均值滤波参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小2. cv2.boxfilter(img, -1, (3, 3), normalize=True) 表示进行方框滤波,参数说明当normalize=True时,与均值滤波结果相同, normalize=False,表示对加和后的结果不进行平均 *** 作,大于255的使用255表示3. cv2.Guassianblur(img, (3, 3), 1) 表示进行高斯滤波,参数说明: 1表示σ, x表示与当前值得距离,计算出的G(x)表示权重值4. cv2.medianBlur(img, 3) #中值滤波,相当于将9个值进行排序,取中值作为当前值参数说明:img表示当前的图片,3表示当前的方框尺寸阈值处理(cv2.threshold) 后图片opencv: 阈值处理(cv2.threshold)cv2.threshold (src, thresh, maxval, type)src:源图片,必须是单通道thresh:阈值,取值范围0~255maxval:填充色,取值范围0~255type:阈值类型,具体见下表阈值类型图片形态学kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)closed = cv2.erode(closed, None, iterations = 4)closed = cv2.dilate(closed, None, iterations = 4)代码截图通过以上 *** 作,我们已经检测到了条形码的大致位置,然后使用内核函数获取图片外形的形态学,并分别执行4次形态学腐蚀与膨胀,获取更精确的图片形状位置kernel = cv2.getStructuringElement这个函数的第一个参数表示内核的形状,有三种形状可以选择矩形:MORPH_RECT;交叉形:MORPH_CROSS;椭圆形:MORPH_ELLIPSE;第二和第三个参数分别是内核的尺寸以及锚点的位置。
一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值: 对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。
element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
cv2.morphologyEx(src, op, kernel) 进行各类形态学的变化参数说明:src传入的图片op进行变化的方式kernel表示方框的大小2.op = cv2.MORPH_OPEN 进行开运算,指的是先进行腐蚀 *** 作,再进行膨胀 *** 作3. op = cv2.MORPH_CLOSE 进行闭运算, 指的是先进行膨胀 *** 作,再进行腐蚀 *** 作开运算:表示的是先进行腐蚀,再进行膨胀 *** 作闭运算:表示先进行膨胀 *** 作,再进行腐蚀 *** 作cv2.morphologyEx后图片形态学图片转换完成后,进行图片的腐蚀与膨胀,这里主要是获取更精确的外形。
腐蚀与膨胀属于形态学 *** 作,所谓的形态学,就是改变物体的形状,形象理解一些:腐蚀=变瘦 膨胀=变胖,主要是采用 cv2.erode() 和 cv2.dilate(),需要注意一点的是,腐蚀和膨胀主要针对二值化图像的白色部分腐蚀与膨胀后图片图片外轮廓的绘制cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0]c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]rect = cv2.minAreaRect(c)box = cv2.boxPoints(rect)box = np.int0(box)cv2.drawContours(image, [box], -1, (0, 255, 0), 3)cv2.imshow("Image", image)cv2.waitKey(0)代码截图我们通过以上的步骤,已经成功锁定图片条形码的位置,然后使用cv2.findContours函数找到图片的外形,并画出图片的外形。
(_, cnts, _) = cv2.findContours( 参数一: 二值化图像 closed.copy(), 参数二:轮廓类型 # cv2.RETR_EXTERNAL, #表示只检测外轮廓 # cv2.RETR_CCOMP, #建立两个等级的轮廓,上一层是边界 # cv2.RETR_LIST, #检测的轮廓不建立等级关系 # cv2.RETR_TREE, #建立一个等级树结构的轮廓 # cv2.CHAIN_APPROX_NONE, #存储所有的轮廓点,相邻的两个点的像素位置差不超过1 参数三:处理近似方法 # cv2.CHAIN_APPROX_SIMPLE, #例如一个矩形轮廓只需4个点来保存轮廓信息 # cv2.CHAIN_APPROX_TC89_L1, # cv2.CHAIN_APPROX_TC89_KCOS )然后对找到的所有轮廓点进行重新排序sorted(iterable, key=None, reverse=False) 参数说明:iterable -- 可迭代对象。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回值返回重新排序的列表。
排序完成后的list传递给cv2.minAreaRect(Points)函数其中points是点集,数据类型为ndarray,array((x1,y1),(x2,y2),….,(xn,yn))而minAreaRect就是求出在上述点集下的最小面积矩形rect[0]返回矩形的中心点,(x,y),实际上为y行x列的像素点利用cv2.boxPoints(rect)可以返回矩形四个点的值,其中cv2.boxPoints(rect)[0]为point[0],cv2.boxPoints(rect)[1]为point[1].rect[1]返回矩形的长和宽rect[2]返回矩形的旋转角度有了box的外形4个图形点,便可以使用cv2.drawContours函数把4个点连接起来,形成一个矩形轮廓,最后显示图片opencv条形码的检测
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)