2012-08-29 123 views
0

我正在一个项目中,我想要提取给定图像的轮廓。 我有两个图像;前景图像和背景图像。我在这些图像上应用减法,并在差异不等于零时输入一个条件。然后我输出这个坐标值。这里是我当前的代码:print在matlab中的图像的选定像素的x,y坐标

I=imread('starObject.jpg') 

B=rgb2gray(I); 
imshow(I); 

A=imread('starB.jpg'); 
C=rgb2gray(A); 
[columns rows]=size(C) 
Diff(i,j)=B(i,j)-C(i,j); 
if (Diff(i,j)>0||Diff(i,j)<0) 
    fprintf('1st difference'); 
    disp(Diff(i,j)); 
end 
end 
end 
imshow(Diff); 

上面的代码打印像素差值。我想要坐标。我怎样才能做到这一点?

+0

漂亮许多'end'的... :-) – Mehrwolf

回答

2

在上面的代码中,ij已经是像素坐标。对于印刷,你可以使用类似的东西

[rows, columns] = size(C); %# rows are first!! 
for i = 1 : rows 
    for j = 1 : columns 
     if (Diff(i,j) ~= 0) 
      sprintf('(%d, %d)', i, j); 
     end 
    end 
end 

例如。

另一种方法是使用find()功能,这可能是这样的

[r, c] = find(Diff ~= 0); 
for idx = 1 : length(r) 
    sprintf('(%d, %d)', r(idx), c(idx)); 
end 

顺便说一句:这是一个非常,非常坏主意使用ij作为变量因为你通常用它来定义复数。不要惊讶,如果

x = 10 + 20*j 

在您的循环后不再工作。

+0

感谢名单,但因为我需要做的是自动 – marry

+0

@marry我不能使用鼠标功能:好吧,我适应我的答案。 – Mehrwolf

+0

:非常感谢:) – marry

1

向量化您的代码。不要使用for循环遍历坐标,它很慢,很丑,而不是如何编写语言。看看下面是否适合你。

A = rgb2gray (imread ('starObject.jpg')); 
B = rgb2gray (imread ('starB.jpg')); 
Diff = B - C; 
inds = find (Diff); 
sprintf ("Different at indexes: %i\n", inds); 

如果你要打印标而不是衬垫索引,使用ind2sub一个转换到另一个或两个输出参数找到。例如:

[iRows, iCols] = find (Diff); 
printf ("Different at coordinates (%i, %i)\n", [iRows'; iCols']); 
相关问题