Matlab图像分割

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

第一部分.图像分割的含义

       图像分割是根据图像的灰度、颜色、几何形状、空间纹理等特征把图像分割为若干个互不相交的区域;实际上就是将自己在图片中的目标给提取出来,与背景分离;

第二部分.Matlab的图像分割的种类

   1.边缘检测法(利用目标与背景之间交界处的差别,提取边缘)

   2.阈值分割法(设定一个阈值,低于该阈值的地方为0黑,高于该阈值的地方为1白)

   3.区域分割法()

第三部分.边缘检测法

主要的检测方式:微分算子(Roberts算子、Sobel算子、Prewit算子),LOG算子,Canny算子; 

1.图像中线段的检测:

和滤波一样,要有模板,总共四种最基本的模板:

[-1 -1 -1; 2 2 2; -1 -1 -1] 水平检测

[-1 -1 2; -1 2 -1; 2 -1 -1] +45度检测

[-1 2 -1; -1 2 -1; -1 2 -1] 竖直检测

[2 -1 -1; -1 2 -1; -1 -1 2] -45度检测

然后将模板和图像进行结合滤波,用imfilter函数

2.微分算子

<1>Roberts算子:

clc
clear all
I = imread('dream.jpg');
I=rgb2gray(I);
[J, thresh] = edge(I, 'Roberts', 30/255); %进行边缘检测 ,Roberts算子, 分割阈值为30/255
figure;
subplot(121),imshow(I);
subplot(122),imshow(J);

里面的30/255是分割阈值,实际的阈值为thresh*256,这里的thresh为归一化后的值;

<2>Sobel算子:用法和Roberts算子的用法一样,只需将edge中的参数改成Sobel

<3>Prewit算子:用法和Roberts算子的用法一样,只需将edge中的参数改成Prewit

3.LOG算子:

在edge函数应用中,log和canny都对应着sigma参数,其是对应滤波器的标准差;Canny对应的是高斯滤波器(默认为sqrt(2)),LOG对应的是高斯拉普拉斯滤波器(默认为2)

4.Canny算子:

其特别的地方是他的阈值包括两个,一个低阈值,一个高阈值;忽略低于低阈值的边缘部分,保留高于高阈值的部分;

第四部分.阈值分割法

1.可以借助直方图来设置阈值,我们首先读取灰度图片,然后用imhist函数去显示直方图;

%图像分割(全局阈值,借助直方图)
clc
clear all
I=rgb2gray(imread('dream.jpg'));
figure (1)
imhist(I);
R=I>125;%大于125的地方为白(1),小于为黑(0)
figure(2);
imshow(R);

Matlab图像分割 可以看出我们可以从直方图中找出一个阈值,根据这个阈值来判断;

2.Otsu阈值分割,可以借助函数graythresh来自动获取阈值,然后根据这个阈值进行分割;

%Otsu阈值分割
clc
clear all
I=rgb2gray(imread('dream.jpg'));
M=graythresh(I);%自动获取阈值
J=im2bw(I,M);%根据M的大小来进行分割
figure;
imshow(J);

 3.迭代阈值分割,其原理很简单,首先是读取灰度图片,设置一个精度值(这里设的是S),在设置一个初值变量S1等于灰度图最大值和最小值之和的二分之一,再设置两个变量r1和r2,r1是所有大于初值变量S1的元素和,r2是所有小于等于S1的元素和;在设置变量S2等于(r1的平均数+r2的平均数)/2;在进入while循环,经过转换,让S1等于S2,再重复进行前几步,直到精度小于设定的精度S1;这时得到的S2为阈值,再通过im2bw来显示二值图;

%迭代式阈值分隔法
clc
clear all
I=rgb2gray(imread('dream.jpg'));
I=im2double(I);
S=0.1;
S1=(max(I(:))+min(I(:)))/2;
r1=find(I>S1);
r2=find(I<=S1);
S2=(mean(I(r1))+mean(I(r2)))/2;
while abs(S2-S1)>S
   S1=S2;
   r1=find(I>S1);
   r2=find(I<=S1);
   S2=(mean(I(r1))+mean(I(r2)))/2;
end
J=im2bw(I,S2);
figure;
imshow(J);

第五部分.区域分割法

1. 区域生长法:
区域生长是将一个种子(即点)不断地与周身的点进行比较然后融合行程大的区域,融合的条件是与周身邻域的点的相似度要小于一定的精度;然后不断地向外扩张融合,直到所以相似的点都被融合之后停止,这里我们用灰度值来进行测量;

