如何在二进制图像中找到特定点?

Posted

技术标签:

【中文标题】如何在二进制图像中找到特定点?【英文标题】:How can I find specific points in binary images? 【发布时间】:2021-12-11 10:30:39 【问题描述】:

我正在大学开始一项研究,主题是能够使用 AI 计算视网膜区域。我们规定的第一部分是使用 u-net 分割视网膜的两个重要部分。二是利用分割的结果找到重点并进行计算。

因此,在下图中,我显示了使用 u-net 分割每个区域的输出(红色注释不是分割的一部分)。我尝试代表我想在第一个和第二个块中找到的区域。一旦这样做,我可以在合并它们时计算这些点之间的距离。 所以,我的问题是:我可以使用什么样的技术来读取像素以便找到我标记的坐标?

OpenCV 是一个可以帮助我的库吗?这是我第一次处理这种问题,所以感谢任何建议或指导。

【问题讨论】:

我无法完全理解这 3 个分割区域的含义。您只需要检测图像中的那些标记部分吗?您可能需要澄清问题 二进制图像的基本测量。也许您需要学习 OpenCV 教程 (docs.opencv.org)。可能涉及或不涉及轮廓。坐标的最小/最大计算为您提供这些点。 @YunusTemurlenk 是的,我试着澄清一下。希望现在更好。 @ChristophRackwitz 谢谢你,我会看到 【参考方案1】:

使用 OpenCV: 可以使用 connectedComponentsWithStats() 方法检测边距。

connectivity = 8  
output = cv2.connectedComponentsWithStats(binary_img, connectivity, cv2.CV_32S)

stats = output[2]         # stat matrix

first_blob_left = stats[0,cv2.CC_STAT_LEFT]
first_blob_right = stats[0,cv2.CC_STAT_RIGHT]
second_blob_left = stats[1,cv2.CC_STAT_LEFT]
second_blob_right = stats[1,cv2.CC_STAT_RIGHT]

if first_blob_left < second_blob_left:
    dist = second_blob_left - first_blob_right
else:
    dist = first_blob_left - second_blob_right

可以用同样的方法检测最深点:

connectivity = 8  
output = cv2.connectedComponentsWithStats(binary_img, connectivity, cv2.CV_32S)

stats = output[2]         # stat matrix

blob_top = stats[0,cv2.CC_STAT_TOP]
blob_height = stats[0,cv2.CC_STAT_HEIGHT]

deepest_point_y_position = blob_top + blob_height

注意:此代码未经测试,可能包含一些拼写错误。但是,这个想法仍然保持不变,并且应该不费吹灰之力。

看看

labels = output[1]

“labels”是输入图像所在位置的数组,其中 blob 的每个像素都标记有相同的值。这应该可以帮助您找到边距的坐标

【讨论】:

以上是关于如何在二进制图像中找到特定点?的主要内容,如果未能解决你的问题,请参考以下文章

在matlab中裁剪图像

如何在 Matlab 中找到二进制图像中的所有连通分量?

如何使用 pin 工具跟踪二进制仪器中的特定循环?

将二进制文件从特定地址点填充到地址中的另一个特定地址点

OpenCV - 在二进制图像中找到最大斑点的边界框

二进制图片如何转化为值