数字图像可能存在问题。 实际上我不知道如何在我谷歌之前描述问题。 所以我要求某些科学领域的某种概念可以描述这个问题。
这是物理多孔材料的剖面扫描,这是关于土木工程的。 图像的白色部分是实心的,而黑色部分是孔。 孔的横截面应为闭合曲线。 但是,由于某些技术原因,描述这些孔轮廓的像素的灰度级在我得到的位图中变为0(黑色)。 如你所见,
以绿色圈出的像素应该像红色那些灰度等级大于0的像素,因为这里应该是一条闭合曲线来描述这个洞。
我想修复这些像素,但不知道这个问题是什么类型。 这个问题有一些经典的算法吗?
答案 0 :(得分:3)
您正在寻找的技术称为dilation。 opencv库中有一个示例erosion and dilation
答案 1 :(得分:1)
是的,您可以使用扩展之类的形态运算符,但这会导致更粗的轮廓,使孔变小或甚至填充它们,如果太小。
另一种方法是找到小的差距。
创建2个辅助2D数组/图像
它们将为输入图像的每个像素包含一个整数计数器。因此,如果您的图片的分辨率为xs,ys
,那么您可以尝试以下内容:
int cx[ys][xs]; // x direction counter
int cy[ys][xs]; // y direction counter
计算cx
所以cx[y][x]
应该在x
方向(行)中保存图像中的后续零点数。
cx[][]
0
for (y=0;y<ys;y++)
x=-1
x
之后找到第一个零像素并将其称为x0
x0
的最后一个零像素并将其称为x1
cx[y][x0..x1]=x1-x0+1
和x=x1+1
x<xs
同样为cy[y][x]
方向(列)计算y
。
检测并修复缺失的轮廓
如果min(cx[y][x],cy[y][x])<threshold
然后像素x,y
属于缺失轮廓并且应设置为白色,这很容易... threshold
值是缺失轮廓的最大长度,必须小于最小的孔尺寸。
因此,孔必须大于缺少轮廓间隙。否则这不起作用。您可以通过创建另一个持有黑色区域大小的map
来改善这一点。 (洪水填充任何黑色像素,但不使用颜色使用填充像素的数量,因此您需要将洪水填充2次用于计数,一次用于填充)然后仅在大于小孔的区域应用缺失轮廓以防止填充小孔
还有另外一种可能性,例如检测消失的轮廓图案并加入太近的图案。