在MATLAB中形成集群

时间:2012-12-11 08:49:31

标签: matlab image-processing

我正在研究切换双边滤波器。在此,他们已形成像素簇以检测图像中的边缘。他们使用了Sorted Quadrant Median Vector。

代码:

%群的形成

 if((((m1 < avg) && (m4 < avg))&&((m2 >= avg) && (m3 >= avg))) || (((m2 < avg) && (m3 < avg))&&((m1 >= avg) && (m4 >= avg))))
     p=i+2;
     q=j+2;
     vec=[L(p-2,q) L(p-1,q) L(p+1,q) L(p+2,q)]; % Vertical edge
     dav=double(sum(vec)/4);
     %disp('vertical edge');

 elseif((((m3 < avg) && (m4 < avg))&&((m1 >= avg) && (m2 >= avg))) || (((m1 < avg) && (m2 < avg))&&((m3 >= avg) && (m4 >= avg))))
     p=i+2;
     q=j+2;
     vec=[L(p,q-2) L(p,q-1) L(p,q+1) L(p,q+2)]; % Horizontal edge
     dav=double(sum(vec)/4);
     %disp('horizontal edge');

 elseif((((m1 < avg) && (m3 < avg))&&((m2 >= avg) && (m4 >= avg))) || (((m2 < avg) && (m4 < avg))&&((m1 >= avg) && (m3 >= avg))))
     p=i+2;
     q=j+2;
     vec=[L(p-1,q+1) L(p-1,q-1) L(p+1,q-1) L(p+1,q+1)]; % Diagonal line
     dav=double(sum(vec)/4);
     %disp('diagonal line');

 end

m1,m2,m3和m4是中位数。这样做是否正确?

请解释一下,并向我推荐一本与MATLAB中的图像处理相关的书籍/指南

1 个答案:

答案 0 :(得分:0)

我在这里假设,m1,m2,m3,m4取自你之前的一个问题,意思是 它们是5x5窗口的3x3子窗口的中位数。

也就是说,它们形成如下矩阵:

m1 m2
m4 m3

或在某些类似的配置中。

也就是说,第一个“if”分支意味着:如果m1和m4中位数都小于平均值且m2和m3更大(或者完全相反),那里应该是在特定的5x5子窗口中从左到右的急剧变化。 (请记住,中位数滤除任何单个峰值,这意味着即使图像有噪声也不会检测到太多的假边缘。)至于vec,

vec=[L(p-2,q) L(p-1,q) L(p+1,q) L(p+2,q)]; % Vertical edge

只存储搜索窗口的垂直中间点。我不认为它会以这种形式起作用,我认为存储边缘索引会更有意义:

vec=[[i:i+4]', repmat(j+2, 5, 1)]; 

它将是五个边缘点的坐标,其中假设边缘在当前搜索窗口的中间从上到下。 (您也可以手动检查。)

“else if”的工作方式相似。

至于图像处理的起点,我可以推荐一本名为“学习OpenCV”的书,由Gary Bradski和Adrian Kaehler编写,虽然这不是一本Matlab书。如果你没有阅读本书中的C ++程序和关于OpenCV的详细描述,你仍然可以获得关于图像处理的一个很好的综合知识 - 或者至少你会熟悉主要概念。

至于Matlab的细节,我建议您阅读有关图像处理工具箱的整个帮助。好像听起来一样,我认为只有很难学习图像处理。