gpt4 book ai didi

python - 使用 OpenCV 检测 python 中的畸形 Blob

转载 作者:太空宇宙 更新时间:2023-11-03 22:50:55 26 4
gpt4 key购买 nike

我想检测下图中的两个 Blob :

原文:

enter image description here

我想像这样检测内部:

enter image description here

我还想检测到外圈:

enter image description here

但我现在正在应用 OpenCV 的简单 Blob 检测,但它没有给我想要的结果。这是我的代码:

# Set up the detector with default parameters.
detector = cv2.SimpleBlobDetector()

# Detect blobs.
keypoints = detector.detect(image)

# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(image, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show keypoints
final = Image.fromarray(im_with_keypoints)
final.show()

但这就是 Blob 检测器检测到的:

enter image description here

OpenCV 中的 Hugh Circle 检测也无法正确识别这两个形状。

更新:我也试过椭圆拟合,但不是检测任何一个 Blob ,而是检测图像中的一些随机线。这是我用于椭圆拟合的代码。

ret,thresh = cv2.threshold(image,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)

cnt = contours[0]
M = cv2.moments(cnt)
print M

cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(im2,ellipse,(0,255,0),2)

final = Image.fromarray(image)
final.show()

感谢您提供检测这些 Blob 的任何帮助。

最佳答案

为了检测内部 blob,您还可以尝试聚类和 MSER s,因为该区域看起来是平坦的。我对您的图像的裁剪版本进行了降采样并应用了这些技术。

下采样图像

downsampled

这里我使用 kmeans 和 10 个集群。缺点是您必须指定集群的数量。

clustered

这里我使用 MSER。它更健壮。

mser

代码是用c++写的。请注意,您必须缩放输出以查看详细信息。

Mat im = imread("2L6hP.png", 0);
Mat dw;
pyrDown(im, dw);

// kmeans with 10 clusters
int k = 10;
Mat rgb32fc, lbl;
dw.convertTo(rgb32fc, CV_32F);
int imsize[] = {rgb32fc.rows, rgb32fc.cols};
Mat color = rgb32fc.reshape(1, rgb32fc.rows*rgb32fc.cols);
kmeans(color, k, lbl, TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0), 2, KMEANS_PP_CENTERS);
Mat lbl2d = lbl.reshape(1, 2, imsize);
Mat lbldisp; // clustered result
lbl2d.convertTo(lbldisp, CV_8U, 1);

// MSER
MSER mser;
vector<vector<Point>> regions;

mser(dw, regions);
Mat regionsMat = Mat::zeros(dw.rows, dw.cols, CV_8U); // MSER result

for (size_t i = 0; i < regions.size(); i++)
{
for (Point pt: regions[i])
{
uchar& val = regionsMat.at<uchar>(pt);
if (val > 0)
{
val += 1;
}
else
{
val = 1;
}
}

}

关于python - 使用 OpenCV 检测 python 中的畸形 Blob ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37853987/

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