OpenCV Python如何在图像上找到并绘制对象的极值点?

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()

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

OpenCV Python如何在图像上找到并绘制对象的极值点?

输出

执行上述代码时,它将产生以下输出 –

检测到的轮廓数量:1

我们得到以下窗口显示输出 –

OpenCV Python如何在图像上找到并绘制对象的极值点?

请注意,左侧、右侧、顶部和底部四个极点以红色显示。

示例

在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()

我们将使用以下图像作为 输入文件 运行这个程序 –

OpenCV Python如何在图像上找到并绘制对象的极值点?

输出

当我们执行上述代码时,将会产生以下输出 –

检测到的轮廓数目: 2

我们将得到下面的窗口显示输出-

OpenCV Python如何在图像上找到并绘制对象的极值点?

请注意,最左、最右、最上和最下的极点用红色标出。在上述输出中,绘制了两个不同对象(形状)的极点。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV