基于投影正弦图的校正(调研)

基本原理

环形伪影具有在投影正弦图上呈现为线性伪影的特征,通过①对直线进行检测,②定位直线后通过插值算法对投影图像进行插值处理,得到校正的投影数据后再进行重建即可消除环

形伪影。

定位直线的方法

1.运用算子提取图像边缘

下面是几种算子的优缺点。

Robert算子定位比较精确,但由于不包括平滑,所以对于噪声比较敏感。

Prewitt算子和Sobel算子都是一阶的微分算子,而前者是平均滤波,后者是加权平均波且检测的图像边缘可能大于2个像素。这两者对灰度渐变低噪声的图像有较好的检测效果,但是对于混合多复杂噪声的图像,处理效果就不理想了。

LOG滤波器方法通过检测二阶导数过零点来判断边缘点。LOG滤波器中的a正比于低通滤波器的宽度,a越大,平滑作用越显著,去除噪声越好,但图像的细节也损失越大,边缘精度也就越低。所以在边缘定位精度和消除噪声级间存在着矛盾,应该根据具体问题对噪声水平和边缘点定位精度要求适当选取。

Canny算子,该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。

 

综合各个论文和算法原理来看,Canny算子是我们重点关注的对象。

下面我将详细阐述一下Canny算子的原理。

①首先运用高斯模糊去除噪声。

高斯模糊在二维图像下的表达式为

其中r是模糊半径。σ是正态分布的标准偏差。在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆。分布不为零的像素组成的卷积矩阵与原始图像做变换。每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果。

在实际应用中,在计算高斯函数的离散近似时,在大概距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。通常,图像处理程序只需要计算

的矩阵就可以保证相关像素影响。对于边界上的点,通常采用复制周围的点到另一面再进行加权平均运算。

对一幅图像进行多次连续高斯模糊的效果与一次更大的高斯模糊可以产生同样的效果。

在减小图像尺寸的场合经常使用高斯模糊。在进行欠采样的时候,通常在采样之前对图像进行低通滤波处理。这样就可以保证在采样图像中不会出现虚假的高频信息。高斯模糊有很好的特性,如没有明显的边界,这样就不会在滤波图像中形成震荡。

Matlab 里面实现高斯模糊的例子:

w=fspecial('gaussian',[55],3)
im=imfilter(im,w)

一阶差分偏导计算梯度值和方向。

OpenCV中采用的方法就是Sobel算子来计算。接下来简单介绍一下Sobel算子。

f '(x) = f(x + 1) - f(x - 1) 近似计算一阶差分

排好序:[-1 * f(x-1)0 * f(x)1 * f(x+1)]

提出系数:[-1, 0, 1]

二维情况下就是

-1, 0, 1

-1, 0, 1

-1, 0, 1

即为Prewitt 边缘检测算子。

增强中间效应后即为Sobel算子的Gx形式(即偏x方向)

-1, 0, 1

-2, 0, 2

-1, 0, 1

Gy

-1, -2, -1

 0, 0,  0

 1,  2,  1

最后结果G(x, y) = Gx + Gy

③非极大值抑制

算出来的梯度值,把不是极值的点,全部置0,去掉了大部分弱的边缘。所以图像边缘会变细。

④采用两个阈值连接边缘

大于 t2 的点肯定是边缘
小于 t1 的点肯定不是边缘
t1, t2 之间的点,通过已确定的边缘点,发起8领域方向的搜索(广搜),图中可达的是边缘,不可达的点不是边缘。

⑤Canny算子现有matlab函数

I =imread('cameraman.tif'); % 读入图像

imshow(I);

BW1 = edge(I,'canny');

imshow(BW1);

 

edge为一个边缘算子整合,参数可以换为各个算子

2. 通过 Hough 或 bwlabel 变换来定位直线位置

①Bwlabel

四连通或八连通是图像处理里的基本感念:而8连通,是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角或右下角连接着,则认为他们是联通的;4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的,连通的,在左上角、左下角、右上角或右下角连接,则不认为他们连通。

[L,num] =bwlabel(BW,n)表示返回和BW相同大小的数组L和连通数n。L中包含了连通对象的标注。参数n为4或8,分别对应4邻域和8邻域,默认值为8。

 

BW =
    1     1     1    0     0     0    0     0
    1     1     1    0     1     1    0     0
    1     1     1    0     1     1    0     0
    1     1     1    0     0     0    1     0
    1     1     1    0     0     0    1     0
    1     1     1    0     0     0    1     0
    1     1     1    0     0     1    1     0
    1     1     1    0     0     0    0     0

输出

L =
    1     1     1    0     0     0    0     0
    1     1     1    0     2     2    0     0
    1     1     1    0     2     2    0     0
    1     1     1    0     0     0    3     0
    1     1     1    0     0     0    3     0
    1     1     1    0     0     0    3     0
    1     1     1    0     0     3    3     0
    1     1     1    0     0     0    0     0

N=3

②Hough

设置两个坐标系,左边的坐标系表示的是(x,y)值,右边的坐标系表达的是(m,b)的值,即直线的参数值。那么一个(x,y)点在右边对应的就是是一条线,左边坐标系的一条直线就是右边坐标系中的一个点。这样,右边左边系中的交点表示有多个点经过(m,b)确定的直线。但是,该方法存在一个问题(m,b)的取值范围太大。

 

为了解决(m,n)取值范围过大的问题,在直线的表示方面用 xcosθ+ysinθ=p 的规范式代替一般表达式,参数空间变成(θ,p)0=<θ<=2PI。这样图像空间中的一个像素点在参数空间中就是一条曲线(三角函数曲线)。

 

Hough Line算法表述如下:

1、初始化(θ,p)空间,N(θ,p)=0   Nθ,p)表示在该参数表示的直线上的像素点的个数)

2、对于每一个像素点(x,y),在参数空间中找出令 xcosθ+ysinθ=p 的(θ,p)坐标,Nθ,p+=1

3、统计所有Nθ,p)的大小,取出Nθ,p>threasold的参数(threadsold是预设的阈值)

利用霍夫变换检测其他图形的原理也是这样。找出表达式以及参数空间,遍历图像,找出参数空间中符合要求的参数。最近,看到一个利用最小二乘去寻找圆的算法,那个算法的大致思路是列出圆形的表达式,然后通过最小二乘去求迭代求解参数值。这个方案认为更适合解决,利用图像中的点尽可能去拟合一个圆或者几个圆,不适合检测图像中有多少个圆,而且最小二乘的计算量很大。

将两者相比较过后,我认为Bwlabel对于我们在正弦图的使用来说会比较简单。

插值算法

插值算法我们在计算物理课中学习了拉格朗日插值,分段插值,分段三点抛物线插值,还有样条插值这四种。

综合优缺点,我认为三次样条插值比较适合。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页