我正在研究切换双边滤波器。在此,他们已形成像素簇以检测图像中的边缘。他们使用了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中的图像处理相关的书籍/指南
答案 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的细节,我建议您阅读有关图像处理工具箱的整个帮助。好像听起来一样,我认为只有很难学习图像处理。