【MATLAB】图像分割实验

这篇具有很好参考价值的文章主要介绍了【MATLAB】图像分割实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验目的

充分利用所学各种图像处理技术,实现对图像的综合处理,加深对基础知识的理解和应用。

实验内容

(1)将已知图像进行消噪处理;
(2)对彩色图像进行目标和背景分析;
(3)自编多种分割算法(其中必须包含:最大类间分割、基于迭代的阈值分割、基于Hough变换、基于kmeans分割)将图像进行分割;
(4)提取目标。

代码区:

clc;
clear;
close all;
%(1)将已知图像进行消噪处理
Image=imread('apple.png');
figure;
subplot(221),imshow(Image),title('原图');

%均值滤波
R=imfilter(Image(:,:,1),fspecial('average',[3,3]),'conv');
G=imfilter(Image(:,:,2),fspecial('average',[3,3]),'conv');
B=imfilter(Image(:,:,3),fspecial('average',[3,3]),'conv');
result1=cat(3,R,G,B);
subplot(222),imshow(result1),title('3*3均值滤波');
%高斯滤波
R=imfilter(Image(:,:,1),fspecial('gaussian',[3,3],0.6),'conv');
G=imfilter(Image(:,:,2),fspecial('gaussian',[3,3],0.6),'conv');
B=imfilter(Image(:,:,3),fspecial('gaussian',[3,3],0.6),'conv');
result2=cat(3,R,G,B);
subplot(223),imshow(result2),title('高斯滤波,标准差0.6');
%中值滤波
R=medfilt2(Image(:,:,1),[3 3]);
G=medfilt2(Image(:,:,2),[3 3]);
B=medfilt2(Image(:,:,3),[3 3]);
result3=cat(3,R,G,B);
subplot(224),imshow(result3),title('3*3中值滤波')

结果:
【MATLAB】图像分割实验
基于分类思路的三种阈值分割方法

clc;
clear;
close all;
%OTSU方法二值化
Image=rgb2gray(imread('apple.png'));
subplot(121),imshow(Image),title('原始图像');
result=imbinarize(Image);
subplot(122),imshow(result),title('OTSU方法二值化图像');

%最大熵法
tic;
Image=rgb2gray(imread('apple.png'));
subplot(121),imshow(Image),title('原图');
hist=imhist(Image);
bottom=min(Image(:))+1; %图中最小灰度+1,防止下标为0
top=max(Image(:))+1;    %图中最大灰度
J=zeros(256,1);
for t=bottom:top-1
    po=sum(hist(bottom:t));%当前阈值t下的,目标区域概率
    pb=sum(hist(t+1:top)); %当前阈值t下的,背景区域概率
    ho=0;hb=0;
    for j=bottom:t
        ho=ho-log(hist(j)/po+0.01)*hist(j)/po;%当前阈值t下的,目标区域熵计算
    end
    for j=t+1:top
        hb=hb-log(hist(j)/pb+0.01)*hist(j)/pb;%当前阈值t下的,背景区域熵计算
    end
    J(t)=ho+hb;%当前阈值下,熵函数的计算
end
[maxJ,pos]=max(J(:));%熵函数最大值
result=zeros(size(Image));
result(Image>pos)=1;
subplot(122),imshow(result),title('最大熵法分割图像');
toc;
%%
%最小误差法
Image=rgb2gray(imread('apple.png'));
% Image=imread('limi.jpg');
subplot(121),imshow(Image),title('原图');
hist=imhist(Image);
bottom=min(Image(:))+1;top=max(Image(:))+1;%灰度值范围
J=zeros(256,1)+256;     %这样预设置矩阵会有些灰度级值为0,影响选择,故初始化值为0+256,以防有些未处理的0被选为最小。
alpha=0.3;                                %目标区域占总的比重
scope=find(hist>5);%估计概率密度时,每一类要保证一定的样本数目,排除直方图两端
                   %概率很小的灰度级,避免估计不准确导致计算偏差
minthresh=scope(1);maxthresh=scope(end);
if maxthresh>=top
    maxthresh=top-1;
