算法源代码(.m文件)如下:
%——————子函数1,计算灰度均值——————% function [U1, U2] = getaverage(I, Th) %计算两个区域的灰度均值
%阈值Th把图像分成两个区域:灰度高于Th的区域和灰度低于Th的区域 [n,m] = size(I);
sum1 = 0; %设置灰度和的初始值 sum2 = 0;
num1 = 0; %设置每个区域像素点个数的初值 num2 = 0;
for i = 1 : n %两重循环,实现扫描整个矩阵 for j = 1 : m
if I(i , j) <= Th %如果灰度小于或等于阈值,则属于区域1 num1 = num1 + 1; %区域1 的像素个数加1
sum1 = sum1 + I(i , j);%区域1灰度之和加上当前像素点的灰度 else %否则,该像素点属于区域2
sum2 = sum2 + I(i , j);%区域2 灰度之和加上当前像素点的灰度 end; end; end;
num2 = n * m - num1; %区域2 的像素个数等于所有像素数减区域1的像素数 if num1 ~= 0 %如果区域1不为空
U1 = sum1 / num1; %区域1的灰度均值等于灰度和除以区域1的像素个数 else
U1 = 0; %如果区域1为空,则设置其灰度均值为0
end;
if num2 ~= 0 %如果区域2不为空
U2 = sum2 / num2; %区域2的灰度均值等于灰度和除以区域2的像素个数 else
U2 = 0; %如果区域2为空,则设置其灰度均值为0 end;
%——————子函数2 获取类间距离——————% function S = get_S(Th, I) % 获得距离的函数
[U1,U2] = getaverage(I,Th); %调用函数getaverage,返回两区域的灰度均值
if (U1 - U2) ~= 0 %如果两个区域的灰度均值不相等 S = - (U1 - Th) * (Th - U2)/(U1 - U2)^2; %用式2.2计算距离 else
S = 0; %如果灰度均值相等,则距离为0 end;
%——————主函数,用类间最大距离法进行分割——————% function I = maxsp(A)
%利用类间最大距离法实现分割,其中用到两个函数:getaverage,get_S
A=double(A); %因为要对矩阵元素进行加减操作,先转成双精度类型
%下面用优化函数获取使距离达到最大的那个阈值
%[Th,option] = fmin('get_S',0,255,[1,1.e-12],A); %for matlab 6.5.1 Th = fminbnd(@(Th) get_S(Th,A),0,255); %for matlab 7.0.1
%得到最优的阈值后,下面的操作与简单阈值法相同 I = A; [n, m] = size(I); for i = 1 : n
for j = 1 : m
if A(i , j) <= Th I(i , j) = 0; elseif A(i , j) > Th I(i , j) = 255; end; end; end;
imshow(I);
title('经过类间最大距离法分割后的图像'); 六、 结论与应用
1. 简单阈值分割实验
下面以肝癌的CT图片为例进行实验。
图1 肝癌的CT图片(左侧两箭头指向的区域为癌块) 图2 原图的灰度直方图
灰度直方图的分析:从图2可以看出直方图出现了两个波峰,对照原图,我可以发现图1中根据像素基本上可以分为两个区域。这两个区域分别具有不同的亮度,恰好对应着直方图中的两个波峰。因此,理论上我们可以取100到230之间的任何一个灰度作为阈值,但为了分割后图像的效果较为美观,阈值最好取在100到170之间。
图3 取T=100后的分割效果
简单阈值法只考虑直方图的灰度信息,没有利用图像的其他信息,如图像中包含物体的大小,光源的位置等。在图像直方图为单峰或者图像较复杂的情况下无效。而且这种方法的一个最大的不足就是对阈值的选取不够智能化,必须根据直方图,通过人工的判断,并经过多次尝试才能得到好的分割效果。虽然对于简单的图片,这种算法分割的效果比较能让人满意,但如果有大量的图片需要处理或者人工无法干预的情况下该怎么办呢?有没有一种更智能一些的方法呢?我们可以先不要求有那么高的处理效果,但要求智能,以减少工作量。 2.
类间最大距离法分割实验
把图1作为原图,采用类间最大距离法进行分割,得到最优的阈值为133.5159,分割效果图如下:
图4阈值为89.5448的分割效果图
类间最大距离法实现了智能选取阈值的功能,分割效果不错。对于一些特殊的图像,相信根据实际情况给出新的距离的定义,也可以得到很好的分割效果。但这种方法依然没有解决简单阈值法中提到的一个问题,就是同样只考虑直方图的灰度信息,没有考虑到图像的其他有用信息,如图像的大小和光源的位置等等!如果能把这些有用的信息考虑进去,对图像的分割将可以达到更好的效果。 七、 练习
1.任意选取一个灰度图像,对算法中若干关键语句中的参数进行调整,得出不同的实验结果,并对这些结果进行分析。 2.根据自己所学知识,提出自己的阈值选取方法,与类间最大聚类法的分割效果进行比较分析。 3.写出图像分割的实验报告。
实验一 用矩阵变换实现对图像形状及颜色畸变的校正
八、 实验目的与要求
让学生了解数字图像的数学表达及相关概念,通过实验让学生加深对数学在相关学科的应用价值的认识,培养学生的实际操作能力,并引导他们建立基础学科在处理具体问题时方法上联系。
九、 问题描述
对于在颜色或形状上发生畸变的图像,通过数学的方法实现校正。
三、问题分析
先由教师讲授数字图像的基本概念(包括图像的数学化、采样、量化、灰度、各种数学图像的文件格式、表色系、颜色映像等),再通过具体的实例给学生示范对于在颜色或形状上发生畸变的图像如何通过数学的方法实现校正的过程。最后让学生动手完成对某些特殊畸变的图像的校正,写出数学原理和实验报告。
四、背景知识介绍
1. 数字图像的数值描述及分类
图像是对客观存在物体的一种相似性的生动模仿与描述,是物体的一种不完全的不精确的描述。数字图像是用一个数字阵列来表示的图像。数字阵列中的每个数字,表示数字图像的一个最小单位,称为像素。采样是将空域上或时域上连续的图像变换成离散采样点(像素)集合的一种操作。
对一幅图像采样后,若每行像素为M个,每列像素为N个,则图像大小为M?N个像素。例如,一幅640?480的图像,就表示这幅连续图像在长、宽方向上分别分成640个和480个像素。显然,想要得到更加清晰的图像质量,就要提高图像的采样像素点数,即使用更多的像素点来表示该图像。
客观世界是三维的,从客观场景中所拍摄到的图像是二维信息。因此,一幅图像可以定义为一个二维函数f(x,y),其中x,y是空间坐标。对任何一对空间坐标(x,y)上的幅值f(x,y),成为表示图像在该点上的强度或灰度,或简称为像素值。因为矩阵是二维结构的数据,同时量化值取整数,因此,一幅数字图像可以用一个整数矩阵来表示。矩阵的元素位置(i,j),就对应于数字图像上的一个像素点的位置。矩阵元素的值f(i,j)就是对应像素点上的像素值。
值得注意的是矩阵中元素f(i,j)的坐标含义是i为行坐标,j是列坐标。而像素f(x,y )的坐标含义一般指直角坐标系中的坐标,两者的差异如下图:
0
矩阵元素 f (i,j) 行坐标(i)
0
图 1.1 矩阵坐标系与直角坐标系
像素f(x,y)
横坐标(x)
列坐标(j)
纵坐标(y)
对应于不同的场景内容,数字图像可以大致分为二值图像,灰度图像,彩色图像三类。
1)二值图像
它是指每个像素不是黑就是白,其灰度值没有中间过度的图像。二值图像对画面的细节信息比较粗略,适合于文字信息图像的描述。它的矩阵取值非常简单,即f(i,j)=0(黑),或f(i,j)=1(白),除此之外没有其他的取值。当然,0和1表示黑或白都只是人定义的,可以人为地反过来定义。这种图像具有数据量小的优点。 2)灰度图像
它是指每个像素的信息由一个量化后的灰度级来描述的数字图像,灰度图像中不包含彩色信息。标准灰度图像中每个像素的灰度有一个字节表示,灰度级数