接着折腾 轮廓检测。。
cv2.findContours函数可以找到图像中不规则的、歪斜的及旋转的形状。对这些找到的图形研究一下。。
我们在在返回的轮廓数据中,要用矩形框、最小的矩形框、最小的封闭圆标识出来,这对图形研究比较重要
img = cv2.imread('img/guo.jpg',cv2.IMREAD_UNCHANGED)
imgD = cv2.pyrDown(img)
cv2.imshow('dowD', imgD)
ret, thresh = cv2.threshold(cv2.cvtColor(imgD.copy(),cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_OTSU)
contours, hier = cv2.findContours(thresh,cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
for c in contours:
# 用绿色矩形框将找到的轮廓数据框起来
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(imgD, (x,y),(x+w,y+h),(0,255,0), 2)
# 用红色显示包围的最小矩形框
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(imgD, [box], 0 ,(0,0,255),3)
#用绿色显示最小圆
(x,y),radius = cv2.minEnclosingCircle(c)
# print(x,y,radius)
center = (int(x), int(y))
radius = int(radius)
# print(x, y, radius)
cv2.circle(imgD,center,radius,(0,255,0), 2)
#蓝色边框 标识所有轮廓 不规则的边框
cv2.drawContours(imgD,contours, -1, (255,0,0), 2)
cv2.imshow('imgd',imgD)
蓝色不规则边框 标记所有边框、红色矩形标识最小矩形框,绿色圆标识最小闭合的圆
其中,用到了:
cv2.boundingRect 用最小的矩形框将图形包围起来,不旋转,返回:左下角坐标、矩形的长宽
cv2.minAreaRect 返回最小外接矩形,返回的数据:中心点坐标、长宽、旋转角度
通过cv2.boxPoints,将数据转换为4个顶点的坐标
4个顶点的一组坐标表示的轮廓,直接放到一个数组里,传递个绘制轮廓的函数cv2.drawContours来绘制
cv2.minEnclosingCircle 返回轮廓的最小包围圆,返回的数据:中心点坐标、圆的半径
在返回的结果中,发现小的轮廓点比较多,可以通过计算面积 cv2.contourArea,去除一部分点
for c in contours:
area = cv2.contourArea(c)
if area< 100:
continue
苹果上的反光点的轮廓数据去除了
只绘制大面积的轮廓,去掉小点
for c in contours:
area = cv2.contourArea(c)
if area< 50:
continue
cv2.drawContours(imgD, c, -1, (255, 0, 0), 2)
有一些小小的误差 总体效果感觉还挺浪。。。。
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低
OpenCV实现了用于创建图像金字塔的两个函数:下采样pyrDown()和上采样pryUp()
img = cv2.imread('img/boxdemo.jpg',cv2.IMREAD_UNCHANGED)
cv2.imshow('dow', img)
imgD = cv2.pyrDown(img)
cv2.imshow('dowD', imgD)
imgU = cv2.pyrUp(img)
cv2.imshow('dowU', imgU)