end
for t=minthresh+1:maxthresh
    miuo=0; sigmaho=0;
    for j=bottom:t
        miuo=miuo+hist(j)*double(j);
    end
    pixelnum=sum(hist(bottom:t));
    miuo=miuo/pixelnum;     %当前阈值下,求目标区域的均值
    for j=bottom:t
        sigmaho=sigmaho+(double(j)-miuo)^2*hist(j);
    end
    sigmaho=sigmaho/pixelnum;%当前阈值下,求目标区域的方差
    miub=0;sigmahb=0;
    for j=t+1:top
        miub=miub+hist(j)*double(j);
    end
    pixelnum=sum(hist(t+1:top));
    miub=miub/pixelnum;     %当前阈值下,求背景区域的均值
    for j=t+1:top
        sigmahb=sigmahb+(double(j)-miub)^2*hist(j);
    end
    sigmahb=sigmahb/pixelnum;%当前阈值下,求背景区域的方差
    Epsilonb=0;              %各区域误判概率初始化
    Epsilono=0;
    for j=bottom:t
        pb=exp(-(double(j)-miub)^2/(sigmahb*2+eps))/(sqrt(2*pi*sigmahb)+eps);%当前阈值下背景区域的误判概率
        Epsilonb=Epsilonb+pb;
    end
    for j=t+1:top
        po=exp(-(double(j)-miuo)^2/(sigmaho*2+eps))/(sqrt(2*pi*sigmaho)+eps);%当前阈值下目标区域的误判概率
        Epsilono=Epsilono+po;
    end
    J(t)=alpha*Epsilono+(1-alpha)*Epsilonb;%当前阈值下,整体误判概率
end
[minJ,pos]=min(J(:));%求最小误判概率
result=zeros(size(Image));
result(Image>pos)=1;
subplot(122),imshow(result),title('最小误差分割图像'); 

【MATLAB】图像分割实验【MATLAB】图像分割实验【MATLAB】图像分割实验

自编多种分割算法(其中必须包含:最大类间分割、基于迭代的阈值分割、基于Hough变换、基于kmeans分割)将图像进行分割;

%自编最大类间方差法
clc;
clear;
close all;
Image=imread('apple.png');
subplot(221),imshow(Image),title('原图');
[M,N]=size(Image);
pixelnum=M*N;
% for n=1:256%循环
% hist(n)=length(find(Image==n-1));
% p1(n)=hist(n)/pixelnum;
% end
hist=imhist(Image);%向量实现
p1=hist/pixelnum;
bottom=min(Image(:))+1;%最小灰度+1,防止下标为0
top=max(Image(:))+1;   %图中最大灰度
miub=zeros(256,1);
miuin=zeros(256,1)+10000;%取最小值时加一个较大的常数,消除0对结果的影响
T=zeros(256,1)+10000;
for t=bottom:top%这里bottom+1防止t与bottom相等,top-1防止t与top相等
    miuO=0;miuB=0;sigmaho=0;sigmahb=0;miu=0;
    po=sum(p1(bottom:t));%计算当前阈值下,目标区域在图像中的分布概率
    pB=sum(p1(t+1:top));  %计算当前阈值下,背景区域在图像中的分布概率
    for j=bottom:t
        miuO=miuO+double(j)*p1(j);   %double(j)是为了能够进行浮点数运算
    end
    miuO=miuO/po;         %计算当前阈值下,目标区域在图像中的均值
    for j=t+1:top
        miuB=miuB+double(j)*p1(j);  %double(j)是为了能够进行浮点数运算
    end
    miuB=miuB/pB;         %计算当前阈值下,背景区域在图像中的均值
    miu=po*miuO+pB*miuB;  %计算当前阈值下,图像总体的灰度均值
    for j=bottom:t
        sigmaho=sigmaho+p1(j)*(double(j)-miuO)^2;
    end
    sigmaho=sigmaho/po;%计算当前阈值下,目标区域的方差
    for j=t+1:top
        sigmahb=sigmahb+p1(j)*(double(j)-miuB)^2;%double(j)是为了能够进行浮点数运算
    end
    sigmahb=sigmahb/pB;%计算当前阈值下,背景区域的方差
    %总类类内方差
    miuin(t)=po*sigmaho+pB*sigmahb;
    %两类类间方差
    miub(t)=po*(miuO-miu)^2+pB*(miuB-miu)^2;
    T(t)= miuin(t)/miub(t);
end
[maxmiub,pos]=max(miub(:));%求最大类间方差的值
subplot(222);imshow(im2bw(Image,graythresh(Image)));  title('matlab自带');
subplot(223),imshow(im2bw(Image,pos/256)),title('自编OTSU(最大类间方差的值)');


%%
%基于迭代的阈值分割
clc;
clear;
close all;
Image=imread('apple.png');
% Image=imread('qiang1.jpg');
subplot(121),imshow(Image),title('原图');
T=(max(Image(:))+min(Image(:)))/2;%初始化阈值
equal=false;
while ~equal
    ro=find(Image<T);  %获取目标的像素点
    rb=find(Image>=T); %获取背景的像素点
    NewT=(mean(Image(ro))+mean(Image(rb)))/2;%新的阈值
    equal=(NewT-T)<(1/256);
    T=NewT;
