OpenCV图像金字塔与轮廓检测

这篇博客介绍了图像处理中的关键概念,包括使用OpenCV库实现高斯金字塔和拉普拉斯金字塔,展示了图像的上采样和下采样效果。接着,博主探讨了图像轮廓检测,详细解释了不同轮廓检测模式和轮廓逼近方法,并通过实例展示了如何找到和绘制图像轮廓。此外,还讨论了轮廓特征,如面积和周长的计算,以及轮廓近似和边界框的应用。
摘要由CSDN通过智能技术生成

一、高斯金字塔

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread('./cat.jpg', cv2.IMREAD_COLOR)
b, g, r = cv2.split(img)
img = cv2.merge((r, g, b))

pyrup = cv2.pyrUp(img)          #向上采样
pyrdown = cv2.pyrDown(img)      #向下采样

plt.figure()
plt.subplot(1, 3, 1)
plt.imshow(img, 'gray')
plt.title('ORIGINAL')

plt.subplot(1, 3, 2)
plt.imshow(pyrup, 'gray')
plt.title('PYRUP')

plt.subplot(1, 3, 3)
plt.imshow(pyrdown, 'gray')
plt.title('PYRDOWN')

plt.show()

pyr

二、拉普拉斯金字塔

三、图像轮廓

cv2.findContours(img, mode, method)

mode:轮廓检测模式

    ### RETR_EXTERNAL:只检测最外面的轮廓

    ### RETR_LIST:检测所有轮廓,并将其保存到链表中

    ### RETR_CCOMP:检测所有轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界

    ### RETR_TREE:检测所有轮廓,并重构嵌套轮廓的整个层次 (!!通常用这个)

method:轮廓逼近方法

    ### CHAIN_APPROX_NONE:以Freeman链码方式输出轮廓,所有其他方法输出多边形

    ### CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread('./graph.png', cv2.IMREAD_COLOR)
img = cv2.resize(img, (0, 0), fx=0.25, fy=0.25)

#转换成二值图方便计算
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)

binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

#绘制轮廓
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)  #-1:绘制全部,2:线条宽度

def transform(img):
    b, g, r = cv2.split(img)
    return cv2.merge((r, g, b))

plt.figure()
plt.subplot(1, 3, 1)
plt.imshow(transform(img), 'gray')
plt.title('ORIGINAL')

plt.subplot(1, 3, 2)
plt.imshow(thresh, 'gray')
plt.title('THRESH')

plt.subplot(1, 3, 3)
plt.imshow(transform(res), 'gray')
plt.title('RES')

plt.show()

轮廓

四、轮廓特征

#轮廓特征
cnt = contours[0]
print(cv2.contourArea(cnt))     #计算面积
print(cv2.arcLength(cnt, True)) #计算周长,True表示闭合

五、轮廓近似

#轮廓近似
epsilon = 0.1*cv2.arcLength(cnt, True)  #近似参考长度
approx = cv2.approxPolyDP(cnt, epsilon, True)

draw_img = img.copy()
res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)

cv2.imshow('title', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

六、边界矩形

x, y, w, h = cv2.boundingRect(cnt)
res = cv2.rectangle(draw_img, (x, y), (x+w, y+h), (0, 0, 255), 2)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值