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
我们将得到以下显示输出的窗口:
请注意,最左、最右、最上和最下的四个极值点以红色绘制。在上面的输出中,绘制了两个不同物体(形状)的极值点。
广告