2018-09-02 18:03:39 mmmmmk_ 阅读数 85

1 概述

在第五章,我们学习了图像处理;其中的大多数操作都是对图像增强,修改等;使之成为和源图像类似的全新的图像;比如我们可以用平滑消除图像的噪声,用阈值化得到图像的二值图像,或者缩放图像。

在本章中,我们要学习的是图像的变化;是将图像转变为另外一种表达方式;比如使用傅里叶变换,将图像从空域转变为频域;转变之后新图像的每个单独像素表示原始输入图像的频谱分量而不是我们通常所考虑的空间分量。

 

 

2 卷积

卷积是图像变换的基础,我们在第五章已经接触了卷积。一个卷积能实现的功能由其卷积核的形式决定。这个核实质上是一个大小固定的/;由数值参数构成的数组,数组的参考点通常位于数组的中心。在对图像做卷积的时候,首先将参考点定位到图像的第一个像素,卷积核的其他位置对应到图像中的其他像素点。在每一个位置,我们将卷积核中的值和像素中的值相乘,并求和。将结果写在参考点的位置,就完成了对对应像素点的卷积操作,我们对图像中的每个点重复该操作,完成对图像的卷积。

卷积操作使用函数 cvFilter2D 实现:

void cvFilter2D( const CvArr* srcarr, CvArr* dstarr, const CvMat* _kernel, CvPoint anchor )

srcarr, dstarr: 源宿图像,大小相同。

_kernel: 卷积核,一般情况下,卷积核的系数是浮点性的,所以我们必须用CV_32F来初始化矩阵。

anchor: 参考点的位置,默认情况下为(-1, -1)。如果是默认值的话,选取矩阵的中心作为参考点,所以,如果anchro没有指定值,_kernel的大小必须是奇数*奇数。而如果指定了anchor则无此限制。

在上面的阐述中,有一个很奇怪的点,就是为什么源宿图像的大小是相同的,在处理边缘点的时候,卷积核无法覆盖到值,所以,直观上理解,宿图像应该比源图像要小?

OpenCV解决边界问题的方法是先将源图像阔大,再进行卷积。默认扩大的方法是复制边界的值。我们也可以用如下函数来扩展边界:

void
cvCopyMakeBorder( const CvArr* srcarr, CvArr* dstarr, CvPoint offset,
                  int borderType, CvScalar value )

offset: 源图像在宿图像中的偏移,理论上,如果待处理的卷积核的大小是N*N(其中N为奇数),那么偏移的大小应该是((N-1)/2, (N-1)/2)

boardertype: 扩展的方式,当前有如下两种可选;IPL_BORDER_CONSTANT(使用固定值来扩展边界,该固定值为参数value);IPL_BORDER_REPLICATE(复制边界的值)。

在cvFilter2D中,固定是采用复制的方法来扩展的边界的,那我们怎么自定义我们的边界方式呢?我们可以先使用cvCopyMakeBorder将边界扩展之后,再进行卷积的操作,在输出图像中,选取恰当的位置作为ROI即可。

 

 

3 图像梯度和Sobel导数 Scharr滤波器

使用卷积的一个常见的操作就是图像导数的计算,或者说近似导数的计算。

求导最常用的方法就是使用sobel算子。三阶的sobel算子如下所示:

Gx = \begin{vmatrix} -1 & 0 &1 \\ -2& 0 & 2\\ -1 & 0 & 1 \end{vmatrix}   Gy = \begin{vmatrix} 1& 2 &1 \\ 0& 0 &0 \\ -1 & -2 &-1 \end{vmatrix}

在计算得到了Gx和Gy之后,通过如下公式结合:

G = \sqrt{Gx^{2} + Gy^{2}}

有的时候,为了简化计算,也可以直接用两个值绝对值的和来近似,在OpenCV中,采用的就是这种方法

G = \left | Gx \right | + \left | Gy \right |

Sobel算子对于噪声有一定的抵抗能力。在OpenCV中使用如下函数来通过Sobel算子求导数:

