素值。
用这种方式倒转图像的强度产生图像反转的对等图像。这种处理尤其适用于增强嵌入于图像暗色区域的白色或灰色细节,特别是当黑色面积占主导地位时。一个例子示于图4.3,原始图像为一乳房的数字X照片,可看到有一小块病变。尽管事实上两幅图在视觉内容上都一样,但注意,在这种特殊情况下,分析乳房组织结构时反转图像要容易得多。
下面来看一下反比变换的Java代码实现,如下只列出了某一像素点反比变换代码。
intred=255-cm.getRed(pixels[i*iw+j]);
intgreen=255-cm.getGreen(pixels[i*iw+j]);
intblue=255-cm.getBlue(pixels[i*iw+j]);
图4.3左图为原始数字乳房照片,右图为反变换得到的反转图像
4.1.2伪彩色处理
伪彩色处理是用彩色来代替像素灰度值的一种技术。由于人眼对彩色的分辨率远高于对灰度差的分辨率,所以这种技术可用来识别灰度差较小的像素。这是一种视觉效果明显而技术又不是很复杂的图像增强技术。灰度图像中,如果相邻像素点的灰度相差不大,人眼将无法从图像中提取相应的信息,因为人眼分辨灰度的能力很差,一般只有几十个数量级,但是人眼对彩色信号的分辨率却很强,这样将黑白图像转换为彩色图像后,人眼可以提取更多的信息量。在转换过程中,对灰度图像中的每一个像素点,取得该点的灰度值并送入红、绿、蓝三个通道实施不同的变换,产生相应的红、绿、蓝的亮度值。
图4.4是一种简单的映射变换曲线,按照这张曲线图,可以轻松地将灰度图像的256个灰度级转换为一幅伪彩色图像。
图4.4一种简单的映射变换曲线
由图4.4所示的伪彩色还原映射变换曲线图,得到如下映射函数,其中,、、表示伪彩色灰度值,表示原始灰度图像的灰度值。
(4.8)
(4.9)
(4.10)
公式(4.8)、(4.9)、(4.10)给出了一种通过映射变换曲线给灰度着色的方法,其Java代码实现如下:
intgrey=pixels[i*iw+j]&0xff;
intalpha=cm.getAlpha(pixels[i*iw+j]);
intred,green,blue;
switch(grey/64)
{
case0:red=0;green=4*green;blue=255;break;
case1:red=0;green=255;blue=511-4*grey;break;
case2:red=4*grey-511;green=255;blue=0;break;
case3:red=255;green=1023-4*grey;blue=0;break;
}
pixels[i*iw+j]=alpha<<24|red<<16|green<<8|blue;
grey为某像素点的灰度值,因为图像已经是灰度色,所以在这里只取蓝色分量作为灰度进行运算。
上面给出了一种通过映射变换曲线给灰度着色的方法,下面再给出一种通过色彩表映射的方法给灰度着色。对于任意一幅图像,可以先将灰度降到16级,然后根据灰度与相应的颜色对应关系,求出新的颜色。表4.1表示不同灰度级与相应的颜色对应关系。表中的序号表示0~15共16个灰度级,序号下方就是该灰度级将要映射的颜色。
表4.1灰度级颜色对照表
0
1
2
3
4
5
6
7
黑
深蓝
深绿
深红
深灰
蓝紫
蓝
草绿
#000000
#000055
#005500
#550000
#3F3F3F
#550055
#0000FF
#555500
8
9
10
11
12
13
14
15
绿
红
灰
青
黄
白
深蓝绿
紫
#00FF00
#FF0000
#808080
#00FFFF
#FFFF00
#FFFFFF
#005555
#FF00FF
色彩表映射的方法很简单:只需将原图像中所有灰度值oldGray降为16级灰度,即对于任意一点,其新的灰度级为:
newGray?16×oldGray/255(4.11)
然后根据新的灰度级与表4.1进行对照,求出新的颜色。其Java代码实现如下:
intalpha=cm.getAlpha(pixels[i*iw+j]);
intgrey=pixels[i*iw+j]&0xff;
int[]colorTable={0x000000,0x000055,0x005500,0x550000,0x3F3F3F,
0x550055,0x0000FF,0x555500,0x00FF00,0xFF0000,0x808080,
0x00FFFF,0xFFFF00,0xFFFFFF,0x005555,0xFF00FF};
intnewGrey=grey*16/255;
pixels[i*iw+j]=alpha<<24|colorTable[newGrey];
其实从伪彩色的概念就可以理解,伪彩色不是真彩色,是一种人为着色。所以在处理这项技术时,方法是多种多样的。除了上面提到的16级灰度着色外,还可以采用更多级的灰度着色,如256级灰度着色。总之,不管怎样构造这张色彩表,它都是一种人为着色,其目的就是要突出目标,方便人查看。
图4.5左图为原始图像,右图为经256级灰度着色后图像
4.1.3平滑化处理
图像的平滑处理技术即图像的去噪声处理。主要是为了去除实际成像过程中,因成像设备和环境所造成的图像失真,提取有用信息。图像平滑处理在消除或减弱图像噪声和假轮廓的同时,对图像细节也有一定的衰减作用。因此,图像平滑的直观效果是图像噪声和假轮廓得以去除或衰减,但同时图像将变得比处理前模糊了,模糊的程度要看对高频成份的衰减程度而定。
邻域平均法:邻域平均法是一种简单的在空间对图像进行平滑处理的方法,它易于实现,效果也较好。邻域平均法的基本思想是:由于噪声是图像上的一些样点的灰度造成突变,那么就可以以这样的样点为中心取一个邻域,用邻域内其他样点的灰度平均值来代替要处理的样点的灰度,其结果对亮度突变的点产生了"平滑"的效果。
假设图4.6是在某一图像中取一个邻域,其中e点认为是噪声点,那么就以e点为中心取了这样一个邻域,在处理后图像中e点的灰度值为
(4.12)
式中a、b、c、d、f、g、h、i分别为邻域内各个样点的灰度值
a
b
c
d
e
f
g
h
i
图4.6以e为中心的一个邻域
下面来看平滑化处理的核心代码:
ColorModelcm=ColorModel.getRGBdefault();
for(inti=1;i255)
{
grey=255;
}elseif(grey<0)
{
grey=0;
}
ColorModelcm=ColorModel.getRGBdefault();
for(inti=0;igrey)
{
red=255;
}else{red=0;}
if(cm.getGreen(pixels[i])>grey)
{
green=255;
}else{green=0;}
if(cm.getBlue(pixels[i])>grey)
{
blue=255;
}else{blue=0;}
pixels[i]=alpha<<24|red<<16|green<<8|blue;
}
图4.8左图为原始颅骨图像,右图为经二值化处理后的图像
从图4.8中可以看出,选择适当的阈值对图像进行二值化处理后可以清晰的观察出病灶位置及大小,实现了将病灶分割出来,方便了医生诊断。
4.2.2边缘检测法
图像边缘对图像识别和计算机分析十分有用。边缘提取首先检查出图像局部性特性的不连续性,然后再将这些不连续的边缘像素连成完备的边界。边缘的特性是沿边缘走向的像素变化平缓,而垂直与边缘方向的像素变化剧烈。所以,从这个意义上讲,提取边缘的算法就是检查出符合边缘特性的边缘像素的数学算子。
常用的边缘检测算子有Roberts算子、Laplace算子、Sobel算子等。
1.Roberts算子
图像的梯度定义为
(4.18)
梯度的模为
(4.19)
通常把梯度的模就叫做图像的梯度。Roberts算子是用斜向上4个像素交叉差分来表示梯度的,即
(4.20)
上式也可以简化为
(4.21)
或
也可以表示成掩模的形式如图4.9所示
10
0-1
01
-10
图4.9Roberts算子
2.Laplace算子
可以利用对图像的各个像素的二阶导数和之和的方法寻找边界。即
(4.22)
对于数字图像,可以用差分近似微分,即可对图像的每个像素取方向和方向的二阶差分之和来近似上式,因此有
(4.23)
0
1
0
1
-4
1
0
1
0
这就是Laplace算子,它是一个与边缘方向无关的边缘点检测算子。由于在实际检测中一般只关心边缘点的位置而不关心其周围的灰度差值,因此这种
与方向无关的边缘检测算子对检出边缘点是合适的。
Laplace算子相当于一个图4.10所示的滤波器。
图4.10Laplace算子
3.Sobel算子
Sobel算子是一种简单常用的算子,它是对数字图像的每个像素,考查其相邻点像素灰度的加权差,即
(4.24)
Sobel算子可以写成图4.11的掩膜形式。
1
0
-1
1
2
1
2
0
-2
0
0
0
1
0
-1
-1
-2
-1
图4.11Sobel算子
Java语言实现Robert梯度算法:
ColorModelcm=ColorModel.getRGBdefault();
for(i=1;i
上一篇:java图书管理系统毕业设计+源码(论文和程序)
下一篇:试题库管理系统毕业论文