OpenCV5 成比例放缩图像 与 轮廓检测

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(图片对象,轮廓对象,哪个轮廓,什么颜色,线条厚度)
哪个轮廓:

扫描二维码关注公众号,回复: 11708188 查看本文章

值可以为 -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)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/helloworld573/article/details/105372719