end
subplot(122),imshow(im2bw(Image,T/256)),title('自编迭代方法二值化图像');


%%
%基于Hough变换
clear;
close all;
clc;
Image=rgb2gray(imread('apple.png'));
bw=edge(Image,'canny');%canny算子边缘检测得二值边缘图像
figure,imshow(bw);
[h,t,r]=hough(bw,'RhoResolution',0.5,'Thetaresolution',0.5);
figure,imshow(imadjust(mat2gray(h)),'XData',t,'YData',r,'InitialMagnification','fit');
xlabel('\theta'),ylabel('\rho');
axis on,axis normal,hold on;
P=houghpeaks(h,2);
x=t(P(:,2));y=r(P(:,1));
plot(x,y,'s','color','r');
lines=houghlines(bw,t,r,P,'FillGap',5,'Minlength',7);%检测图像中得直线段
figure,imshow(Image);
hold on;
max_len=0;
for i=1:length(lines)
    xy=[lines(i).point1;lines(i).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','g');
    plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','y');
    plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','r');
end
hold off


%%
%kmeans
clc;
clear;
close all;
Image=im2double(imread('apple.png'));
[M,N]=size(Image);
subplot(221),imshow(Image),title('原图');
hsv=rgb2hsv(Image);
h=hsv(:,:,1);
h(h>330/360)=0;%接近360°的色调认为是0°
training=h(:);%获取训练数据
startdata=[0;60/360;120/360;180/360;240/360;300/360];%初始点数据
% [IDX,C]=kmeans(training,6,'start',startdata);
[IDX,C]=kmeans(training,6,'start',startdata);%调用自带函数
[MinVal,Num]=k_means(training,6,startdata);%调用自编函数
idbw1=(IDX==1);%取边缘
template1=reshape(idbw1,size(h));%二值化图像
idbw2=(Num==1);
template2=reshape(idbw2,size(h));
subplot(222),imshow(template1),title('k均值聚类分割');
subplot(223),imshow(template2),title('自编k均值聚类分割(逃课版)');
% for m=1:M
%  for n=1:N/3
%   if template2(m,n)==1
%     template2(m,n)=0; 
%   else
%     template2(m,n)=1;
%   end
%  end
% end
R=Image(:,:,1);
G=Image(:,:,2);
B=Image(:,:,3);
R1=R.*double(template1);
G1=G.*double(template1);
B1=B.*double(template1);
templateR=cat(3,R1,G1,B1);
subplot(224),imshow(templateR),title('自编k均值聚类分割(逃课版)');


%%
%自编k均值聚类分割
%通过计算欧式距离来迭代的k均值版本
clear;
clc;
close;
Image=rgb2gray(imread('apple.png'));
subplot(121),imshow(Image),title('原图');
% Image=imread('qiang.jpg');
[M,N]=size(Image);%获取图像的大小
%随机初始化聚类中心
h=double(Image);
k=4;
training=h(:);%training是N*n的向量,每行对应一个点,每点为n维度;k为要聚成的类别数
startdata=randperm(size(training,1));%随机生成初始点
startdata=double(Image(startdata(1:k)));%获取对应初始点的灰度值
startdata(1)=0;%设置第一类灰度值中心为;
flag=false;%设置脱离循环的变量
dist=zeros(size(training,1),k);%预设置dist的大小(理论上能提高运算速度)

while ~flag%为ture时运行,flag==false取反运行,false==0,ture==1
 for m=1:k
 dist(:,m)=sqrt((training-startdata(m)).^2);%计算每个点到初始点的距离
 end
 [MinVal,Num]=min(dist,[],2);%min(dist,[],2)函数选出每行最小的点放于MinVal,
                            %并选出的它的列索引(分类依据,第几列就是第几类)放于Num
 for m=1:k
 Temp(:,m)=mean(Image(find(Num==m)));%计算每个类别的均值
 end
 
 flag=max(Temp-startdata)<0.1;%判断前后两次迭代的中心点灰度值的差值是否相同,0.1为判断的阈值
 if flag==1%如果两次迭代中心点取值相同flag==1跳出循环;
    break
 else
 startdata=Temp;%否则再次迭代
 end
end
% [MinVal,IDX]=min(dist,[],2);
idbw=(Num==1);
template=reshape(idbw,size(h));
subplot(122),imshow(template),title('k均值聚类分割');

第一段代码结果
【MATLAB】图像分割实验
第二段代码结果
【MATLAB】图像分割实验
第三段代码结果
【MATLAB】图像分割实验
第四段代码结果

【MATLAB】图像分割实验

该目标提取基于在HSV空间中的kmeans聚类分割方法。

%目标提取
clc;
clear;
close all;
Image=im2double(imread('apple.png'));
R=imfilter(Image(:,:,1),fspecial('gaussian',[3,3],0.6),'conv');%对图像进行平滑处理
G=imfilter(Image(:,:,2),fspecial('gaussian',[3,3],0.6),'conv');
B=imfilter(Image(:,:,3),fspecial('gaussian',[3,3],0.6),'conv');
% R=imfilter(Image(:,:,1),fspecial('average',[3 3]),'conv');
% G=imfilter(Image(:,:,2),fspecial('average',[3 3]),'conv');
% B=imfilter(Image(:,:,3),fspecial('average',[3 3]),'conv');
Image=cat(3,R,G,B);
[M,N]=size(Image);
subplot(221),imshow(Image),title('原图');
hsv=rgb2hsv(Image);
h=hsv(:,:,1);
h(h>330/360)=0;%接近360°的色调认为是0°
training=h(:);%获取训练数据
startdata=[0;60/360;120/360;180/360;240/360;300/360];%初始点数据。注:设为列向量,方便后续处理
[IDX,C]=kmeans(training,6,'start',startdata);%调用自带函数
[MinVal,Num]=k_means(training,6,startdata);%调用自编函数
idbw1=(IDX==1);%取边缘
template1=reshape(idbw1,size(h));%二值化图像
idbw2=(Num==1);
template2=reshape(idbw2,size(h));
subplot(222),imshow(template1),title('k均值聚类分割');
subplot(223),imshow(template2),title('自编k均值聚类分割(逃课版)');
R=Image(:,:,1);
G=Image(:,:,2);
B=Image(:,:,3);
Template=rem(template2+1,2);%将模板中1变成00变成1,从而将背景变成白色,也不影响目标的提取
R1=R.*template2+Template;
G1=G.*template2+Template;
B1=B.*template2+Template;
templateR=cat(3,R1,G1,B1);
subplot(224),imshow(templateR),title('目标提取');

【MATLAB】图像分割实验
以下是k_means()自编函数的定义:

function [MinVal,Num] = k_means(training,k,startdata)
%KMEANS 此处显示有关此函数的摘要
%   此处显示详细说明
%MinVal是HSV中V的距离最小值,Num是N*1的向量,其元素为每个点所属类别的类序号

%training是N*n的向量,每行对应一个点,每点维度为n
%这里由于取得是hsv色彩空间下得v分量(该分量是以角度表示的)为一维,故n为1;
%即training是N*1的一个列向量

%k为要聚成的类别数(如k=6时,将360划分为六个区间)

%startdata是预先设定好的中心点的集合,如30°点等等
%在上面的代码段中创建的,n*1的列向量

%创建一个和training等大的向量,用0填充
dist=zeros(size(training,1),k);

%循环计算出每个点到每个中心点的距离,然后将该距离存为N*k的矩阵
%N等于点的个数,有多少个点,N就是多大,k=6是类别数
for m=1:k
dist(:,m)=sqrt((training-startdata(m)).^2);
end

%min(A,[],2)取每行数取最小值,这样就找到最近中心点了
[MinVal,Num]=min(dist,[],2);
end

总结:

对于彩色图像的目标提取和背景分析,步骤基本如下:
1, 读取目标图像
2, 对目标图像消去噪声
3, 对目标图像灰度化;
4, 通过诸如OTSU,最大类间,最小误差,迭代,hough,kmeans等分割方法,将图像的目标和背景分割开
5, 进行目标提取
在实验过程中,可以发现,根据图像的色彩的复杂程度,不同的算法有着不同的效果。
在对色彩较为复杂的图处理时,以kmeans分割法在HSV空间对V进行分割的效果最好。基本上可以把目标和背景进行分割,便于目标的提取。但由于与书上讲述的计算欧式距离的kmeans算法相比。在HSV空间聚类的算法,更为简单易懂。就像游戏里的逃课打法一样,简化了聚类的计算。故称为逃课版。
然而,matlab自带的kmeans函数处理结果与逃课版的处理结果基本一致,而按书本理论上的计算欧式距离,进行k均值聚类的结果,却差强人意,令人感慨。
而在RGB空间中,分割下来的情况,实在不尽人意,目标和背景时常混杂在一起,无法分割开来。
PS:由于当时一时疏忽,忘记将自编代码段上传(当时期末压力太大,人晕了),导致阅读不便,深感抱歉。已于2022/10/12下午16时补全,本人能力有限,如有纰漏,望不吝赐教,万分感谢。
还有一点,由于csdn私信充斥各种广告,本人随缘看私信的。如果私信一两天没回,后续时间长了,也就更不会回复了,见谅。
2022/11/30,本文章的收藏增加。故重新审视一番,修复了几处排版不合理,文字表达不当之处。以报各位厚爱之情。文章来源地址https://www.toymoban.com/news/detail-443255.html

到了这里,关于【MATLAB】图像分割实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字图像处理:实验六 图像分割

    数据分割是由图像处理到图像分析的关键步骤,是图像识别和计算机视觉至关重要的预处理,图像分割后提取的目标可用于图像识别、特征提取,图像搜索等领域。图像分割的基本策略主要是基于图像灰度值的两个特性,即灰度的不连续性和灰度的相似性,因此图像分割方法

    2024年02月06日
    浏览(52)
  • Matlab|图像处理04|图像分割-阈值分割方法

    一、人工阈值分割方法threshold_test1.m 1、分析修改阈值对分割结果的影响 分析:取直方图中第一个谷底的灰度值作为阈值,图像分割效果较好。当阈值改变时,分割后的图像有部分信息丢失,本图中当阈值减小时分割后的图像黑色部分较多,当阈值增大时分割后的图像白色部

    2024年02月11日
    浏览(53)
  • MATLAB图像分割之阈值分割

            可以通过图像全局的信息,例如整个图像的灰度直方图。如果在整个图像中只使用一个阈值,则这种方法叫做全局阈值法,整个图象分成两个区域,即目标对象(黑色)和背景对象(白色)。全局阈值将整个图像的灰度阈值设置为常数。 I=imread(\\\'veg.png\\\'); figure,imshow(I); I2=r

    2024年02月07日
    浏览(45)
  • 【图像分割】Unet-ConvLstm利用时序信息进行视频分割

    文章: Exploiting Temporality for Semi-Supervised Video Segmentation 代码: https://github.com/mhashas/Exploiting-Temporality-For-Semi-Supervised-Video-Segmentation 理解: 使用单帧标注,对视频进行分割。利用时间维度信息来推断空间信息。将传统FCN转化成时间-空间FCN。 方法: 通过FCN语义分割网络,对时间

    2023年04月27日
    浏览(55)
  • 实验三 图像分割与描述

    一、实验目的: (1)进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。 (2)掌握图像分割方法,熟悉常用图像描述方法。 二、实验原理 1.肤色检测 肤色是人类皮肤重要特征之一,在检测人脸或手等目标时常采用肤色检测的方法,将相关区域从图像中分割出来

    2024年02月12日
    浏览(38)
  • 深度学习实验-3d医学图像分割

    实验四 基于nnU-Net模型的3D医学图像分割实验 腹部多器官分割一直是医学图像分析领域最活跃的研究领域之一,其作为一项基础技术,在支持疾病诊断,治疗规划等计算机辅助技术发挥着重要作用。近年来,基于深度学习的方法在该领域中获得了巨大成功。本实验数据集为多

    2024年02月07日
    浏览(61)
  • (数字图像处理MATLAB+Python)第十章图像分割-第一、二节:阈值分割和边界分割

    图像分割 :在对图像的研究和应用中,人们往往仅对图像中的某些目标感兴趣,这些目标通常对应图像中具有特定性质的区域。图像分割是指把一幅图像分成不同的具有特定性质区域的图像处理技术,将这些区域分离提取出来,以便进一步提取特征和理解 图像分割方法多种

    2024年02月16日
    浏览(65)
  • 计算机视觉实验五——图像分割

    了解图割操作,实现用户交互式分割,通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域,实现分割。 采用聚类法实现图像的分割(K-means方法)。 ①图片准备 博主选择了一张 前景与背景区分明显 的图片,和一张 前景与背景区分不明显 的

    2024年04月15日
    浏览(49)
  • YOLOv8改进 | 主干篇 | 利用图像分割网络UNetV2改善图像分割检测性能(全网独家首发)

    本文给大家带来的改进机制是利用图像分割网络UNetV2的主干来改进我们的YOLOv8分割模型 (本文的内容虽然YOLOv8所有的功能的用户都能使用,但是还是建议分割的用户使用), U-Net v2 旨在改进医学图像分割的性能,通过引入一种新的、更为高效的跳跃连接设计来实现。这个版

    2024年04月17日
    浏览(43)
  • 图像分割(MATLAB实现)

    图像分割 就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。 现有的图像分割方法主要分以下几类: 基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法 等

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包