gpt4 book ai didi

python - 获取不规则形状的中心

转载 作者:行者123 更新时间:2023-12-05 08:37:16 29 4
gpt4 key购买 nike

我的形状不规则,如下所示:

enter image description here

我需要得到那个白色区域的中心,我只是尝试在 openCV 中使用轮廓,如下所示

img=cv.imread('mypic',0)
ret,thresh = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
cnts = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL,
cv.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
x,y,w,h = cv.boundingRect(cnt)
res_img = cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv.imwrite('output.png',res_img)

但是那些 cnts 并没有给我很好的结果,因为你可以看到原始图像和图片下方的两个小黑点。有人可以指出一个好的解决方案来获得如上所示的不规则形状的中心吗?

enter image description here

最佳答案

按照我的建议,对二进制图像执行腐 eclipse ,然后执行膨胀(操作),然后计算中心矩 并使用此信息计算质心。这些是步骤:

  1. 通过Otsu's Thresholding从输入中获取二值图像
  2. 使用 cv2.moments
  3. 计算 中心矩
  4. 使用先前的信息计算 blob 的质心

让我们看一下代码:

import cv2
import numpy as np

# Set image path
path = "C:/opencvImages/"
fileName = "pn43H.png"

# Read Input image
inputImage = cv2.imread(path+fileName)

# Convert BGR to grayscale:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Threshold via Otsu + bias adjustment:
threshValue, binaryImage = cv2.threshold(grayscaleImage, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

这是您获得的二进制图像。注意小噪音:

opening 操作将去除小块。一个矩形结构元素就足够了,让我们使用3迭代:

# Apply an erosion + dilation to get rid of small noise:

# Set kernel (structuring element) size:
kernelSize = 3

# Set operation iterations:
opIterations = 3

# Get the structuring element:
maxKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernelSize, kernelSize))

# Perform closing:
openingImage = cv2.morphologyEx(binaryImage, cv2.MORPH_OPEN, maxKernel, None, None, opIterations, cv2.BORDER_REFLECT101)

这是过滤后的图像:

现在,计算中心矩,然后计算 blob 的质心:

# Calculate the moments
imageMoments = cv2.moments(openingImage)

# Compute centroid
cx = int(imageMoments['m10']/imageMoments['m00'])
cy = int(imageMoments['m01']/imageMoments['m00'])

# Print the point:
print("Cx: "+str(cx))
print("Cy: "+str(cy))

此外,让我们将这个点绘制到二值图像上以查看结果:

# Draw centroid onto BGR image:
bgrImage = cv2.cvtColor(binaryImage, cv2.COLOR_GRAY2BGR)
bgrImage = cv2.line(bgrImage, (cx,cy), (cx,cy), (0,255,0), 10)

这是结果:

关于python - 获取不规则形状的中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65930839/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com