用MATLAB进行图像处理

图像处理概念、算法和MATLAB

Upslope区域 - 形成和解决流动矩阵

大约12年前,我在实现一个算法roifill在图像处理工具箱中。在此算法中,将替换(或填充)指定的像素集,以便每个被替换的像素等于其北、东、南和西邻居的平均值。我执行了一个迭代算法,虽然有效,但速度很慢。当我问MATLAB的创造者和公司的联合创始人克斯如果他知道更好的方法,他会立即回答:“在我看来,它是一个稀疏线性系统。为什么不用反斜杠呢?”

头一巴掌!当然可以。

现在,我再次看到一个非常相似的方程组,并再次考虑使用稀疏反斜杠。

在Tarboton论文中,上坡面积的计算是递归的。也就是说,一个像素的上斜面积等于1加上它相邻像素上斜面积的一些分数。(具体分数是相邻流体流向的函数。)这是一个线性方程组。让我们看看如何在MATLAB中建立和求解这个系统。

我们将从创建一个测试“DEM”开始。我喜欢用

E =山峰;imshow (E, [],“InitialMagnification”“健康”

接下来,使用该功能计算像素流量方向dem_flow.从我的上斜坡面积对MATLAB中央文件交换的贡献

r = dem_flow(峰值);

我们的稀疏系统的每一行和每一列将对应一个单独的像素。这样可以方便地制作一个与E大小相同的矩阵,对E的各个像素进行“数字”或标记。这些标记将被用作稀疏矩阵的行和列坐标。

PIXEL_LABELS = 1:NUMER(e);Pixel_Labels = REPAPE(PIXEL_LABELS,大小(e));Pixel_Labels(1:4,1:6)
ANS = 1 50 99 148 197 246 2 51 100 149 198 247 3 52 101 150 199 248 4 53 102 151 200 249 249

让我们考虑北邻邻居。这是北邻邻居的像素集:

Pixels_with_north_neighbors = Pixel_Labels(2:结束,:);

这是相应的北面邻居:

North_neighbors = pixel_labels(1:end-1,:);

从一个像素的北面邻居到它自身的角度是-pi/2:

inward_angle = -pi / 2;

一个像素的北邻有一个指向特定方向的流。这个方向包含在R.如果流动方向与向内角度相同,则来自该邻居的流量的分数是1.0。如果流动方向指向远离向内角度的PI / 4弧度的大于PI / 4弧度,则该邻居的流量的分数是0.0。对于角差的差异,级分从1.0到0.0线性变化。

我已经写了简单的功能来计算角度差异和相应的权重。角度差计算如下所示:

D = mod(1 - 2 +, 2*) -;

方向权重计算如下所示:

w = max(1  -  abs(d)* 4 / pi,0);

通过这些功能,我们可以一次计算北邻邻居权重:

w = directional_weight(Angular_difference(r(north_neighbors),...inward_angle));

忽略其他邻居,上升区域方程如下所示:

ap = 1 + wan

其中AP是像素的上升区域,是北邻邻居的上升区域,并且W是基于北邻邻居的流动方向的方向权重。通过这种方式重写方式,看看如何构建线性方程矩阵:

AP  -  WAN = 1

因此,我们的矩阵的每一行将在对角线上有一个1,并且它将具有每个邻居的定向流量的负面。如果我们只使用上面计算的北部重量,我们可以以这种方式构建稀疏矩阵:

i = pixels_with_north_neighbors(:);j = north_neighbors(:);w = w(:);%添加对角线术语II = [我;Pixel_Labels(:)];JJ = [J;Pixel_Labels(:)];ww = [w;(Numel(PIXEL_LABELS),1)];,并利用稀疏调用构造线性系统矩阵T =稀疏(ii, jj, ww);间谍(T)

我们必须放大以清楚地看到非对角线项:

XLIM([020])ylim([020])

我要打电话T流动矩阵.完成计算T,我们必须对其他七个相邻方向重复上面的一些步骤,在这里重复太乏味了。我就用flow_matrix.函数在我MATLAB中央文件交换提交

T = flow_matrix(E, R);

现在我们可以通过求解矩阵方程来计算每个像素的上斜面积:

Ta = B.

其中T是我们刚刚形成的稀疏矩阵,a是每个像素的上斜面积的向量,b是1的向量。

a = t \ \(numel(e),1);a =重塑(a,尺寸(e));imshow(a,[],“InitialMagnification”“健康”

我发现使用log(a)工作很好,以便可视化上升载波区域矩阵:

imshow(日志(A)、[]“InitialMagnification”“健康”

更明亮的值具有最高的上升区域。

在本系列的下一篇文章中,我将重新讨论处理停滞期的问题。




发布MATLAB®7.4

|
  • 打印
  • 发送电子邮件

注释

要留下评论,请点击这里登录到您的MathWorks帐户或创建一个新帐户。