void cvSobel( const void* srcarr, void* dstarr, int dx, int dy, int aperture_size )

srcarr, dstarr: 源宿图像,为了防止溢出,dstarr的深度应该比srcarr深,比如说,如果srcarr是8位的话,dstarr必须是IPL_DEPTH_16S

dx, dy: x方向和y方向的导数,比如如果我们只求x方向,不想求y方向的,我们可以将其值设置为1,0

aperure_size: 方形滤波器的宽,支持1,3, 5, 7 。其次,通过给这个参数传入CV_SCHARR来使用3*3的Scharr滤波器。

Scharr滤波器如下图所示:

Gx = \begin{vmatrix} -3 & 0 &3 \\ -10& 0 &10 \\ -3& 0 &3 \end{vmatrix}   Gy = \begin{vmatrix} -3 & -10 &-3 \\ 0& 0 &0 \\ 3&10 &3 \end{vmatrix}

对于一个3*3的Sobel,当梯度越接近水平或者垂直的时候,就越发不准确。所以在3*3大小的卷积核做变换时,应该使用Scharr滤波器

最后,我们必须认识到一点,Sobel求得的并不是真正的导数,因为Sobel算子定义在一个离散的空间上,Sobel算子真正表示的是多项式拟合;他是对抛物线的局部拟合。所以人们也希望使用更大的核,也就在更多像素上计算这种拟合。

 

 

4 拉普拉斯变换

拉普拉斯变化的公式表示如下:

Laplace(f) = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}

拉普拉斯变化常常被用来检测团块。二次求导表示的是一阶函数的变化率, 这也意味着,如果周围是更高值的单点或者小块会使这个函数的值最大化;反之,周围是更低值的点会使函数的负值最大化。

在OpenCV中,拉普拉斯变化直接使用Sobel求导得来。函数如下:

void cvLaplace( const void* srcarr, void* dstarr, int aperture_size )

其中,源图像既可以是8位无符号,也可以是32位浮点性;而目的图像必须是16位有符号或者32位浮点型。

Sobel和laplace变化的结果如图所示:

 

 

5 Canny算子

使用Canny算子进行边缘检测有如下几个步骤:

1. 对图像进行高斯平滑,以消除噪声。

2. 使用一阶差分卷积模板,以加强边缘,并得到梯度值和梯度方向。

一阶差分卷积模板如下:

Hx = \begin{vmatrix} -1 &1 \\ -1 & 1 \end{vmatrix}     Hy = \begin{vmatrix} 1 &1 \\ -1& -1 \end{vmatrix}

再通过Hx和Hy求的Gx和Gy之后,梯度值:G = \sqrt{Gx^{2} + Gy^{2}},梯度方向:tan^{^{-1}}\frac{Gy}{Gx}

3. 非极大值抑制,目的是为了保留梯度方向上的极大值。对于梯度图,将点和沿其梯度方向上的两个点比较,如果不是最大点,就设置该点的值为0,否则保持不变。

4. 双线性阈值:对非极大值抑制的结果通过两个阈值分别进行阈值化处理:Nmin = Nmax * 0.4。通过Nmax阈值化处理之后,图像具有比较少的假的边缘,使用Nmin处理之后,图像具有比较多的假的边缘点。通过第一步获取的边缘点,判断其8邻域内有无第二步获得的边缘点,然后进行连接。得到最后的边缘图像。

canny算子使用图函数实现:

void cvCanny( const CvArr* image, CvArr* edges, double threshold1,
              double threshold2, int aperture_size )

           

2016-12-10 16:58:31 spw_1201 阅读数 911

离散傅里叶变换:

