matlab
1、采用阈值法实现图像分割,分别采用两种阈值选取方法实现。
%(1)lab41.m
close all;
clear;
clc;
I=imread('lab4.jpg');
I=rgb2gray(I);
I1=double(I);
figure('NumberTitle','off','name','直方图');
%显示各图像
subplot(1,2,1); imshow(I); title('原始图像','FontName','宋体');
subplot(1,2,2); imhist(I); title('直方图','FontName','宋体'); ylim('auto');
J1=histSeg(I,0,120,0);
% J1=im2bw(I,120/255);
figure('NumberTitle','off','name','直方图门限选择');
%显示各图像
subplot(1,2,1); imshow(I); title('原始图像','FontName','宋体');
subplot(1,2,2); imshow(J1); title('直方图门限选择','FontName','宋体');
J2=iterationSeg(I,0.1,0);
figure('NumberTitle','off','name','迭代阈值分割');
%显示各图像
subplot(1,2,1); imshow(I); title('原始图像','FontName','宋体');
subplot(1,2,2); imshow(J2); title('迭代阈值分割','FontName','宋体');
%Otsu阈值进行分割
T=graythresh(I);
J3=im2bw(I,T);
figure('NumberTitle','off','name','Otsu分割');
subplot(1,2,1); imshow(I); title('原始图像','FontName','宋体');
subplot(1,2,2); imshow(J3); title('Otsu分割——系统函数实现','FontName','宋体');
%(2)直方图门限选择histSeg.m
function j=histSeg(i,T1,T2,n)
[width,height]=size(i);
for x=1:width
for y=1:height
if(i(x,y)>=T1&&i(x,y)<=T2)
j(x,y)=n;
else
j(x,y)=abs(n-1);
end
end
end
%(3)迭代阈值分割iterationSeg.m
function j=iterationSeg(i,val,n)
[width,height]=size(i);
j=zeros(width,height);
T1=(min(i(:))+max(i(:)))/2;%计算输入图像灰度中值
%基于T1将图像分为left和right两部分
left=i<=T1;
right=i>T1;
%计算两部分灰度均值的灰度中值
T2=(mean(i(right))+mean(i(left)))/2;
while abs(T2-T1)<val%判断有无满足精度要求
T1=T2;
right=i>T1;
left=i<=T1;
T2=(mean(i(right))+mean(i(left)))/2;
end
%基于T2进行阈值分割
for row=1:width
for col=1:height
if(i(row,col)<T2)
j(row,col)=n;
else
j(row,col)=abs(n-1);
end
end
end
原始图像的灰度直方图
直方图门限选择
迭代阈值分割
Otsu分割系统函数实现
2、分别用Roberts,Sobel和拉普拉斯高斯算子对图像进行边缘检测,比较三种算子处理的不同之处。
%(1)主函数lab42.m
close all;
clear;
clc;
I=imread('lab4.jpg');%输入图像
I=rgb2gray(I);
I1=im2bw(I);
J1=Roberts(I1);%用Roberts算子进行边缘检测
J2=Sobel(I1);%用Sobel算子进行边缘检测
J3=LOG(I1);%用Log算子进行边缘检测
% J1=edge(I,'roberts');%用Roberts算子进行边缘检测
% J2=edge(I,'sobel'); %用Sobel算子进行边缘检测
% J3=edge(I,'log'); %用Log算子进行边缘检测
figure('NumberTitle','off','name','边缘检测'),
subplot(2,2,1);imshow(I);title('原始图像','FontName','宋体');
subplot(2,2,2);imshow(J1);title('Roberts算子','FontName','宋体');
subplot(2,2,3);imshow(J2);title('Sobel算子','FontName','宋体');
subplot(2,2,4);imshow(J3);title('LOG算子','FontName','宋体');
%(2)自定义Roberts算子Roberts.m
function j=Roberts(i)
[width,height]=size(i);%得到图像的长和宽
j=i;
%Roberts算子
Tx=[-1 0;0 1];
Ty=Tx';
[n,n]=size(Tx);
for row=1:width-(n-1)
for col=1:height-(n-1)%height
mark=i(row:row+(n-1),col:col+(n-1));
temp=Tx.*mark;
tempX=temp(:);
temp=Ty.*mark;
tempY=temp(:);
pointX=0;
pointY=0;
for loc=1:n*n
pointX=pointX+tempX(loc);
pointY=pointY+tempY(loc);
end
j(row,col)=abs(pointX)+abs(pointY);
end
end
%(3)自定义Sobel算子Sobel.m
function j=Sobel(i)
[width,height]=size(i);%得到图像的长和宽
j=i;
%Sobel算子
Tx=[-1 -2 -1;0 0 0;1 2 1];
Ty=Tx';
[n,n]=size(Tx);
for row=1:width-(n-1)
for col=1:height-(n-1)
mark=i(row:row+(n-1),col:col+(n-1));
temp=Tx.*mark;
tempX=temp(:);
temp=Ty.*mark;
tempY=temp(:);
pointX=0;
pointY=0;
for loc=1:n*n
pointX=pointX+tempX(loc);
pointY=pointY+tempY(loc);
end
j(row+(n-1)/2,col+(n-1)/2)=sqrt(pointX^2+pointY^2);
end
end
%(4)自定义LOG算子LOG.m
function j=LOG(i)
[width,height]=size(i);%得到图像的长和宽
j=i;
%LOG算子
T=[-2 -4 -4 -4 -2;-4 0 8 0 -4;-4 8 24 8 -4;-4 0 8 0 -4;-2 -4 -4 -4 -2];
[n,n]=size(T);
for row=1:width-(n-1)
for col=1:height-(n-1)
mark=i(row:row+(n-1),col:col+(n-1));
temp=T.*mark;
temp=temp(:);
point=0;
for loc=1:n*n
point=point+temp(loc);
end
point=point/(n*n);
j(row:row+(n-1),col:col+(n-1))=point;
end
end
3、实现肺的分割,结果包括两部分:肺(白色显示)和背景(黑色显示)。
% lab43.m
close all;
clear;
clc;
I=imread('lab4.tif');
I=rgb2gray(I);
I1=double(I);
J1=iterationSeg(I,0.1,0);
J2=imcomplement(J1); %图像二值反转
L=bwlabel(J2,8);%连通标记
s = regionprops(L,'Area');%将连通标记结果对应连通区域计算面积
J2=ismember(L,find([s.Area]>=400&[s.Area]<=16000));%去除面积过大的(为背景)和面积过小的(为气管),得到肺实质初始区域
imwrite(J2,'lab52.tif');
figure('NumberTitle','off','name','迭代阈值分割');
%显示各图像
subplot(2,2,1); imshow(I); title('原始图像','FontName','宋体');
subplot(2,2,3); imshow(J1); title('迭代阈值分割','FontName','宋体');
subplot(2,2,4); imshow(J2); title('分割肺','FontName','宋体');
进一步理解了图像分割和边缘检测。edge函数进行边缘检测的边缘并不连续。
关于肺的分割,其核心是将肺实质分割出来,而诸如躯干、气管等如果不加处理,后续计算量将增加。