图像复原,CT扫描,闭合曲线,

image restoration,CT scan,closed curve,

数字图像可能有问题。 实际上,在我可以 google 之前,我不知道如何描述问题。 所以我想问一些科学领域的某种概念可以描述这个问题。

CT图像,断面扫描:

这是物理多孔结构的截面扫描 material,这是关于土木工程的。 图像的白色部分是 solid ,而黑色部分是 hole 。 孔的横截面应为闭合曲线。 但是,由于某些技术原因,描述这些孔洞轮廓的像素的灰度级在我得到的位图中变为 0(黑色)。 如您所见,

绿色圈出的像素点应该和红色圈出的一样,灰度在0以上,因为这里应该是一条闭合曲线来描述这个洞

我想修复这些像素,但不知道这是什么问题。 这个问题有一些经典算法吗?

您正在寻找的技术叫做 dilation. There is an example in the opencv library erosion and dilation

是的,你可以使用形态学运算符,比如扩张,但这会导致更厚的轮廓,使孔变小甚至完全填充它们如果太小了。

另一种方法是寻找小间隙。

  1. 创建 2 个助手 2D arrays/images

    它们将为输入图像的每个像素包含一个整数计数器。因此,如果您的图片分辨率为 xs,ys,那么您可以尝试以下操作:

    int cx[ys][xs]; // x direction counter
    int cy[ys][xs]; // y direction counter
    
  2. 计算cx

    所以 cx[y][x] 应该保存图像中 x 方向(行)中后续零的计数。

    1. 0
    2. 清除 cx[][]
    3. for (y=0;y<ys;y++)
    4. 设置x=-1
    5. x之后找到第一个零像素并命名为x0
    6. x0 中找到最后一个零像素并将其命名为 x1
    7. 设置cx[y][x0..x1]=x1-x0+1x=x1+1
    8. 循环 #4x<xs

    类似地为 y 方向(列)计算 cy[y][x]

  3. 检测并修复缺失轮廓

    这很容易,如果 min(cx[y][x],cy[y][x])<threshold 像素 x,y 属于缺失轮廓,应设置为白色... threshold 值是缺失轮廓的最大长度,必须是小于最小的孔尺寸。

所以孔必须比缺失的轮廓间隙大。否则这是行不通的。您可以通过创建另一个 map 保持黑色区域大小来改进这一点。 (洪水填充任何黑色像素,而不是颜色使用填充像素数,因此您需要应用洪水填充 2 次,一次用于计数,一次用于填充)然后仅在大于小孔的区域应用缺失轮廓,以防止填充小孔.

还有另一种可能性,例如检测到消失的轮廓图案并加入太近的这种图案。