OpenCV Python如何在图像上找到并绘制对象的极值点?
要找到并绘制输入图像中对象的极值点,我们可以按照以下步骤进行 –
- 第一步是导入所需库。在所有下面的Python示例中,所需的Python库是 OpenCV 。确保您已经安装了它。
-
下一步是使用 cv2.imread() 函数读取输入图像。使用图像类型(.jpg或.png)指定完整图像路径。将输入图像转换为灰度。
-
在灰度图像上应用阈值处理,以创建二进制图像。调整第二个参数以获得更好的轮廓检测。
ret,thresh = cv2.threshold(gray,150,255,0)
- 使用 cv2.findContours() 函数在图像中查找轮廓。
contours,_ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
-
从轮廓列表中选择轮廓(假设是第一个轮廓) cnt 或循环遍历所有轮廓。
-
查找最左侧、最右侧、最顶部和最底部的极值点。
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
-
在图像上绘制这些极值点。要在图像上绘制一个点,我们绘制一个半径很小的实心圆。
-
显示带有绘制轮廓和近似轮廓的图像。
让我们通过一些Python示例来了解如何在图像中找到并绘制对象的极值点。
示例
下面的Python 3程序显示了如何在图像中查找并绘制对象的极值点。
# 导入必要的库
import cv2
# 加载输入图像
img = cv2.imread('four-point-star.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))
# 选择第一个轮廓
cnt = contours[0]
# 查找最极端的点
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
points = [leftmost, rightmost, topmost, bottommost]
# 在图像上绘制极端点
for point in points:
cv2.circle(img, point, 4, (0, 0, 255), -1)
# 显示带有绘制的极端点的图像
while True:
cv2.imshow("极端点", img)
if cv2.waitKey(1) & 0xFF == 27:
break
cv2.destroyAllWindows()
我们将使用以下图像作为此程序的输入文件 –
输出
执行上述代码时,它将产生以下输出 –
检测到的轮廓数量:1
我们得到以下窗口显示输出 –
请注意,左侧、右侧、顶部和底部四个极点以红色显示。
示例
在Python的程序中,我们绘制出输入图像中物体的极点。
# 导入所需的库
import cv2
# 加载输入图像
img = cv2.imread('two-shapes.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))
# 循环遍历所有轮廓
for cnt in contours:
# 极点
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
points = [leftmost, rightmost, topmost, bottommost]
# 在图像上画出这些点
for point in points:
cv2.circle(img, point, 4, (0, 0, 255), -1)
# 显示带有绘制的极点的图像。
while True:
cv2.imshow("极点", img)
if cv2.waitKey(1) & 0xFF == 27:
break
cv2.destroyAllWindows()
我们将使用以下图像作为 输入文件 运行这个程序 –
输出
当我们执行上述代码时,将会产生以下输出 –
检测到的轮廓数目: 2
我们将得到下面的窗口显示输出-
请注意,最左、最右、最上和最下的极点用红色标出。在上述输出中,绘制了两个不同对象(形状)的极点。