I 放缩图片
import cv2
img = cv2.imread('123.png',cv2.IMREAD_GRAYSCALE)
up = cv2.pyrUp(img)
up = cv2.pyrDown(img)
cv2.imshow("0",img)
cv2.imshow("1",up)
cv2.imshow("2",down)
print(img.shape)
print(up.shape)
print(down.shape)
使用上采样和下采样会丢失图片原有数据,连续上采样一次下采样一次,图片会变得模糊
II 图像的轮廓检测
为了高准确率,轮廓检测使用二值图像
①检测图像轮廓函数
cv2.findContours(图片对象,轮廓的检测模式,逼近方法)
1 二个返回值
第一个:轮廓信息
第二个:层级
2 轮廓的检测模式:
cv2.RETR_EXTERNAL:只检测最外面的轮廓
cv2.RETR_LIST:检测所有的轮廓,并保存到链表当中
cv2.RETR_CCOMP:
-----------------------检测多有的轮廓将他们组织为两层;顶层是各部分的外部边界,
-----------------------第二层是空洞的边界
cv2.RETR_TREE:检测所有的轮廓,并重构嵌套轮廓的整个层次(常用)
3 轮廓的逼近方法:
cv2.CHAIN_APPROX_NONE:
cv2.CHAIN_APPROX_SIMPLE
②绘制图像轮廓函数
cv2.drawCountours(图片对象,轮廓对象,哪个轮廓,什么颜色,线条厚度)
哪个轮廓:
值可以为 -1 表示全部 其他值代表第几个
③示例
import cv2
rgb = cv2.imread('123.png') #原图
gray = cv2.imread('123.png',cv2.IMREAD_GRAYSCALE)#灰度图
#--------------------把灰度图转化为二值图--------------------------#
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#比较器,超过127取255 否则取0
#----------------------------------------------------------------#
b,c = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#图像的轮廓检测 b是一个列表
rgb1 = rgb.copy() #复制一张原图
cv2.drawContours(rgb1,b,-1,(0,0,255),2)#在原图的备份上用红笔圈出轮廓
cv2.imshow("x",rgb)
cv2.imshow("y",rgb1)
④计算轮廓面积与周长函数
cnt = b[0]
cv2.contourArea(cnt) #算面积
cv2.arcLength(cnt,True) #算周长 True代表闭合
⑤轮廓的近似
将轮廓近似为规整线条
cv2.approxPolyDP(哪个轮廓,比较值,True) #比较值一般取周长的百分比
比较值 value = 0.1*cv2.arcLength(b[0],True)
import cv2
rgb = cv2.imread('1.png')
gray = cv2.imread('1.png',cv2.IMREAD_GRAYSCALE)
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
b,c = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
rgb1 = rgb.copy() #复制一张原图
cv2.drawContours(rgb1,b[1],-1,(0,0,255),2)#在原图的备份上用红笔圈出轮廓
#--------------------------------------------------------------------#
value = 0.1*cv2.arcLength(b[1],True)
approx = cv2.approxPolyDP(b[1],value,True)
rgb2 = rgb.copy() #复制一张原图
cv2.drawContours(rgb2,[approx],-1,(0,0,255),2)#在原图的备份上用红笔圈出轮廓
#[approx] 得加个框框才是列表 才能把线连 出来
cv2.imshow("x",rgb1)
cv2.imshow("y",rgb2)
III 绘制边界矩形
import cv2
img = cv2.imread('1.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
res, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, h = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[1]
x, y, w, h = cv2.boundingRect(cnt)
img1 = img.copy()
ret = cv2.rectangle(img1, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.imshow("y",img)
cv2.imshow("x",ret)
print('矩形面积 / 外接矩形面积', cv2.contourArea(cnt) / (w*h))
IV 绘制外接圆
import cv2
img = cv2.imread('1.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
res, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, h = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[1]
ret = img.copy()
(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
ret = cv2.circle(ret, center, radius, (0, 255, 0), 2)
cv2.imshow("y",img)
cv2.imshow("x",ret)