meanshift 图像聚类
关于这个 meanshift,一来可以用来作为目标跟踪,二来可以用来进行图像聚类。我这里只
实现了图像聚类,当然,是按自己的理解编写的程序。至于目标跟踪将来一定也是要实现的,
因为我最初看这个算法的原因就是想用他来跟踪目标的。
meanshift 的基本原理我就不介绍了,比起我的介绍,网上有不少牛人们比我解释的好,
最后我会列出我参考的文章。我这里说一下我是怎么理解 meanshift 图像聚类的。这里的聚
类也像过去的滤波一样,需要一个模板矩阵,不过这个模板不是事先设置好的矩阵,而是在
当前处理的像素周围提取一个 r*r 的矩阵,然后把这个矩阵化为一维向量,再对这个向量进
行 meanshift,最终迭代到的值再赋值给当前处理的像素。所以可以这样理解,把图像经过
meanshift 迭代到相同值的像素聚为一类。
我这里使用的是灰度图像,至于彩色图像,我看到一篇博客上把 rgb 域转换到 luv 域上
再去做处理,这个我就不太清楚了,不过我看他的代码其中有一部分很像均值滤波。虽然我
没有和他用一样的方法,不过他的代码也可以参考一下。传送门在此。
下面是代码(这都是我自己的理解,不能保证都正确,不过至少可以为你的编码提供一
些思路):
main.m
clear all;
close all;
clc;
r=2; %滤波半径
img=imread('lena.jpg');
imshow(img);
img=double(img);
[m n]=size(img);
imgn=zeros(m+2*r+1,n+2*r+1);
imgn(r+1:m+r,r+1:n+r)=img;
imgn(1:r,r+1:n+r)=img(1:r,1:n);
imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r);
imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1);
imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r);
imshow(mat2gray(imgn))
for i=1+r:m+r
for j=1+r:n+r
ser=imgn(i-r:i+r,j-r:j+r);
ser=reshape(ser,[1 (2*r+1)^2]); %将二维模板变为一维
评论0