区域生长一般分为以下几步:

1.确定种子点

2.确定是使用8邻域还是4邻域作为融合对象

3.灰度值之差与阈值之比(也可加上其他的判断条件,根据实际情况来设定)

4.直到停止生长,即再也没有满足生长的点

举例:文章来源地址https://www.toymoban.com/news/detail-445807.html

clc
clear all
I=rgb2gray(imread('dream.jpg'));
if isinteger(I)%判断是否为整数数组,若不为整数数组I的值过大,这样设置的精度就得改变,不能太小,否则无法得到想要的图片
    I=im2double(I);
end
figure 
imshow(I)
[M,N]=size(I);
[y,x]=getpts; %单击取点后,按enter结束
x1=round(x);%获得整数x
y1=round(y);%获得整数y
seed=I(x1,y1); %获取中心像素灰度值

grow1=zeros(M,N);%要绘制二值图,就可以先设置为0数组
grow1(x1,y1)=1;%种子点设为1,满足条件的点在后续判断中也会设为一

growcount=1; %待处理点个数
threshold=0.15;%与isinteger相互结合起来理解,如果没有isinteger,该值应该变得很大

while growcount>0
    growcount=0;
     for i=1:M %让种子去融合图片中满足的所有点
        for j=1:N
            if grow1(i,j)==1 %点在"栈"内,即一开始先检测到种子点,然后根据判断条件去判断种子点邻域的点是否满足条件,若满足为1,然后进行下一轮循环进行判断,直到循环时没有点可以满足添加进行融合了
                if (i-1)>1&(i+1)<M&(j-1)>1&(j+1)<N %确保可以将8邻域完全放置
                    for u=-1:1 %8邻域生长
                        for v=-1:1
                            if (grow1(i+u,j+v)==0&abs(I(i+u,j+v)-seed)<=threshold)%只有在点为0的时候才进行,否则gowtcount会计算错误
                                grow1(i+u,j+v)=1;%种子合并其他点,只要满足条件的点都会和种子点一样置1
                                growcount=growcount+1;  %记录此次新生长的点个数
                            end
                        end
                    end
                end
            end
        end
    end
end

subplot(1,2,1),imshow(I);
title("original image")
subplot(1,2,2),imshow(grow1);
title("growed image")

可以参考基于matlab的区域生长算法实现_minisal的博客-CSDN博客_matlab区域生长代码,内容都在里面注释了,只要把区域生长的步骤弄明白,代码自然就会看懂;

2.分水岭分割法:

分水岭转换法一般包括以下几个步骤:

1.读取灰度图

2.设置前景标记(通过重建开和重建闭来清理图像),腐蚀+重建开

3.膨胀+重建闭

4.形态学重建+图像取反

5.求局部最大值+将灰度图和局部最大值进行结合

6.对局部最大值消除周边杂乱的点(先闭操作,再腐蚀)

7.将修改后的局部最大值与灰度图结合

8.计算背景标记,用清理完的图像(即经过重建开与重建闭的图像)进行二值化

9.但理想情况下,我们不希望背景标记离我们要分割的对象的边缘太近,所以我们可以通过计算bw距离变换的分水岭变换,然后寻找结果的分水岭脊线来完成

10.用imimposemin函数修改梯度幅度图像,让区域最小值显示在前景和背景标记的像素上;

11.对修改的梯度幅度图像进行分水岭分割(分割物体的边界)

12.最后进行可视化的显示,可以将原灰度图与前景标记、背景标记、分割物体的结合到一个图片上,前景和背景标记缩放到不同的整数值,以便为它们分配不同的标签。

举例:

clc
clear all
I=rgb2gray(imread('apple.jpg'));
tidu=imgradient(I);
% figure;
% imshow(tidu,[]);
se=strel('disk',20);
fs=imerode(I,se);
fscj=imreconstruct(fs,I);
pz=imdilate(fscj,se);
pzcj=imcomplement(imreconstruct(imcomplement(pz),imcomplement(fscj)));
figure;
imshow(pzcj);
dgm=imregionalmax(pzcj);
figure;
imshow(dgm);
I2=labeloverlay(I,dgm);
figure;
imshow(I2);
se2 = strel(ones(5,5));
fgm2 = imclose(dgm,se2);
fgm3 = imerode(dgm,se2);
figure;
imshow(fgm3);
fgm4=bwareaopen(fgm3,15);
%I3=labeloverlay(I,fgm4);
I(fgm4)=255;
figure
imshow(I);
bw1=imbinarize(pzcj);
D = bwdist(bw1);
DL = watershed(D);
bgm = DL == 0;
figure;
imshow(bgm);
gmag2 = imimposemin(tidu, bgm|fgm4);
L=watershed(gmag2);
labels = imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4;
I4 = labeloverlay(I,labels);
figure;
imshow(I4);

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

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

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