傅里叶变换将讲时域信号分解为不同频率的正弦信号或余弦信号叠加之和,时域分析只能反映信号的幅值随时间变化得情况,除单频率分量的简谐波外,很难对信息频率的组成及各频率分量的大小进行详细分析,而信号频谱分析提供了比时域信号波形更直观、更丰富的信息。在实际的图像处理中,我们仅仅使用了图像幅度信息,因为幅度图像半酣了我们需要的原图像几乎所有的几何信息。然和,如果你想通过修改幅度图像或者相位图像的方法来间接修改原空间图像,你需要使用逆傅里叶变换来得到修改后的空间图像,这样你就必须同时保留幅度图像和相位图像。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat DFT(Mat srcImage)
{
	Mat srcGray;
	cvtColor(srcImage, srcGray, CV_RGB2GRAY);//灰度图像作傅里叶变换
	//将输入图像延扩到最佳的尺寸
	int nRows = getOptimalDFTSize(srcGray.rows);//2,3,5倍有更高效率的傅里叶变换
	int nCols = getOptimalDFTSize(srcGray.cols);
	Mat resultImage;
	//把灰度图像放在左上角,向右边和下边扩展图像
	//将添加的像素初始化为0
	copyMakeBorder(srcGray, resultImage, 0, nRows - srcGray.rows, 0, nCols - srcGray.cols, BORDER_CONSTANT, Scalar::all(0));
	//新建一个两页矩阵,分配空间(实部和虚部),实部用于扩展后的初始化,虚部初始化0
	Mat planes[] = { Mat_<float>(resultImage), Mat::zeros(resultImage.size(), CV_32F) };
	Mat completeI;
	//把两页合成一个2通道的mat
	merge(planes, 2, completeI);
	//对上面合成的mat进行离散傅里叶变换,支持原地操作,傅里叶变换结果为复数,通道1存的是实部,通道2存的是虚部。
	dft(completeI, completeI);
	//把变换的结果分割到各个数组的两页中,方便后续操作
	split(completeI, planes);
	//求傅里叶变化各频率的幅值,幅值放在第一页中
	magnitude(planes[0], planes[1], planes[0]);
	Mat dftResultImage = planes[0];
	//傅里叶变换的幅度值范围大到不适合在屏幕上显示,高值在屏幕上显示为白点,而低值为黑点,
	//高低值的变化无法有效分辨,为了在屏幕上凸显出高低的变化得连续性,我们可以用对数尺度来替换线性尺度
	dftResultImage += 1;
	log(dftResultImage, dftResultImage);
	//前面对原始图像进行了扩展,这里把对原始图像傅里叶变换取出,剔除扩展部分
	dftResultImage = dftResultImage(Rect(0, 0, srcGray.cols, srcGray.rows));
	//这一步的目的仍是为了显示,现在用了重分步后的幅度图,但是幅度值仍然超过可显示范围[0,1]
	//我们使用normalize()函数将幅度归一化到可显示范围
	normalize(dftResultImage, dftResultImage, 0, 1, CV_MINMAX);
	
	//重新分配象限,使(0,0)移动到图像中心,
	//傅里叶变换之前要对源图像乘以(-1)^(x+y),进行中心化
	//这是对傅里叶变换结果进行中心化
	int cx = dftResultImage.cols / 2;
	int cy = dftResultImage.rows / 2;
	Mat tmp;
	//Top-Left--为每一个象限创建ROI
	Mat q0(dftResultImage, Rect(0, 0, cx, cy));
	//Top-Right
	Mat q1(dftResultImage, Rect(cx, 0, cx, cy));
	//Bottom-Left
	Mat q2(dftResultImage, Rect(0, cy, cx, cy));
	//Bottom-Right
	Mat q3(dftResultImage, Rect(cx, cy, cx, cy));
	//交换象限,(Top-Left with Bottom-Right)
	q0.copyTo(tmp);
	q3.copyTo(q0);
	tmp.copyTo(q3);
	//交换象限,(Top-Right with Bottom-Letf)
	q1.copyTo(tmp);
	q2.copyTo(q1);
	tmp.copyTo(q2);
	return dftResultImage;
}
int main()
{
	Mat srcImage = imread("D:\\1.jpg");
	if (!srcImage.data)
		return -1;
	imshow("srcImage", srcImage);
	Mat resultImage = DFT(srcImage);
	imshow("resultImage", resultImage);
	waitKey(0);
	return 0;
}



