0

我正在研究一个切换双边滤波器。在这种情况下,它们形成了像素簇来检测图像中的边缘。他们使用了排序象限中值向量。

代码:

% 簇的形成

 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 中的图像处理相关的书/指南

4

1 回答 1

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”的工作原理类似。

至于图像处理的起点,我可以向您推荐 Gary Bradski 和 Adrian Kaehler 所著的《Learning OpenCV》一书,尽管那不是一本 Matlab 书。如果你没有阅读本书中的 C++ 程序和关于 OpenCV 的详细描述,你仍然会获得相当不错的关于图像处理的一般性综合知识——或者至少你会熟悉主要概念。

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

于 2012-12-11T21:09:20.060 回答