图像金字塔与轮廓检测
图像金字塔
从下往上走叫向下采样
如果先执行上采样再执行下采样得到的图片大小可能和原来一样,但是清晰度会变的,会损失一些信息,因为扩大的时候是拿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