图像复原,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
是的,你可以使用形态学运算符,比如扩张,但这会导致更厚的轮廓,使孔变小甚至完全填充它们如果太小了。
另一种方法是寻找小间隙。
创建 2 个助手 2D arrays/images
它们将为输入图像的每个像素包含一个整数计数器。因此,如果您的图片分辨率为 xs,ys
,那么您可以尝试以下操作:
int cx[ys][xs]; // x direction counter
int cy[ys][xs]; // y direction counter
计算cx
所以 cx[y][x]
应该保存图像中 x
方向(行)中后续零的计数。
- 用
0
清除 cx[][]
for (y=0;y<ys;y++)
- 设置
x=-1
- 在
x
之后找到第一个零像素并命名为x0
- 从
x0
中找到最后一个零像素并将其命名为 x1
- 设置
cx[y][x0..x1]=x1-x0+1
和x=x1+1
- 循环 #4 而
x<xs
类似地为 y
方向(列)计算 cy[y][x]
。
检测并修复缺失轮廓
这很容易,如果 min(cx[y][x],cy[y][x])<threshold
像素 x,y
属于缺失轮廓,应设置为白色... threshold
值是缺失轮廓的最大长度,必须是小于最小的孔尺寸。
所以孔必须比缺失的轮廓间隙大。否则这是行不通的。您可以通过创建另一个 map
保持黑色区域大小来改进这一点。 (洪水填充任何黑色像素,而不是颜色使用填充像素数,因此您需要应用洪水填充 2 次,一次用于计数,一次用于填充)然后仅在大于小孔的区域应用缺失轮廓,以防止填充小孔.
还有另一种可能性,例如检测到消失的轮廓图案并加入太近的这种图案。
数字图像可能有问题。 实际上,在我可以 google 之前,我不知道如何描述问题。 所以我想问一些科学领域的某种概念可以描述这个问题。
CT图像,断面扫描:
这是物理多孔结构的截面扫描 material,这是关于土木工程的。 图像的白色部分是 solid ,而黑色部分是 hole 。 孔的横截面应为闭合曲线。 但是,由于某些技术原因,描述这些孔洞轮廓的像素的灰度级在我得到的位图中变为 0(黑色)。 如您所见,
绿色圈出的像素点应该和红色圈出的一样,灰度在0以上,因为这里应该是一条闭合曲线来描述这个洞
我想修复这些像素,但不知道这是什么问题。 这个问题有一些经典算法吗?
您正在寻找的技术叫做 dilation. There is an example in the opencv library erosion and dilation
是的,你可以使用形态学运算符,比如扩张,但这会导致更厚的轮廓,使孔变小甚至完全填充它们如果太小了。
另一种方法是寻找小间隙。
创建 2 个助手 2D arrays/images
它们将为输入图像的每个像素包含一个整数计数器。因此,如果您的图片分辨率为
xs,ys
,那么您可以尝试以下操作:int cx[ys][xs]; // x direction counter int cy[ys][xs]; // y direction counter
计算
cx
所以
cx[y][x]
应该保存图像中x
方向(行)中后续零的计数。- 用
0
清除 for (y=0;y<ys;y++)
- 设置
x=-1
- 在
x
之后找到第一个零像素并命名为x0
- 从
x0
中找到最后一个零像素并将其命名为x1
- 设置
cx[y][x0..x1]=x1-x0+1
和x=x1+1
- 循环 #4 而
x<xs
cx[][]
类似地为
y
方向(列)计算cy[y][x]
。- 用
检测并修复缺失轮廓
这很容易,如果
min(cx[y][x],cy[y][x])<threshold
像素x,y
属于缺失轮廓,应设置为白色...threshold
值是缺失轮廓的最大长度,必须是小于最小的孔尺寸。
所以孔必须比缺失的轮廓间隙大。否则这是行不通的。您可以通过创建另一个 map
保持黑色区域大小来改进这一点。 (洪水填充任何黑色像素,而不是颜色使用填充像素数,因此您需要应用洪水填充 2 次,一次用于计数,一次用于填充)然后仅在大于小孔的区域应用缺失轮廓,以防止填充小孔.
还有另一种可能性,例如检测到消失的轮廓图案并加入太近的这种图案。