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 required libraries import cv2 # load the input image img = cv2.imread('four-point-star.png') # convert the input image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # apply thresholding to convert grayscale to binary image ret,thresh = cv2.threshold(gray,150,255,0) # find the contours contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print("Number of contours detected:", len(contours)) # select the first contour cnt = contours[0] # find the extreme points 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] # draw the points on th image for point in points: cv2.circle(img, point, 4, (0, 0, 255), -1) # display the image with drawn extreme points while True: cv2.imshow("Extreme Points", img) if cv2.waitKey(1) & 0xFF == 27: break cv2.destroyAllWindows()

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


输出

执行上述代码后,将产生以下输出:

Number of contours detected: 1

我们将得到以下显示输出的窗口:


请注意,最左、最右、最上和最下的四个极值点以红色绘制。

示例

在这个 Python 程序中,我们绘制了输入图像中物体的极值点。

# import required libraries import cv2 # load the input image img = cv2.imread('two-shapes.png') # convert the input image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # apply thresholding to convert grayscale to binary image ret,thresh = cv2.threshold(gray,150,255,0) # find the contours contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print("Number of contours detected:", len(contours)) # loop over all the contours for cnt in contours: # extreme points 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] # draw the points on th image for point in points: cv2.circle(img, point, 4, (0, 0, 255), -1) # display the image with drawn extreme points while True: cv2.imshow("Extreme Points", img) if cv2.waitKey(1) & 0xFF == 27: break cv2.destroyAllWindows()

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


输出

执行上述代码后,将产生以下输出:

Number of contours detected: 2

我们将得到以下显示输出的窗口:


请注意,最左、最右、最上和最下的四个极值点以红色绘制。在上面的输出中,绘制了两个不同物体(形状)的极值点。

更新于:2022年12月2日

2K+ 浏览量

开启你的职业生涯

完成课程获得认证

开始学习
广告