如何在蓝色像素中找到所有蓝色像素和两个边界的位置?

时间:2015-01-27 11:16:42

标签: matlab indexing find

我想在每列中找到第一个和最后一个蓝色像素,然后找到之前实现的这一行内的另一个边界(第一个和最后一个蓝色像素行)。

我根据之前的回复者进行了更改,但现在我在尝试查找bif_first和last时遇到此错误:订阅的分配维度不匹配。 bif_first2(2,Z)= FIND(DX(:,Z)== 1,2, '第一');

有什么问题?请参阅下面的代码:

 rgbImage_blue=zeros(size(movingRegistered));

  lumen_first=zeros(1,size(movingRegistered,2)); lumen_last=zeros(1,size(movingRegistered,2)); bif_first=zeros(1,size(movingRegistered,2)); bif_last=zeros(1,size(movingRegistered,2)); bif_last2=zeros(2,size(movingRegistered,2)); bif_first2=zeros(2,size(movingRegistered,2));

    blue=cat(3,0,0,255); 
ix=all(bsxfun(@eq,movingRegistered,blue),3);% find all the blue pixels, and put them at 1 % logical array of where blue pixels are dx=[zeros(1,size(movingRegistered,2));diff(ix)]; % zeros to make the same number of columns and rows % the difference by row for all columns
 nTops=sum(dx==1); % the transitions to blue
 nBots=sum(dx==-1); % and from blue... % see if are consistent; if not, something's not right in image
 if(nTops~=nBots), error('Mismatch in Top/Bottom'),end

 for z=1:1:size(movingRegistered,2);
    if  nTops(1,z)==2; bifurcation=false;lumen=true; %only existis two boundaries no bifurcation
    lumen_first(1,z)=find(ix(:,z)==1,1,'first');
    lumen_last(1,z)=find(ix(:,z)==1,1,'last');
    end
    if nTops(1,z)>2;
    bifurcation=true;
    lumen_first(1,z)=find(ix(:,z)==1,1,'first');
    lumen_last(1,z)=find(ix(:,z)==1,1,'last');
    bif_first2(2,z)=find(dx(:,z)==1,2,'first');
    bif_first(1,z)=bif_first2(2,z);
    bif_last2(2,z)=find(dx(:,z)==1,2,'last');
    bif_last(1,z)=bif_last2(2,z);
    end
 end

enter image description here

1 个答案:

答案 0 :(得分:1)

您的问题是您正在将n * m * 3图像与3 * 1矢量进行比较。此操作未定义。

使用此代码:

blue=cat(3,0,0,250)
ix=all(bsxfun(@eq,movingRegistered,blue),3)

Matlab中的图像使用第三维颜色,这就是我创建blue为1 * 1 * 3向量的原因。现在将此向量与图像进行比较,使用bsxfun扩展矢量以匹配图像大小。此操作单独比较每个颜色通道,因此all用于收集所有三个通道的数据。