为什么img(te1,te2)的大小比输入图像大?

时间:2016-01-06 09:05:33

标签: matlab

假设edge是图像边缘检测功能的输出。我需要您的帮助才能理解原因 - 当我使用size(...)检查img(te1, te2)的尺寸时,我获得的尺寸大于输入图像(1467 1467)的尺寸(128 128)。当我(128 128

时,我可以做些什么来达到相同大小的size(img(te1, te2))}

情况如下:

img = imread('LENNA128.bmp');  %% input image 
edgemap = double(255-edge);    
[te1,te2] = find(edgemap==255);
img(te1,te2)= 125;

imshow(uint8(img(te1,te2)))
imshow(uint8(edgemap))
size(img(te1,te2))
size(edgemap)

非常感谢您的回复。

1 个答案:

答案 0 :(得分:2)

yyyy-MM-dd'T'HH:mm:ss.SSSZZ函数返回两个对应于列和行的向量findte1。让我们看一个小例子:

te2

将返回

x = [ 1, 2, 3 ;
      3, 1, 2 ;
      2, 3, 1 ]

[row,col] = find(x==3)

即。在row = [2; 3; 1]; col = [1; 2; 3]; (2,1)(3,2)有三个,这确实是正确的。您要做的下一步是索引,返回

(1,3)

这绝对不是你想要的。原因是,MATLAB将其解释为:"取第2行,然后是第1行,然后是第3行,并且对于每一行:取col 1,然后是col 2,然后是col 3。"这就是它的回报:

x(row,col)
ans =
     3     1     2
     2     3     1
     1     2     3

要获得您需要的确切元素,您可以例如使用sub2ind函数创建指定ans = second row of x first row of x third row of x 对的linear index

(row,column)

因此x(sub2ind(size(x),row,col)) = 4 x = 1 2 4 4 1 2 2 4 1 的所有出现都被3取代。

<小时/> 更简单,更快捷的替代方法是直接将4与3与x进行比较。这将返回一个逻辑数组,其中x==3处于1,其中x为3:

x==3
ans =
     0     0     1
     1     0     0
     0     1     0

您可以使用它来索引x

x(x==3) = 4
x =
     1     2     4
     4     1     2
     2     4     1

您可以这样做:将edgemap与255进行比较,然后使用它来索引图像:

img(edgemap==255) = 125;