improfile的写等效

时间:2011-02-02 12:09:26

标签: matlab

在MATLAB的Image Processing Toolbox中,improfile函数返回由两点定义的线下面的图像强度分布。

是否有等效于此功能?也就是说,我想传递两个点(指定一条线)和一个像素值向量来替换线下面的一堆像素。

3 个答案:

答案 0 :(得分:2)

我知道这样做的一种丑陋方式。这是如何:

使用imline创建由您组成的ROI。 (首先使用imshow。)

imshow(I,[])
H = imline(gca,[x1 y1; x2 y2]);

从内联

创建二进制ROI
BW = createMask(H);

找出ROI的坐标

p = find(BW==1);

沿着ROI指定的行将您的矢量插入图像I

I(p) = v;

为此,矢量v的长度和ROI的长度必须相同。这并不总是那么容易。要修复它,请插入v向量以获得正确的大小,即用此

替换最后一行
I(p) = interpft(v,length(p));

答案 1 :(得分:1)

您是否检查了improfile的源代码?它使用interp1后跟round来获取配置文件点的索引。

一个更简单(也可能不太好)的替代方案是对线使用简单的参数方程并获得沿线段的各个点:

imageData =zeros(50,50);
endPoints =[ 2 3; 40 27];

numberOfInterpolationPoints = 50;
t=linspace(0,1,numberOfInterpolationPoints);

% x and y of the points along this line
x = 2 + t*( 40-2);
y = 3 + t*(27-3);

% Round them to obtain valid indices
profPoints = [x;y]';
profPoints = round(profPoints);

% Keep only unique numbers
profPoints = unique(profPoints,'rows');

% Convert to liner indices
profPointsInd = sub2ind(size(imageData),profPoints(:,1), profPoints(:,2));

imageData(profPointsInd) = 1;

imagesc(imageData);

答案 2 :(得分:0)

我基本上完成了Ghaul建议的内容,但用手动查找底层像素替换了imline()。优点是没有显示数字带来一些速度优势(在我的测试中约为0.5秒);

dist_euc = norm(p1 - p2);
n_pix = round(dist_euc*2);
step = (p1 - p2)/n_pix;
pix_coords = zeros(n_pix, 2);
for cp = 0:n_pix
    pix_coords(cp+1, :) = round(p2 + cp*step);
end
pix_inds = sub2ind(size(im), pix_coords(:,2), pix_coords(:,1));
pix_inds = unique(pix_inds);
im(pix_inds) = interpft(prof, length(pix_inds));