OpenCV(七) —— 图像金字塔(拉普拉斯金字塔) & 轮廓检测(轮廓特征 & 轮廓近似 & 轮廓绘制 & 边界矩形 & 外接圆 ) & 傅里叶变换

图像金字塔与轮廓检测

图像金字塔

从下往上走叫向下采样

如果先执行上采样再执行下采样得到的图片大小可能和原来一样,但是清晰度会变的,会损失一些信息,因为扩大的时候是拿0来填充的

拉普拉斯金字塔

图像轮廓

之前图像的边缘检测,是零零散散的线段,不能算作轮廓。轮廓首先得是一个整体的

为了更高的准确率,用二值图像

import cv2  
  
img = cv2.imread('contours.png')  
img_gray = cv2.cvtColor(img, code = cv2.COLOR_BGR2GRAY)  
ret, img_binary = cv2.threshold(img_gray, thresh=127, maxval=255, type=cv2.THRESH_BINARY)  
cv2.imshow('Image',img)
cv2.waitKey(0)
contours, hierarchy = cv2.findContours(img_binary, mode = cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE)  
draw_img = img.copy()
cv2.drawContours(draw_img, contours, contourIdx=-1, color = (0,0,255), thickness = 2)  
cv2.imshow("img", draw_img)  
cv2.waitKey(0)  
draw_img = img.copy()
cv2.drawContours(draw_img, contours, contourIdx=0, color = (0,0,255), thickness = 2)  
cv2.imshow("img", draw_img)  
cv2.waitKey(0)  

得到的contours是一个list,每个轮廓一项,每项是n个点,由这些点可以画出轮廓

如果不img.copy(), drawContours就会把原图像改变了

轮廓特征

可以求面积,周长等

import cv2  
  
img = cv2.imread('contours.png')  
img_gray = cv2.cvtColor(img, code = cv2.COLOR_BGR2GRAY)  
ret, img_binary = cv2.threshold(img_gray, thresh=127, maxval=255, type=cv2.THRESH_BINARY)  
# cv2.imshow('Image',img)
# cv2.waitKey(0)
contours, hierarchy = cv2.findContours(img_binary, mode = cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE)  

cnt = contours[0]  
print(cnt.shape)
#面积
area = cv2.contourArea(cnt)
print(area)
#周长,True表示闭合的
arclength = cv2.arcLength(cnt,True)
print(arclength)

轮廓近似

边界矩形

就是外接矩形

contours[x]  x的不同会选择不同的图形

外接圆

傅里叶变换

blog-code/图像处理.ipynb at master · skyerhxx/blog-code · GitHub

blog-code/图像操作.zip at master · skyerhxx/blog-code · GitHub

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值