当前位置: 首页 > 面试题库 >

使用Python OpenCV查找图像中的极端外部点

佴涵蓄
2023-03-14
问题内容

我有这个雕像的形象。

在此处输入图片说明

我正在尝试找到雕像上最顶部,最底部,最左侧和最右侧的点。有没有一种方法可以测量每边的边缘以确定雕像上最外面的点?我想得到双方的(x,y)坐标。我试图使用cv2.findContours()cv2.drawContours()获得雕像的轮廓。

import cv2

img = cv2.imread('statue.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

contours = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(img, contours, -1, (0, 200, 0), 3)

cv2.imshow('img', img)
cv2.waitKey()

问题答案:

这是一种潜在的方法:

  • 将图像转换为灰度和高斯模糊
  • 获取二进制图像的阈值
  • 查找轮廓
  • 获取外部坐标

转换为灰度并模糊图像后,我们阈值以获取二进制图像

现在我们使用找到轮廓cv2.findContours()。由于OpenCV使用Numpy数组对图像进行编码,因此轮廓只是一个Numpy(x,y)坐标数组。我们可以对Numpy数组进行切片并使用argmin()argmax()确定像这样的外部左,右,上和下坐标

left = tuple(c[c[:, :, 0].argmin()][0])
right = tuple(c[c[:, :, 0].argmax()][0])
top = tuple(c[c[:, :, 1].argmin()][0])
bottom = tuple(c[c[:, :, 1].argmax()][0])

这是结果

左:(162,527)

右:(463,467)

最高:(250,8)

底部:(381,580)

import cv2
import numpy as np

# Load image, grayscale, Gaussian blur, threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 220, 255, cv2.THRESH_BINARY_INV)[1]

# Find contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
c = max(cnts, key=cv2.contourArea)

# Obtain outer coordinates
left = tuple(c[c[:, :, 0].argmin()][0])
right = tuple(c[c[:, :, 0].argmax()][0])
top = tuple(c[c[:, :, 1].argmin()][0])
bottom = tuple(c[c[:, :, 1].argmax()][0])

# Draw dots onto image
cv2.drawContours(image, [c], -1, (36, 255, 12), 2)
cv2.circle(image, left, 8, (0, 50, 255), -1)
cv2.circle(image, right, 8, (0, 255, 255), -1)
cv2.circle(image, top, 8, (255, 50, 0), -1)
cv2.circle(image, bottom, 8, (255, 255, 0), -1)

print('left: {}'.format(left))
print('right: {}'.format(right))
print('top: {}'.format(top))
print('bottom: {}'.format(bottom))
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()


 类似资料:
  • 我正在尝试建立一个带有外部文件链接的PDF文件。 我使用的规范是https://www.adobe.com/content/dam/adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf 在第348页上有一个具有远程加载的替代图像的图像示例。当我使用文档中的示例创建文档时,阅读器(使用acrobat reader XI)不会获取图像。没有错误消息,但没

  • 我试图从opengl FrameBuffer中保存的深度数据渲染三维点云。基本上,我从不同的n个视点(已经知道)对以(0,0,0)为中心的渲染模型取了不同的深度样本。我成功地保存了深度图,但现在我想从这些深度图中提取x,y,z。为此,我从图像向世界反投影点。为了得到世界坐标,我使用以下方程P=K_inv[Rt]_inv*P。来计算世界坐标。 为了计算图像的本质矩阵,我使用了来自opengl相机矩阵

  • 问题内容: 我有两个从PIL图像转换的Numpy数组(3维uint8)。 我想查找第一张图像是否包含第二张图像,如果是,则找出匹配的第一张图像内左上像素的坐标。 有没有一种方法可以在Numpy中以足够快的方式完成此操作,而不是使用(4!非常慢)纯Python循环? 2D示例: 怎么做这样的事情? 然后将是。 问题答案: 这可以使用SciPy的公司来完成correlate2d,然后用argmax找到

  • 问题内容: 我正在尝试从图像中提取红色。我有应用阈值的代码,仅保留指定范围内的值: 但是,正如我检查的那样,红色的色相值可以在0到10的范围内,也可以在170到180的范围内。因此,我想保留这两个范围中任何一个的色相值。我尝试将阈值从10设置为170并使用函数,但随后我也获得了所有白色。我认为最好的选择是为每个范围创建一个遮罩并同时使用它们,因此我必须以某种方式将它们合并在一起,然后再继续。 有没

  • 这是我得到的错误消息

  • 我有一个SWT按钮,它不包含文本,只是一个图像。我搜索了方法,但我找不到按它的方法。