Matlab(2):图像分割笔记

写在开头

这是博主的图像作业之一
本着熟悉知识+经验分享的精神而作,如果有任何疑问可以联系博主,相互学习。
文章材料部分(图像)来自互联网,如有侵权请联系博主删除!
WX公众号:小杂货铺9527,给你更多惊喜!

图像分割

总体目的

按照一定规律将图像或景物划分为多个子集
定位目标在图中的位置和范围

基本策略

本文主要介绍基于灰度的分割方法,依据不同区域灰度值的不连续性进行分割,其实就可以二分类或多分类方法进行处理了。

主要算法

基于阈值的分割方法
基于边缘的分割方法
基于区域的分割方法
基于数学形态学的分割方法
基于特定理论的分割方法
(聚类分析、小波变换、模糊集理论、基因编码)

阈值方法—直方图法

基本思想

通过建立图像的灰度直方图,选择两峰之间的谷底对应的灰度值作为阈值,可以处理背景颜色单一的图片,对复杂图片无能为力。
也就是这样
在这里插入图片描述

数学表达式

g ( x , y ) = { 255 , f ( x , y ) ≥ T 0 , f ( x , y ) < T g(x,y)=\begin{cases} 255,\quad f(x,y)\ge T \\ 0,\qquad f(x,y)\lt T \end{cases} g(x,y)={ 255,f(x,y)T0,f(x,y)<T

实验用图

在这里插入图片描述

Matlab代码

clc;
clear;

data1 = imread('cs0001.jpg');  %记得用自己的图片名
data = data1;
gdata1 = (0.299*data1(:,:,1)+0.587*data1(:,:,2)+0.114*data1(:,:,3));
gdata = gdata1;
[width,height ] = size(gdata1);

elements = zeros(1,255);
for i = 1:width
    for j = 1:height
        elements(1,round(gdata1(i,j))+1) = elements(1,round(gdata1(i,j))+1) + 1;
    end
end
x = 1:255;
y = elements;
plot
Matlab写的区域生长图像分割程序。 %区域生长:region function LabelImage=region(image,seed,Threshold,maxv) %image:输入图像 %seed:种子点坐标堆栈 %threshold:用邻域近似生长规则的阈值 %maxv:所有生长的像素的范围小于maxv % LabelImage:输出的标记图像,其中每个像素所述区域标记为rn [seedNum,tem]=size(seed);%seedNum为种子个数 [Width,Height]=size(image); LabelImage=zeros(Width,Height); rn=0;%区域标记号码 for i=1:seedNum %从没有被标记的种子点开始进行生长 if LabelImage(seed(i,1),seed(i,2))==0 rn=rn+1;% %对当前生长区域赋标号值 LabelImage(seed(i,1),seed(i,2))=rn; % end stack(1,1)=seed(i,1);%将种子点压入堆栈(堆栈用来在生长过程中的数据坐标) stack(1,2)=seed(i,2); Start=1;%定义堆栈起点和终点 End=1; while(Start<=End) %当前种子点坐标 CurrX=stack(Start,1); CurrY=stack(Start,2); %对当前点的8邻域进行遍历 for m=-1:1 for n=-1:1 % %判断像素(CurrX,CurrY)是否在图像内部 % rule1=(CurrX+m)=1&(CurrY+n)=1; % %判断像素(CurrX,CurrY)是否已经处理过 % rule2=LabelImage(CurrX+m,CurrY+n)==0; % %判断生长条件是否满足 % rule3=abs(double(image(CurrX,CurrY))-double(image(CurrX+m,CurrY+n)))<Threshold; % %条件组合 % rules=rule1&rule2&rule3; if (CurrX+m)=1&(CurrY+n)=1&LabelImage(CurrX+m,CurrY+n)==0&abs(double(image(CurrX,CurrY))-double(image(CurrX+m,CurrY+n)))<=Threshold&image(CurrX+m,CurrY+n)0 %堆栈的尾部指针后移一位 End=End+1; %像素(CurrX+m,CurrY+n)压入堆栈 stack(End,1)=CurrX+m; stack(End,2)=CurrY+n; %把像素(CurrX,CurrY)设置成逻辑1 LabelImage(CurrX+m,CurrY+n)=rn; end end end %堆栈的尾部指针后移一位 Start=Start+1; end end end
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值