《数字图像处理》实验
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
for i=2:m-1 %为确保f(i,j)的取值在原图的范围内需要保证的范围。
for j=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) 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. for i=1:1:round(x*199); %round取整,取最近的整数;i的取值从1开始,以x*199 %为终点,以1为步长增长。 for j=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; for i=1:x-n+1 %滤波范围 for j=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); for i=1:m for j=1:n if f(i,j)>x C(i,j)=0; else C(i,j)=f(i,j); end end end %生成一个m行n列的矩阵 %i的取值从1到m, %j的取值从j到n %对图像进行分割 %像素大于x的将像素值改为0, %其余的像素点则用原来的像素值 figure,imshow(mat2gray(C)); %mat2gray对C做归一化处理。 h1=histeq(mat2gray(C)); %对归一化后的图像做均衡化处理 figure,imshow(h1) title('对分割后图像做均衡化'); 7.编写程序,实现彩色图像的中值滤波增强. %7.编写程序,实现彩色图像的中值滤波增强. %对彩色图像进行中值滤波,思路是分别对R、G、B三幅图像进行中值滤波, %分别滤波完成之后再用cat函数将三幅图像连接起来,则可以得到彩色图像的中值滤波函数。 %我是每幅彩色分量图像做一次中值滤波,因为不知道怎么去做这三幅图像的一个循环,所以就相当于三幅图像复制了一份中值滤波的代码。 %其中中值滤布实现部分的代码是自己编程的一段中值滤波代码。 clear; f=imread('Blue hills.jpg'); f = uint8(f); R=f(:,:,1); %提取R分量 G=f(:,:,2); %提取G分量 B=f(:,:,3); %提取G分量 subplot(2,3,1),imshow(R); subplot(2,3,2),imshow(G); subplot(2,3,3),imshow(B); %-----------对R分量图像进行中值滤波处理------------------ n=7; %n的值即为模版的大小; [x,y]=size(R); %取原图像的行数列数 R1=double(R); R2=R1; for i=1:x-n+1 %滤波范围 for j=1:y-n+1 c=R1(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的中值; R2(i+(n-1)/2,j+(n-1)/2)=mm; %将模板各元素的中值赋给模板中心位置的元素 end end Y1 = uint8(R2); %其他未被赋值的元素则用原来的值填充. %-------------对G分量图像进行中值滤波---------------------------------- n=7; %n的值即为模版的大小; [x,y]=size(G); %取原图像的行数列数 B1=double(G); B2=B1; for i=1:x-n+1 %滤波范围 for j=1:y-n+1 c=B1(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的中值; B2(i+(n-1)/2,j+(n-1)/2)=mm; %将模板各元素的中值赋给模板中心位置的元素 end end Y2 = uint8(B2); %其他未被赋值的元素则用原来的值填充. 因篇幅问题不能全部显示,请点此查看更多更全内容