数字图像处理实验_阈值分割算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数字图像处理》实验
9.编写程序,实现阈值分割算法.
%9.编写程序,实现阈值分割算法.
%这段代码的想法是通过相邻两个像素的平均值的比较来确定阈值的选取。
%通过f(i-1,j-1),f(i,j),f(x,+1,j+1)这三个两两相邻的像素的平均值来比较。
%若两个平均值的差值小于某一个指定的值,这取这个平均值作为新的阈值。
%这样可以把图像中像素比较平缓的部分和像素差别比较大的部分分割开来。
clear;
f = imread('text.jpg');
f=rgb2gray(f);
f = im2double(f);
g=f;
[m,n] = size(f);
x=0.1;%x作为判断的值,两个平均值的差不小于x;
d = false;
while~d
fori=2:m-1%为确保f(i,j)的取值在原图的范围内需要保证的范围。
forj=2:n-1
t = (f(i-1,j-1)+f(i,j))/2;%求三个两两相邻的像素点的像素的平均值t1 =
(f(i,j)+f(i+1,j+1))/2;
d = abs(t1-t) t1 =(t+t1)/2;%则取这两个值的平均值作为新的阈值;end end end b=im2bw(f,t1);%为方便观察将灰度图像转换成黑白二值图像imshow(b); figure,imshow(g); 2.编写程序,实现图像的实数倍放大 %放大基于像素放大 %图像放大,比如600*600的图像放大到800*800,那么就比原来多了 200*200行,%那么这200*200行如果没有进行插值填充,那么就会出现黑白点,以下的代码操作结果就是%这样的。 %以下代码的大概想法是:新建一个矩阵,大小与原图像相同,然后对原图像的每个像素进行放%大 %放大的倍数为X。为了确保图像像素为整数,故使用round函数取整 a=imread('text.jpg'); imshow(a); b=size(a);%生成一个大小与a相同的矩阵原图大小为199*243;x=2;%放大倍数但这个倍数的大小不能<2,因为大于二之后round %(i/x)的值就会为0. fori=1:1:round(x*199);%round取整,取最近的整数;i的取值从1开始,以x*199%为终点,以1为步长增长。 forj=1:1:round(x*243);%则i的取值范围为1到199*x中的整数值,j的取值%为1到243*x的整数值 b(i,j)=a(round(i/x),round(j/x));%将a中i n/x行,j/x的整数列的值%赋给b的i 行j列。 end end figure,imshow(b); 3.编写程序,对图象进行中值滤波,并与实现相同功能的Matlab函数进行运算速度比较. %%自编的中值滤波函数。 %以下代码的主要思想及步骤是:设置一个滤波模版大小为[7,7]。然后从f的(i,j)开始取出一个大小为[7,7]模版; %计算模版中值并将模版各元素的中值赋给模版中心位置的元素。 %实验中我用了3*3、5*5、7*7三个大小的模版去做测试,我发现3*3的模版中值滤波后的效%果没有5*5、7*7的模版的滤波效果那么好。 %但7*7的模版效果有点过了。在边界的地方会出现斑点。 %而且这个程序运行的时间明显感觉到比直接用中值滤波函数medifilt2的时间要长。 f=imread('Blue hills.jpg'); f = f(:,:,1); g = imnoise(f,'salt & pepper',0.08);% %这部分是自编的中值滤波函数。首先取出一个模板,将该模板转换成一个行矩阵,利用median函数取矩阵的中值。%然后将该中值赋值到模板的中心位置。其他未被赋值的元素则用原来的值填充。 %如果这个步骤的话,最后结果出来会是一个有黑白点的图片。 n=7;%n的值即为模版的大小; [x,y]=size(g);%取原图像的行数列数 g1=double(g); g2=g1; fori=1:x-n+1%滤波范围 forj=1:y-n+1 c=g1(i:i+(n-1),j:j+(n-1));%取出x1中从(i,j)开始的n行n列元素,即模板d =c(1,:);%是c矩阵的第一行 for u=2:n %第二到第三行 d =[d,c(u,:)];%将c矩阵变为一个行矩阵 end mm=median(d);%mm是中值median 函数用来求行矩阵e的中值;g2(i+(n-1)/2,j+(n-1)/2)=mm;%将模板各元素的中值赋给模板中心位置的元素end end Y = uint8(g2);%其他未被赋值的元素则用原来的值填充. imshow(Y);%显示自己编程运行的中值滤波 figure,imshow(g); 6.编写程序,对图像进行局部直方图均衡化,并与全局直方图均衡化结果进行比较. %前面部分的全局直方图均衡化是直接利用书本的函数来实现的 %后半部分对图像进行分割,并对分割后的一个图像做直方图均衡化。 %我对于局部图像的理解是在原图像中取出一部分像素, %因此就要对取出部分像素之外的像素赋值为0。 %从而得到局部图像,再对该图像做均衡化处理。 %局部图像均衡化处理与全局图像均衡化处理的差别取决于x的值 %如果x的值取得比较大,大于原图像的像素点,那么局部图象则与原图像差别不大clear; A=imread('4.png'); %---------全局直方图均衡化-------------------- f=A(:,:,1);%显示A的色度分量 g=histeq(f);%对f做直方图均衡化处理 imshow(g); title('对原始图像均衡化'); %--------局部直方图均衡化--------------------------- %对一个图像进行分割 %分割后的图像进行直方图均衡化处理 x = 390;%x为任意合适的值。用于对图像分割 [m,n]=size(f);%取f矩阵的行数和列数 f=double(f); C=zeros(m,n);%生成一个m行n列的矩阵 for i=1:m %i的取值从1到m, for j=1:n %j的取值从j到n if f(i,j)>x %对图像进行分割