24小时热门版块排行榜    

CyRhmU.jpeg
查看: 902  |  回复: 3
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

cjy0803

新虫 (初入文坛)

[求助] 求解kmeans图像分割程序中的一些问题已有2人参与

1 计算灰度直方图之前为什么要去除图像灰度值中的0值?
2 计算灰度直方图那一块代码没理解 h与hc这两个矩阵是什么作用
3 程序中的cc应该是一个值,为什么要写成cc(1)这种形式?
下面是部分代码
谢谢解答
CODE:
clc;
clear;

k=4;%定义聚类个数

% 读入图像
A=imread('C:\Documents and Settings\Administrator\桌面\wonder\2.jpg','jpg');
% 转为灰度图像
B=rgb2gray(A);
% 保存至22.jpg
imwrite(B,'C:\Documents and Settings\Administrator\桌面\wonder\22.jpg','jpg');

ima=double(B);    % 转为double类型
copy=ima;         % 保留副本
ima=ima(:);       % 向量化

mi=min(ima);      % 最小值为0
ima=ima-mi+1;     % 转换灰度范围 原[0,255] 现[1,256] 去除0值

s=length(ima);    % s=m*n



% 计算图像灰度直方图
m=max(ima)+1;    % m=257

h=zeros(1,m);    % h 1*257
hc=zeros(1,m);   % hc 1*257

for i=1:s        % 遍历向量
  if ima(i)>0
      h(ima(i))=h(ima(i))+1;
  end   
end
ind=find(h);     % 返回h中非零元素所在位置
hl=length(ind);  % 计算h中非零元素个数 hl=256

% 初始化质心
mu=(1:k)*m/(k+1);

% 开始
while(true)
  
  oldmu=mu;
  % 当前的分类
  for i=1:hl
      c=abs(ind(i)-mu);  % 计算每个值到中心的距离
      cc=find(c==min(c));% 找出距离最小的点
      hc(ind(i))=cc(1);     
  end
  
  %重新计算均值
  for i=1:k,
      a=find(hc==i);
      mu(i)=sum(a.*h(a))/sum(h(a));
  end
  
  if mu==oldmu
      break;
  end;
  
end

回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cjy0803

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by gorgan at 2014-06-09 14:07:45
1 计算灰度直方图之前为什么要去除图像灰度值中的0值?
答:本来灰度范围是0到255,但是要转化为1到256,才能建立一个长度为256的数组
因为matlab里数组不能是从0开始的,比如m是一个数组,m是非法的,m的第一个元 ...

谢谢
4楼2014-06-17 09:06:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 4 个回答

gorgan

木虫之王 (文学泰斗)

无意苦争春

【答案】应助回帖

感谢参与,应助指数 +1
1 计算灰度直方图之前为什么要去除图像灰度值中的0值?
答:本来灰度范围是0到255,但是要转化为1到256,才能建立一个长度为256的数组
因为matlab里数组不能是从0开始的,比如m是一个数组,m[0]是非法的,m的第一个元素是m[1]
3 程序中的cc应该是一个值,为什么要写成cc(1)这种形式?
答:等于最小值的可能不是一个元素,比如最小值为1,等于1的可能有好几个,cc(1)就是从相等的里面取出一个
无我相,无人相,无众生相,无寿者相
2楼2014-06-09 14:07:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

仙木映月

金虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
cjy0803: 金币+7, ★★★很有帮助 2014-06-17 09:06:02
问题1:
这步的主要目的并不是为了要去掉灰度为0的值,而是要确定图像中灰度值的范围。比如一个图像的灰度只有:12,13,14,15.则得到的s=4,ima为:1,2,3,4. 这省去了不必要的循环运算。
问题2:
h是为了统计处于灰度值区间ima内的各个灰度值上像素点的个数,用这个做均一化就可以求出灰度的直方图了。
hc是为了给离Kmeans的k个中心最近的点做标记,这样就可以利用这样的分类迭代更新中心值mu了。
问题3:
楼上说可能不止一个是从范围的角度讲的。其实这里的小循环的目的就是要找到当前点距离哪个分累中心最近,并用这个分类重心的标号为这个点做标记。cc中的第一个元素就是那个距离某中心最近的该中心的标号,所以用来更新hc。
Hardtosay.
3楼2014-06-10 09:14:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见