如何使用OpenCV Python计算图像对象的范围?

如何使用OpenCV Python计算图像对象的范围?

对象的范围被计算为轮廓面积与其边界矩形面积的比率。因此,为了计算范围,我们首先必须找到轮廓面积和边界矩形面积。可以使用cv2.contourArea()函数找到对象的轮廓面积。

语法

如下所示可以计算范围 –

area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area

这里,“ cnt ”是图像中对象轮廓点的numpy数组。

步骤

您可以使用以下步骤计算图像中对象的范围 –

导入所需的库。在接下来的所有Python示例中,所需的Python库为 OpenCV 。请确保您已经安装了它。

import cv2

使用 cv2.imread() 读取输入图像并将其转换为灰度。

img = cv2.imread('star1.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

对灰度图像进行阈值处理,创建二进制图像。调整第二个参数以更好地检测轮廓。

ret, thresh = cv2.threshold(gray, 150, 255, 0)

使用 cv2.findContours() 函数在图像中查找轮廓。

contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

选择轮廓“ cnt ”或循环遍历所有轮廓。将范围计算为轮廓面积与边界矩形面积的比率。

cnt = contours[0]
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area

可以选择在输入图像上绘制轮廓和边界矩形。还在图像上将范围作为文本显示。

cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)

打印计算出的范围,并显示带有绘制的轮廓、边界矩形的图像。

print("对象的范围:  
", ext)
cv2.imshow("Extent", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

下面看一些示例,以获得更好的理解。

示例1:

在此Python程序中,我们计算图像中对象的范围。我们在图像上为对象绘制轮廓和边界矩形。我们还将范围值作为对象的文本。

# 导入必要的库
import cv2

# 加载输入图像
img = cv2.imread('star1.png')

# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用阈值将灰度图像转换为二进制图像
ret,thresh = cv2.threshold(gray,150,255,0)

# 查找轮廓
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的对象数:",len(contours))

# 定义计算范围的函数
def extent(cnt):
   area = cv2.contourArea(cnt)
   x,y,w,h = cv2.boundingRect(cnt)
   rect_area = w*h
   extent = float(area)/rect_area
   return extent

# 选择第一个轮廓
cnt = contours[0]

# 查找范围
ext = extent(cnt)

# 将范围四舍五入到三个小数点
ext = round(ext, 3)

# 绘制轮廓
cv2.drawContours(img,[cnt],0,(0,255,0),2)

# 绘制边框矩形
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

# 在图像上放置文本
cv2.putText(img, f'Extent={ext}', (x, y), cv2.FONT_HERSHEY_SIMPLEX,  0.6, (0,0,255), 2)

print("对象的范围:",ext)
cv2.imshow("范围", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们将使用以下图像作为程序中的 输入文件

输出

当我们执行上面的代码时,它将生成以下输出 −

检测到的对象数:1
对象的范围:0.487

并且我们得到以下的输出窗口 −

如何使用OpenCV Python计算图像对象的范围?

轮廓用绿色绘制,边界矩形用蓝色绘制。检测到的对象的范围用红色写出。

示例2

在这个Python程序中,我们计算图像中多个对象的范围。我们在图像上绘制轮廓和边界矩形。我们还将所有对象的范围作为文本放置在上面。

# 导入所需库
import cv2

# 加载输入图像
img = cv2.imread('shapes2.png')

# 将图像转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用阈值处理,将灰度转换为二进制图像
ret,thresh = cv2.threshold(gray,40,255,0)

# 查找轮廓
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的物体数量:", len(contours))

# 定义计算范围的函数
def extent(cnt):
   area = cv2.contourArea(cnt)
   x,y,w,h = cv2.boundingRect(cnt)
   rect_area = w*h
   extent = float(area)/rect_area
   return extent

# 循环所有轮廓
for i, cnt in enumerate(contours):
   ext = extent(cnt)
   ext = round(ext, 2)
   x,y,w,h = cv2.boundingRect(cnt)
   img = cv2.drawContours(img,[cnt],0,(0,255,0),2)
   img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
   cv2.putText(img, f'Extent={ext}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
   print(f"物体{i+1}的范围:, ext)

cv2.imshow("范围", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们将使用以下图像作为此程序的输入文件 –

如何使用OpenCV Python计算图像对象的范围?

输出

当我们执行上面的代码时,它将产生以下输出 –

检测到的对象数量:7 
对象1的范围:0.98 
对象2的范围:0.49 
对象3的范围:0.48 
对象4的范围:0.67 
对象5的范围:0.73 
对象6的范围:0.49 
对象7的范围:0.77

我们得到以下输出window −

如何使用OpenCV Python计算图像对象的范围?

轮廓用绿色绘制,边界矩形用黄色绘制。检测到的对象的范围用红色书写。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV