OpenCV-图像轮廓一

图像轮廓的概念

边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。
图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的操作,我们能够获取目标图像的大小、位置、方向等信息。
轮廓是一系列相连的点组成的曲线,代表了物体的基本外形,相对于边缘,轮廓是连续的,边缘并不全部连续。
查找并绘制轮廊
一个轮廊对应着一系列的点,这些点以某种方式表示图像中的一条曲线。在OpenCV中,函数cv2.findContours()用于查找图像的轮廊,并能够根据参数返回特定表示方式的轮廊(曲线)。函数cv2。drawContours()能够将查找到的轮廊绘制到图像上,该函数可以根据参数在图像上绘制不同方式(实心/空心点,以及线条的不同粗细、颜色等)的轮廊,可以绘制全部轮廊也可以仅绘制指定的轮廊。
查找
寻找轮廓的操作一般用于二值化图,所以通常会使用阈值分割或
Canny边缘检测先得到二值图。
在这里插入图片描述

cv2.findContours()函数

contours,hierarchy=cv2.findContours(image,mode,method)
contours:返回的轮廓。例如contours[i]表示第i个轮廓。
hierarchy:图像的拓扑信息(轮廓层次)。
image:输入的图像。
mode:轮廓搜索模式:决定了轮廓的提取方式。
method:轮廓近似方法:决定了如何表达轮廓。

import cv2
import numpy as np
img = cv2.imread('shape.jpg')    #读取图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转为灰度值图
ret, binary = cv2.threshold(gray,220,255,cv2.THRESH_BINARY) #转为二值图
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,\
                                       cv2.CHAIN_APPROX_NONE) #寻找轮廓
n=len(contours)       #轮廓个数
print(n)
print(len(contours[0]))       #轮廓0像素数目
print(len(contours[1]))       #轮廓1像素数目
print(len(contours[2]))       #轮廓2像素数目
print(len(contours[3]))       #轮廓3像素数目

绘制

image=cv2.drawContours(image, contours, contourIdx, 
color, thickness=None, lineType=None, hierarchy=None, 
maxLevel=None, offset=None)
cv2.imshow("img",img) #显示原图像
img2 = cv2.drawContours(img,contours,1,(0,165,255),-1)  #绘制轮廓,1表示绘制第几个轮廓
cv2.imshow("contours",img2)   #显示轮廓
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

逐个绘制一幅图像内的边缘信息

n=len(contours)       #轮廓个数
contoursImg=[]
for i in range(n):
    temp=np.zeros(img.shape,np.uint8) #生成黑背景
    contoursImg.append(temp)
    contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,(255,255,255), 3)  #绘制轮廓
    cv2.imshow("contours[" + str(i)+"]",contoursImg[i])   #显示轮廓
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

实物轮廊检测

mport cv2
import numpy as np
img = cv2.imread('pig.jpg')
cv2.imshow("img",img)   #显示原图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)      #转为灰度图
ret, binary = cv2.threshold(gray,245,255,cv2.THRESH_BINARY_INV)  #转为二值图
cv2.imshow("binary" ,binary)        #显示二值化结果
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)#寻找轮廓
mask=np.zeros(img.shape,np.uint8)  #生成黑背景,即全为0
mask=cv2.drawContours(mask,contours,-1,(255,255,255),-1)  #绘制轮廓,形成掩膜
cv2.imshow("mask" ,mask)        #显示掩膜
result=cv2.bitwise_and(img,mask)   #按位与操作,得到掩膜区域
cv2.imshow("result" ,result)     #显示图像中提取掩膜区域
cv2.waitKey()
cv2.destroyAllWindows(
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值