在MATLAB的Image Processing Toolbox中,improfile
函数返回由两点定义的线下面的图像强度分布。
是否有写等效于此功能?也就是说,我想传递两个点(指定一条线)和一个像素值向量来替换线下面的一堆像素。
答案 0 :(得分:2)
我知道这样做的一种丑陋方式。这是如何:
使用imline创建由您组成的ROI。 (首先使用imshow。)
imshow(I,[])
H = imline(gca,[x1 y1; x2 y2]);
从内联
创建二进制ROIBW = 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));