相关文章

  • C++11常用的一部分新特性

    C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自 定义的类型,使用初始化列表时,可添加等号(=),也可不添加。 也就是说这里用花括号进行初始化调用的是类的构造。 也就是说,C++11几乎可以一切都可以用花括号初始化,包括变

    2024年02月06日
    浏览(41)
  • git 如何提交一个文件的一部分内容

    场景: 我正在开发代码开发了一半,现在突然要提交代码,但是需要提交的代码和我正在开发的代码 在一个文件中,我该如何提交 命令: git add -p (p是patch缩写) 第一步 :输入命令之后会呈现代码修改的部分 绿色的注释就是新增加内容 第二步: 按回车键查看命令解释 这

    2024年02月11日
    浏览(42)
  • jenkins汉化一部分问题(一半中文一半英文)解决

    安装中文插件“Locale plugin”和“Localization: Chinese (Simplified)后,先设置为zh_US重新启动,再设置回来 其他插件重启Jenkins后,又出现了部分中文简体不翻译的情况。 方法如下,可以临时完美修复。 1. 将语言设定为zh_US,Jenkins切换为英文。 2. 调用restart重启Jenkins:http://jenkisn网址

    2024年02月11日
    浏览(61)
  • Echarts使用中遇到图表只显示一部分的情况

            在引用完Echarts后,发现图只显示了一小部分,检查布局也没有任何问题,然后通过控制台 检查,无论怎么去调它所在容器的宽高都没有任何的变化,调canves的宽高也只有拉伸的效果。          出现这种现象的原因是:Echarts的依赖是惰性的,需要手动设置r

    2024年02月11日
    浏览(39)
  • 第三十一部分:大模型在搜索引擎领域

    在过去的几年里,搜索引擎技术发展迅速,从简单的查询到智能的语义搜索和知识图谱。随着大模型在自然语言处理(NLP)和计算机视觉等领域的成功应用,搜索引擎也开始逐渐引入大模型技术,以提高搜索质量和用户体验。本文将从大模型在搜索引擎领域的背景、核心

    2024年02月20日
    浏览(47)
  • Git合并固定分支的某一部分至当前分支

    在 Git 中,通常使用 git merge 命令来将一个分支的更改合并到另一个分支。如果你只想合并某个分支的一部分代码,可以使用以下两种方法: 首先,从要合并的源分支(即要提取代码的分支)中创建并切换到一个新的临时分支。这样可以在该分支上进行修改,以便选择性地合

    2024年02月21日
    浏览(57)
  • [云原生] 二进制安装K8S一部分

    目前Kubernetes最新版本是v1.25,但大部分公司一般不会使用最新版本。 目前公司使用比较多的:老版本是v1.15,因为v1.16改变了很多API接口版本,国内目前使用比较多的是v1.18、v1.20。  组件部署: mater节点 mater01 192.168.136.100 kube-apiserver kube-controller-manager kube-scheduler etcd        

    2024年02月22日
    浏览(37)
  • RV1126与RV1109 AI系统设计概要(一部分)

            四核核 Cortex-A7,ARM架构V7-A指令,独立Neon SIMD(一种高级单指令多数据扩展指令集,可执行并行数据处理),与独立FPU(浮点计算)。 (RV1109双核A7)         每核有32KB L1 I-Cache(一级指令高速缓存),32KB L1 D-Cache(一级数据高速缓存)         512KB L2 Cache(二极

    2024年02月07日
    浏览(44)
  • AD18批量修改一部分或者全部器件位号的方法!

           现在任何一个公司嵌入式硬件开发的主板全都是有很多sheet的,而硬件工程师做的往往也都是在老的图纸上进行修改或者再设计,也正因为如此,我们在画原理图的时候尽量不要去改动已有部分的位号,以免PCB工程师骂人! 就算自己画PCB的时候也会晕头转向!      

    2024年01月17日
    浏览(32)
  • 过去一周写过的算法题的一部分(dfs,贪心)

    (首先说明一点哈:这是我第一次写博客,写的不好大家见谅) 自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解,谢谢啦 (题目链接:P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)) 我一开始用

    2024年02月03日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包