使用 Matlab 实现边界填充算法

Implement Boudary Filling algorithm Using Matlab

好的,这是计算机图形学 problem.I我正在学习计算机图形学,不擅长 Matlab either.When 我正在尝试实现边界填充算法,但我发现它不起作用。有伪代码:

void BoundaryFill(int x, int y, COLORREF boundaryValue, COLORREF newValue)
{
     if(GetPixel(x,y) != boundaryValue&&
      GetPixel(x,y) != newValue)// if pixel not already filled and not reach to the 
      boundary then
     {
          SetPixel(x,y,newValue);//fill the pixel
          BoudaryFill(x,y-1,boudaryValue,newValue);
          BoudaryFill(x,y+1,boudaryValue,newValue);
          BoudaryFill(x-1,y,boudaryValue,newValue);
          BoudaryFill(x+1,y,boudaryValue,newValue);
     }
}

好的,我用matlab写的时候understand.but不难,就是出错了。 首先,我定义了一个 'img' : img = ones(600,800,3);可以理解为一个canvas但实际上它是一个矩阵,第三个参数可以是RGB的矩阵,像这样: img(x,y,[0,0,0]/255); 无论如何,我可以使用 imshow(img) 将 canvas 显示为图形,并且可以更改每个像素的颜色。我可以画一个封闭的图形并填充它。 我们看一下matlab代码:

%This is the script
clc;
img = ones(600,800,3);
img = DDA_line(img,3,3,3,50,[0,0,0]/255);
img = DDA_line(img,30,3,30,50,[0,0,0]/255);
img = DDA_line(img,3,3,30,3,[0,0,0]/255);
img = DDA_line(img,3,50,30,50,[0,0,0]/255);
img = Boundaryfill(img,15,26,[0,0,0]/255,[255,0,0]/255);
imshow(img)

% This is DDA_line
function img = DDA_line(img, x1, y1, x2, y2, color)
e = max(abs(x2-x1), abs(y2-y1));
dx = (x2-x1)/e;
dy = (y2-y1)/e;
img(x1,y1,:)=color;
for i = 0:e
    x1 = x1 + dx;
    y1 = y1 + dy;
    img(round(x1),round(y1),:)=color;
end


%This is the Boudaryfill function
function img = Boundaryfill(img, x, y, boundaryvalue, new)
if  img(x,y,:) ~= boundaryvalue && img(x,y,:) ~= new 
    img(x,y,:) = new;
    img=Boundaryfill(img,x,y-1,boundaryvalue, new);
    img=Boundaryfill(img,x,y+1,boundaryvalue, new);
    img=Boundaryfill(img,x-1,y,boundaryvalue, new);
    img=Boundaryfill(img,x+1,y,boundaryvalue, new);
end
end

它并不复杂,但是当我尝试 运行 这个时,它 post 出错了。有资料:

| | the operands and && operator must be able to convert logical scalar value.

这似乎是语法错误,但我不知道如何改正。这可以是第一个问题。 我尝试使用嵌套结构来表示相同的逻辑,但封闭的图形没有填充。可惜不能插入图片。 但是当我这样写句子的时候

if  img(x,y,:) ~= boundaryvalue

虽然它不完整,但它填充了一个 rectangular.but 当我使用这个不完整的函数填充三角形时它失败并出现错误。 有资料:

Insufficient memory. The possible reason is that there is infinite recursion in the program.

解决这个问题一整天都没有成功,希望大家多多指教。谢谢!

注意要比较的矩阵的维度和方向。

这应该有帮助:

function img = Boundaryfill(img, x, y, boundaryvalue, new)
    temp = squeeze(img(x,y,:))';
        if  temp ~= boundaryvalue & (temp ~= new)
        img(x,y,:) = new;
        img=Boundaryfill(img,x,y-1,boundaryvalue, new);
        img=Boundaryfill(img,x,y+1,boundaryvalue, new);
        img=Boundaryfill(img,x-1,y,boundaryvalue, new);
        img=Boundaryfill(img,x+1,y,boundaryvalue, new);
    end
end