图像分割

摘 要:本实验采用Sobel算子对图像进行边缘检测,编写一个自动估计阈值的全局阈值化程序,对输入图像进行阈值分割,输出为分割后的二值图。另外,本实验用光渐变算法对图像进行污染,并设计了一个阈值化算法对图像进行阈值分割。由于采用自动估计阈值的全局阈值化算法以及Otsu算法都没有得到较好的分割结果,此实验便采用了模糊C均值(FCM)算法来实现分割,得到了相对
好一些的效果。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

function [imt,G] = Sobelgrads(ima,T)
%功能:计算Sobel梯度
%ima为输入图像,T为阈值
%imt为输出的二值图像,A为Sobel梯度数据
%M1,M2为Sobel模板
M1=[-1 -2 -1;0 0 0;1 2 1];
M2=M1';
imt=zeros(size(ima));
gx=imfilter(ima,M1);
gy=imfilter(ima,M2);
G=abs(gx)+abs(gy);
imt(G>=T)=1;
end
%-----------------------------------------
function pro1001
%计算Sobel梯度
ima=imread('Fig9.39(a).jpg');
T=160;
[imt,G1] = Sobelgrads(ima,T);
figure(1);
subplot(231); imshow(ima); title('原图像');
subplot(232); imshow(uint8(G1)); title('Sobel梯度图');
subplot(233); imshow(imt); title('二值图像');
figure(2);imhist(G1);
%先平滑处理,在计算Sobel梯度
H = [1,2,1;2,4,2;1,2,1]/16;
imb = imfilter(ima,H);
figure(1);
subplot(234); imshow(imb); title('平滑处理后图像');
[imt2,G2] = Sobelgrads(imb,T);
subplot(235); imshow(uint8(G2)); title('平滑处理后Sobel梯度图');
subplot(236); imshow(imt2); title('平滑处理后二值图像');
end
%-----------------------------------------------------
function [imt] = BGT(ima,t)
%功能:自动估值阈值的全阈值化程序
%ima为输入图像
%t用来控制迭代的次数
%imt为分割后的二值图
[m,n]=size(ima);
%用图像的平均灰度初始T
T=sum(sum(ima))/(m*n);
imt=zeros(m,n);
his=imhist(ima);
cnt=1;
while(cnt<=100)
    r1=(find(his>T));
    r2=(find(his<=T));
    m1=sum(r1)/length(r1);
    m2=sum(r2)/length(r2);
    Tresult=0.5*(m1+m2);
    if (abs(Tresult-T)<t)
        break;
    else
        T=Tresult;    
    end
    cnt=cnt+1;
end
display(cnt);
display(Tresult);
for i=1:m
    for j=1:n
     if ima(i,j)>T
         imt(i,j)=1;
     else
         imt(i,j)=0;
     end
    end
end
imt=logical(imt);

end
%---------------------------------------------
function pro1002
%用阈值化程序对图像中的目标进行分割
ima=imread('Fig10.36(b).jpg');
[m,n]=size(ima);
imt=BGT(ima,1.0e-2);
figure;subplot(121);imshow(ima);title('原图');
subplot(122);imshow(imt);title('阈值处理后的图像');
%用光渐变算法污染图像
imb=zeros(m,n);
r=linspace(0.2,0.6,n);
for i=1:n
    imb(:,i)=r(i);
end
figure;subplot(311);imshow(ima);title('带噪声的图像');
subplot(312);imshow(imb);
title('在【0.2,0.6】范围内的灰度斜坡图像');
imc=immultiply(double(ima),double(imb));
subplot(313);imshow(uint8(imc));title('图(a)和图(b)的乘积');
figure;
subplot(311);imhist(ima);
subplot(312);imhist(imb);
subplot(313);imhist(uint8(imc));imwrite(uint8(imc),'imc.jpg');
%设计一种阈值化算法对图像进行阈值分割
%先平滑
H = [1,2,1;2,4,2;1,2,1]/16;
imd = imfilter(imc,H);
imwrite(uint8(imd),'imd.jpg')
%采用模糊C均值算法对图像进行分割(FCM)
%调用编写的FCM算法,聚类中心设为两个,初始聚类中心设为【0.255】
FCM('imd.jpg',2,[0 277]);
end
%----------------------------------------------------

function [ clusterResult,im ] = FCM( imagePath,C,V,M,iter,epsm )
% clusterResult = FCM(imagePath, C, V, M, iter, epsm)
% Example: clusterResult =? FCM('E:\Image\lena.bmp')
% clusterResult =? FCM('E:\Image\lena.bmp',3,[0 127 255])
% Input:
% imagePath: 图像路径
% C: 类别数,缺省值为2
% V: 初始化聚类中心,缺省值为[0 255]
% M: 加权指数,缺省值为2
% iter: 迭代次数,缺省值为100
%epsm: 迭代停止阈值,缺省值为1.0e-2
% Output:
% clusterResult: 聚类中心结果
% Note:
% C的值要与V的初始化聚类中心个数相同
%设定缺省值
if nargin<6
    epsm=1.0e-2;
end
if nargin<5
    iter=100;
end
if nargin<4
    M=2;
end
if nargin<2
    C=2;
end

%读入图像
I=imread(imagePath);
figure;subplot(121);imshow(I);title('原图像');
[m, n]=size(I);
im=zeros(m,n);
grayHist=imhist(I);
%subplot(132);imhist(I);title('直方图');
%直方图归一化
histProb=grayHist/(m*n);
len=length(histProb);

cnt=0;
while(cnt<iter)
    %计算隶属度函数(注意要特殊考虑某个像素点和聚类中心一样的情况)
    for i=1:len
        flag=0;
        for j=1:C
            if i==V(j)
                U(i,j)=1.0;
                if j==1
                    U(j+1:C,i)=0.0;
                elseif j==C
                    U(1:C-1,i)=0.0;
                    U(j+1:C,i)=0.0;
                end
                flag=1;
                break;
            end
        end

        if flag==0;
            u=(1.0./((i-V).^2)).^(1.0/(M-1));
            uSum=sum(u);
            U(1:C,i)=u'/uSum;
        end
    end
    %计算更新各类聚类中心
    for j=1:C
        i=linspace(1,len,len);
        v=sum(histProb'.*i.*(U(j,:).^M));
        vSum=sum(histProb'.*(U(j,:).^M));
        if vSum==0
            clusterResult(j)=0;
        else
            clusterResult(j)=v/vSum;
        end
    end
    %计算误差并判断算法迭代是否停止
    diff=sum((clusterResult-V).^2);
    if diff<=epsm
        break;
    else
    V=clusterResult;
    end
    cnt=cnt+1;
end

%分割图像
for i=1:m
    for j=1:n
        temp=(double(I(i,j))-clusterResult).^2;
        [~, pos]=min(temp);
        im(i,j)=pos*255/C;
    end
end
subplot(122);imshow(uint8(im));
title('分割后的图像');
disp('迭代次数:iterTimes=');
disp(cnt);
disp('clusterResult');
disp(clusterResult);
end



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值