2016-09-09 10:26:28 qq_22337877 阅读数 5308

第五章 医学图像增强
第一节概述
根据对医学图像的增强处理是在频率域还是空间域进行,可以把医学图像的增强技术分为频域增强和空域增强。在空间域方法中的“空域”一词是指图像所在的空间,这类方法是对图像的像素直接处理为基础的。而频域方法中的“频域”一词是指对图像进行傅里叶变换后图像所在的空间,即频率空间。频域处理技术是以修改图像的傅里叶频谱为基础的。根据对医学图像的处理策略,可以把图像增强技术分为全局增强处理和局部增强处理等。

第二节 直方图增强
一 直方图增强概述
一幅图像的灰度直方图挤在一个较小的灰度范围内,图像的灰度动态范围就小,图像的对比度就差,图像的质量也就不好。反之图像的灰度动态范围大,图像的对比度就好。
常用的修改直方图的方法有:灰度变换和直方图增强。直方图增强技术是一种通过改变图像的全部或局部对比度进行图像增强的技术,该技术主要有两种:直方图均衡和直方图规定化。

二 直方图均衡化
为使图像变得清晰,一个自然的想法是使图像的灰度范围变大,并且让灰度频率较小的灰度级在经过变换以后其频率变得大一些,从而使得像素个数增多以醒目。即应将变换后的图像灰度直方图在较大的动态范围内趋于平衡。当图像中各灰度级的分布呈均匀状态时,图像包含的信息量巨大,因此直方图均衡实际上就是为了使图像具有最大的信息量。
(1)图像均衡化的基本思想
直方图均衡化又称为直方图平坦化,理想图像的直方图的灰度级别应该拥有相同的像素个数。
(2)图像直方图均衡的实现
直方图均衡化技术的图像增强机制如下:
A、占有较多像素的灰度变换以后和前一个灰度级的级差增大。一般的讲,背景和目标占有较多的像素,这种技术实际上加大了目标与背景的对比度。
B、占有较少像素的灰度变换以后和前一个灰度级的级差较小,需要归并。一般的讲,边界和背景的过渡处的像素较少,由于归并,或者变为背景点或目标点,从而使边界变得陡峭。
直方图均衡化的缺点在于:由于频数较少的灰度进行归并,可能损失一些重要的图像细节,另外,处理后的图像显得粗犷。

第三节 图像的空间滤波增强
一 空间滤波增强概述
空间域滤波是在图像空间借助模板进行邻域操作完成的,各种空域滤波器根据功能又主要分为平滑滤波器、锐化滤波器两类。图像平滑的目的主要是消除图像中的噪声,而图像锐化则是为了增强被模糊的细节如图像的边缘等。
平滑滤波器。主要用来减弱或削弱图像中的噪声成分,从而提高图像的信噪比。因为高频分量对应图像中的区域边缘与噪声等灰度值具有较大、较快的部分。滤波器将噪声减弱或消除的同时,也会减弱图像的边缘信息。
锐化滤波器。主要用来增强图像的边缘信息,凸显图像中感兴趣区域的轮廓。

二 空间域平滑
(1)均值滤波法
一种在空间域对图像进行简单平滑处理的方法,其原理就是用某像素领域内的各点灰度值的平均值代替像素的原值。这种处理可以减小图像灰度的“尖锐”变化。由于图像噪声一般为“尖锐”变化的白噪声,所以均值滤波一般用来处理图像中的噪声。
另一种均值滤波器,它采取加权平均的方式,即不同的掩模元素具有不同的权值,从而突出一些像素的重要性。
均值滤波法的优点:容易实现对噪声的抑制;缺点:容易使目标轮廓变得模糊,而且会降低有用的细节信息。
(2)中值滤波法
中值滤波法是一种非线性滤波。这种方法简单,对孤立噪声的平滑效果比均值滤波法好,而且它能较好的保护图像边界,但是这种算法会使图像失掉细线和小块的目标区域。
中值滤波法是把领域内所有像素的灰度值从小到大排序,取中间值作为领域中心像素的输出值。中间值的取法如下:当领域内的像素为奇数时,取排序后的中间像素的灰度值;当领域内的像素为偶数时,取排序后的中间两像素的灰度值的平均值。
在对图像进行种植滤波时,通常选择的滤波器窗口是方形的(具有奇数的行与列),某些情况下也可以选择其他形式的滤波器窗口,例如线状、十字形和圆环形等。
(3)中指滤波的主要特性
A、对某些输入信号中值滤波具备不变性。一般的,与窗口对角线垂直的边缘经滤波后将保持不变。利用这个特点,可以使中指滤波既能去除图像的噪声,又能保持图像中的一些物体的边缘。
B、中值滤波可用来减弱随机干扰和脉冲干扰。在对于脉冲的干扰,特别是脉冲宽度小且相距较远的窄脉冲干扰,中值滤波非常有效。

