如何使用OpenCV Python计算图像中物体的长宽比?
在图像处理中,计算目标物体的长宽比常常是非常重要的一项工作。比如在红外图像中,通过计算长宽比可以判断目标物体是人类还是动物,从而提高识别率。在计算长宽比时,OpenCV和Python的组合可以极大地简化计算过程。
导入库
首先,我们需要导入必要的库。使用cv2
库来读取和处理图像,使用numpy
库来进行数学计算。
import cv2
import numpy as np
读取图像
在计算长宽比之前,首先需要读取图像。使用cv2.imread
函数来读取图像文件。在本例中,我们假设图像已经存储在当前目录中,文件名为image.jpg
。
img = cv2.imread('image.jpg')
转换成灰度图像
计算长宽比时,我们只需要处理灰度图像即可。使用cv2.cvtColor
函数将彩色图像转换成灰度图像:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
二值化处理
接下来,我们需要将灰度图像转换成二值图像。使用cv2.threshold
函数将图像进行二值化处理。
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
cv2.threshold
函数的参数解释如下:
gray
:灰度图像;0
:阈值,这里设置为0;255
:在阈值上方的像素的值;cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU
:使用cv2.THRESH_BINARY_INV
反转图像,使用cv2.THRESH_OTSU
方法自动计算阈值。
查找轮廓
在得到二值化图像之后,我们需要查找图像中的轮廓。使用cv2.findContours
函数可以找到与给定图像中的所有轮廓。
_, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.findContours
函数的参数解释如下:
thresh
:二值图像,即上一步中得到的图像;cv2.RETR_EXTERNAL
:只返回最外层的轮廓;cv2.CHAIN_APPROX_SIMPLE
:只保留轮廓的拐点,压缩轮廓。
计算宽度和高度
在找到轮廓之后,我们就可以计算目标物体的长和宽。在本例中,我们假设只有一个轮廓,因此我们只会在找到的轮廓中计算长宽比。
cnt = contours[0]
x, y, w, h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h
cv2.boundingRect
函数可以找到一个轮廓的边界框,其中x
和y
表示边框左上角的坐标,w
和h
表示边框的宽度和高度。最后,我们可以使用以下代码计算出长宽比:
aspect_ratio = float(w)/h
绘制矩形框
还可以在原图像中绘制边界框以展示目标物体。使用cv2.rectangle
函数绘制矩形框。
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.rectangle
函数的参数解释如下:
img
:表示需要将矩形框绘制在原图像上;(x, y)
:表示矩形框的左上角坐标;(x+w, y+h)
:表示矩形框的右下角坐标;(0, 255, 0)
:表示矩形框的颜色,这里设置为绿色;2
:表示矩形框的线宽。
完整代码
综合以上步骤,我们可以得到以下完整代码。
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
_, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
x, y, w, h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结论
通过使用OpenCV和Python,我们可以方便地计算图像中物体的长宽比。首先,我们需要读取图像并将其转换成灰度图像和二值图像。然后,我们可以通过查找轮廓来计算出目标物体的长宽比。最后,我们可以在原图像中绘制矩形框来展示目标物体。