如何测量字母T所有像素之间的距离,尤其是边缘像素间的距离
字母T边缘像素距离计算最优方案
核心结论:针对你需要优先计算边界像素距离的需求,先提取轮廓再做距离计算是最优方案,相比直接对所有黑色像素运算,可减少90%以上的冗余计算量。
具体实现步骤
1. 二值化预处理
将输入图像转为二值图,把构成字母T的黑色像素标记为前景(值为1),白色背景标记为0,可顺带做一次形态学开运算去除零星噪点。
2. 轮廓提取
两种简单方法都可以得到你示例中的单像素宽度轮廓:
- 形态学运算:用3×3的全1结构元对二值前景做腐蚀,再用原始二值图减去腐蚀后的结果,剩下的像素就是轮廓
- 直接调用成熟接口:比如OpenCV的
Canny边缘检测算子,或者findContours接口可直接输出轮廓的坐标集合,仅需1~2行代码即可完成
这一步的时间复杂度仅和图像的宽高成正比,运算成本极低。
3. 距离计算
提取轮廓后你会得到一个N×2的坐标数组,N为边缘像素的总数量,根据你的需求选择对应的计算方式:
- 如果你需要的是任意两个边缘像素的欧氏直线距离:直接调用
scipy.spatial.distance.cdist接口输入坐标数组,就能得到完整的N×N距离矩阵,矩阵中第i行第j列的数值就是第i个边缘点和第j个边缘点的直线距离 - 如果你需要的是沿轮廓的路径距离(即两个点沿着T的边缘行走的最短长度):先把轮廓点按连通顺序排成序列,再计算相邻点的路径长度累计值即可,不需要做全局路径搜索
直接计算方案的说明
确实存在不用提前提取轮廓的计算方法:你可以先提取所有黑色像素的坐标,两两计算距离后再过滤出两个点均属于边缘的结果,但这种方案的计算量是M²(M为所有黑色像素的总数量),对于你提供的这种内部填充多的字母图形,M会是N的几十甚至上百倍,计算效率远低于先提轮廓的方案,没有必要选择。
内容的提问来源于stack exchange,提问作者magnolia1
相关产品推荐
相关产品推荐

