meanshift怎么做灰度图像的分割

meanshift怎么做灰度图像的分割,第1张

a=imread(\\'YuChu.bmp\\')如果读入的是彩色图,需要用a=rgb2gray(a)转换为灰度图 加了这句我运行了下,程序没出现错误也能出图 另外matlab图像处理工具箱中用level = graythresh(I)函数去阈值,其方法与你的方法一致,都是Otsu方法补充:你看看a读入时数据的大小,要是3维的话就是RGB图像了,需要转一下另外是程序错误还是结果不对?

你好,这是我以前下载的一段代码,需要在matlab环境下运行。希望对你有所帮助,代码如下:(代码是作者pineapple写的,引用的时候记得说明一下。)

function [MS_reg,pUnRegion,region_index_sum,region_index_n] = meanshiftseg(A,nThreshold)

%*-------------------------------------------------------------------------

%* 作者 :pineapple 时间 :2007.5.23

%* 联系方式 :QQ (94031570) Email([email protected])

%*-------------------------------------------------------------------------

%* 函数说明:[MS_reg,pUnRegion] =meanshiftseg(A,nThreshold)

%* 输入参数:

%* A: 经meanshift平滑过后的灰度图象

%* 输出参数:

%* MS_reg: 分割后的图像,被分割成连续的区域部分的像素值是其区域内的均值

%* pUnRegion: 分割后的图像的标志图像,不同区域用不同的编号表示

%

A = double(A)

[m,n] = size(A)

MS_reg = zeros(m,n)

nDx = [-1 0 1 0]

nDy = [0 1 0 -1]

pUnRegion = zeros(m,n)% 用来标志当前像素点有没有被处理

region_index = 0 % 记录按当前规则进行分割后,得到的总的类别数

region_index_n = zeros(1,m*n)%记录每个类别中的像素点的个数

region_index_sum = zeros(1,m*n)% 记录每个类别中的像素点的值的和

pnGrowQueX = zeros(1,m*n)

pnGrowQueY = zeros(1,m*n)% 定义堆栈

for i=1:m

for j=1:n

if(pUnRegion(i,j)==0) %如果当前点没有被处理

region_index = region_index + 1

pUnRegion(i,j) = region_index

% 对应该区域的点数加1

region_index_n(region_index)=region_index_n(region_index)+1

region_index_sum(region_index)=region_index_sum(region_index) +A(i,j)% 更新该类别的和

nStart = 1

nEnd = 1

% 设置种子点为当前点

pnGrowQueX(nEnd) = i

pnGrowQueY(nEnd) = j

while nStart<=nEnd

% 当前种子点的坐标

nCurrX = pnGrowQueX(nStart)

nCurrY = pnGrowQueY(nStart)

% 对当前点的4邻域进行遍历

for k=1:4

xx = nCurrX + nDx(k)

yy = nCurrY + nDy(k)

% pUnRegion[yy*nWidth+xx]==0 表示还没有处理

% 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY)

% 象素值差的绝对值

if((yy<=n)&(yy>=1)&(xx<=m)&(xx>=1)...

&(pUnRegion(xx,yy)==0)...

&abs(A(xx,yy)-A(nCurrX,nCurrY))<nThreshold)

nEnd=nEnd + 1% 堆栈的尾部指针后移一位

% 象素(xx,yy) 压入栈

pnGrowQueX(nEnd) = xx

pnGrowQueY(nEnd) = yy

% 把象素(xx,yy)设置成region_index

% 同时也表明该象素处理过

pUnRegion(xx,yy) = region_index

% 对应该区域的点数加1

region_index_n(region_index)=region_index_n(region_index)+1

% 更新该类别的和

region_index_sum(region_index)=region_index_sum(region_index) +A(xx,yy)

end

end

nStart=nStart+1

end %

end

end

end

for i=1:m

for j = 1 :n

temp = pUnRegion(i,j)

MS_reg(i,j) = round(region_index_sum(temp)/region_index_n(temp))

end

end

MS_reg = uint8(MS_reg)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12204064.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存