使用 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
好的,这是计算机图形学 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