三 空间域锐化
在图像处理中,把削减图像模糊、突出目标边界与图像细节的增强方法称为图像锐化。因此,锐化技术常用于加强图像中的目标边界和图像细节。图像轮廓是灰度陡然变化的部分,包含丰富的空间高频成分。把高频分量相对突出,显然可以使轮廓清晰。
(1)基于微分的锐化方法
图像边缘客户定义为被人眼能识别的图像像素值变换处。通过积分运算可以对医学图像局部区域的像素值求平均,求平均会造成图像边缘的模糊。微分是积分运算的逆运算,可以想象通过微分运算能够使图像的边缘锐化。实际上通过微分得到的是图像的高频信息,而图像的高频信息通常集中在图像的边缘,这样图像微分后再与原始图像数据叠加就可以得到边缘锐化的图像。
(2)基于边缘检测算子的锐化法
边缘检测算子,在边缘检测中,使得到边缘图像有更好的边缘连续性和更少的检测点。经典的一级微分边缘检测算子,这些算子通过寻找图像灰度或色彩值的一阶微分的局部极值来检测图像的边缘。二阶微分边缘检测算子,这些算子通过寻找图像灰度或色彩值的二阶微分的零交叉点获得图像的边缘。Canny算子,提出了三个准则:单边缘准则、最多信噪比准则、边缘的最佳准确性准则。
图像边缘检测就是首先对图像进行滤波得打滤波图像,对滤波图像求极值得到极值点图像,然后基于预设阈值由极值点图像得到边缘图像。在极值图像中极值点对应图像的边缘点,极值点的像素就是滤波图像中对应点的滤波值,包含了图像的高频信息,因此,将极值点图像乘系数与原图像相加就可以得到高频信息得到增强的图像。由于图像的高频信息主要位于图像的边缘,所以相加以后的图像的边缘得到锐化。
需要指出的是。虽然基于微分的锐化和基于边缘检测的锐化都能使图像边缘处的对比度增强,使边缘看起来更加锐利化,但两者有区别。前者是锐化的同时提高了图像的整体亮度,而后者是对图像整体亮度的提高不明显;前者锐化的边缘趋向于边缘变厚,后者锐化的边缘更加细化。

第四节 图形的频域滤波增强

在频域中进行增强的步骤主要有:
(1)计算增强图像的傅里叶变换
(2)将其与一个根据需要设计的转移函数相乘
(3)再将结果进行傅里叶反变换,得到增强图像
常用的频域增强的方法有:低通滤波和高通滤波。

一 低通滤波器
图像中的边缘和噪声都对应着图像傅里叶变换中的高频部分,所以,频率域中,通过滤波器转移函数衰减图像的高频信息,而使低频信息畅通无阻的保留下来的过程称为低通滤波。低通滤波抑制了反映图像边界特征的高频信息以及包含在高频中的孤立点噪声,起到了平滑图像去噪声的增强作用。

二 高通滤波器
高通滤波器是为了衰减或抑制低频分量,而保留高频分量的滤波形式。因为边缘及灰度急剧变换部分与高频分量相关联,在频域中进行高通滤波将使图像得到锐化处理。

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