如果区域已经填满,请阻止修补

这对我的代码来说是一个相当艰巨的挑战。 首先,我放在这里的代码是不能运行的,因为我使用了一个Excel工作表(但是如果有人想要使用我的代码,我很乐意给你发邮件)。

我所拥有的是一张Excel数据表,其中包含我所取得的显微图像中的横截面纤维数据。 信息基本上是:部分的locationarea ,旋转angle

从这个angular度我计算了Phi和Gamma。 之后,我使用散射函数为每个Phiangular度值绘制不同颜色的点。 我在10度的范围内使用了一个不变的颜色。 这给了我一个像这样的图片:

在这里输入图像说明

现在我的目标是计算每个同质区域的面积。 所以我寻找一种方法来让我们说-10 + 10区域内的所有点(我现在正在做20度,但之后会做10点)。 我用了一下,我得到了这样的图片:

在这里输入图像说明

白色对应的点在我select的范围内。 之后,我使用MATLAB中的工具箱将每个点转换为一个像素。 所以我会得到一个白色像素负载的黑色背景,然后我使用imdilate做圆圈,填充洞,并用特定的颜色隔离每个区域。 最后我使用函数边界和补丁来创build每个边界并填充颜色。 我得到这样的图片:

在这里输入图像说明

这是我想要的,我可以得到每个地区的面积和总面积(我用一个门槛来放弃小面积)。 然后我为每个区域运行代码几次,然后使用imfuse将它们放回到一起,看看它是什么样的。

问题是,它们重叠了很多,这是因为我的数据有一些错误,所以一些蓝色的点会变成红色等等。 所以我想运行一次代码,然后当我用另一个范围重新运行它时,它会做同样的事情,但是在之前已经绘制了某些东西时没有考虑到这个值。

我试图这样做,运行一次后,保存matrixbw4,并添加一个条件,当绘制黑白图片,说如果披是在我的范围内,这里没有白色,那么你可以把白色,否则它是黑色的。 但似乎没有工作。

我知道这是一个相当复杂的事情来解释,但我会很感激任何想法,并通过电子邮件或其他方式开放聊天。 我现在把完整的代码,我可以发送给你我的Excel表,如果你想在你的计算机上运行,​​并为自己看。

 clearvars -except data colheaders bw4 close all clc %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% CHANGE DATA FOR EACH SAMPLE %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% cd 'C:\Users\dkarta\Desktop\Sample 12\12.6' data=xlsread('Sample12_6res.xlsx'); cd 'C:\Users\dkarta\Documents\MATLAB' %data=Sample121res; % Data name imax=length(data); % Numbers of rows in data sheet y=11900; % Number of pixels in the y on image j %% data(:,15)=data(:,9)*pi/180; % Convers Column 9 (angle of rotation) in rads data(:,16)=y-data(:,6); % Reset the Y coordinate axis to bottom left delta = 0 : 0.01 : 2*pi; % Angle in paramteric equations theta=45*pi/180; % Sample cutting angle in rads %AA=[data(:,5)' data(:,16)' phi'] % Define colors beta=acos(data(1:imax,8)./data(1:imax,7));%./acos(0); phi=atan(sin(beta).*cos(data(1:imax,15))./(sin(theta)*sin(beta).*sin(data(1:imax,15))+cos(theta)*cos(beta)))/(pi/2); phi2=phi/2+1/2; % Scales in plane angle phi between 0 and 1 gamma=atan((cos(theta)*sin(beta).*sin(data(1:imax,15))-sin(theta)*cos(beta))./... (sin(theta)*sin(beta).*sin(data(1:imax,15))+cos(theta)*cos(beta)))/(pi/2); gamma2=gamma+1/2; % Scales out of plane angle gamma between 0 and 1 %% %%%%%%%%%%%%%%%%%%%%%%%%%%% %%% MESHGRID AND COLOURMAP %%% %%%%%%%%%%%%%%%%%%%%%%%%%%% x1=data(1:imax,5); y1=data(1:imax,16); z1=phi*90; z2=gamma*90; n=300; %Create regular grid across data space [X,Y] = meshgrid(linspace(min(x1),max(x1),n), linspace(min(y1),max(y1),n)); % Creating a colormap with 10 degree constant colors map4=[0 0 1;0 1/3 1;0 2/3 1; 0 1 1;0 1 2/3;0 1 1/3;0 1 0;1/3 1 0;2/3 1 0;1 1 0;1 0.75 0;1 0.5 0;1 0.25 0;1 0 0;0.75 0 0.25;0.5 0 0.5;0.25 0 0.75; 0 0 1]; Colormap4=colormap(map4); h=colorbar; caxis([-90 90]) set(h, 'YTick', [-90:10:90]) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% PLOT USING SCATTER - ISOLATE SOME REGIONS %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% a=-10; % Lower boundary for angle interval b=10; % Upper boundary for angle interval c=z1>a & z1 < b; c=c.*1; %j=1; y1=(y1-min(y1)+1); y2=max(y1)-y1+1; [X1,Y1]=meshgrid(1:500,1:500); griddata(x1,y2,c,X1,Y1); clear c1 for i=1:imax if z1(i)< b && z1(i)> a %&& bw4(round(y1(i)),round(x1(i))) == 0 c(i) = 1; c1(round(y2(i)),round(x1(i)))=1; else c(i)= 0; c1(round(y2(i)),round(x1(i)))=0; end end C=[ccc]; %c(find(c==0)) = NaN; %contourf(X,Y,griddata(x1,y1,c,X,Y),100,'EdgeColor', 'None') figure(1), scatter(x1,y1,3,z1,'filled'); axis equal axis ([0 8000 0 12000]) axis off figure(2), scatter(x1,y1,3,C,'filled'); axis equal axis ([0 8000 0 12000]) axis off se=strel('disk',50,8); bw2=imdilate(c1,se); bw4=bwlabel(bw2); bw3=imfill(bw4,'holes'); max(bw4(:)); figure(3),imshow(c1,'InitialMagnification', 10); figure(4), imshow(bw2,'InitialMagnification', 10); figure(5), imshow(bw3,'InitialMagnification', 10); figure(6),imshow(label2rgb(bw4),'InitialMagnification', 10); k=ones(max(bw4(:)),1); clear bw5 for i=1:length(x1) if bw3(round(y2(i)),round(x1(i))) ~= 0 m=bw3(round(y2(i)),round(x1(i))); bw5{m}(k(m),1)=x1(i); bw5{m}(k(m),2)=y2(i); k(m)=k(m)+1; end end figure(7), imshow(~c1,'InitialMagnification', 10); hold on for i=1:max(bw4(:)) %scatter(bw5{i}(:,1),bw5{i}(:,2)) j = boundary(bw5{i}(:,1),bw5{i}(:,2),0.5); %poly=convhull(bw5{i}(:,1),bw5{i}(:,2)); %plot(bw5{i}(poly,1),bw5{i}(poly,2)), title('convhull') if polyarea(bw5{i}(j,1),bw5{i}(j,2))> 10^5; patch(bw5{i}(j,1),bw5{i}(j,2),'r'), title('boundary') indexminy(i)=find(min(bw5{i}(:,2)) == bw5{i}(:,2)); indexminx(i)=find(min(bw5{i}(:,1)) == bw5{i}(:,1)); indexmaxy(i)=find(max(bw5{i}(:,2)) == bw5{i}(:,2)); indexmaxx(i)=find(max(bw5{i}(:,1)) == bw5{i}(:,1)); %xmin = bw5{i}(indexminx); xmax = bw5{i}(indexmaxx); %ymin = bw5{i}(indexminy); ymax = bw5{i}(indexmaxy); str=[(indexminx(i)+indexmaxx(i))/2,(indexminy(i)+indexmaxy(i))/2,'Region no.',num2str(i)]; text((min(x1(i))+max(x1(i)))/2,(min(y1(i))+max(y1(i)))/2,str) polya(i)=polyarea(bw5{i}(j,1),bw5{i}(j,2)); end end spolya=sum(polya(:)) print -dpng -r500 B 

只是为了向你展示更多的照片,当我融合他们几个:

在这里输入图像说明在这里输入图像说明在这里输入图像说明 当我融合:

在这里输入图像说明
正如你可以看到他们重叠,我不想要的,所以我希望我创build的每个图像'知道'我在做前面的运行,以便它不重叠。 我想得到每个地区的百分比面积,如果它们重叠,我不能使用我的样本的实际总面积,结果是错误的。

我没有我的matlab工作,但这是你需要做的。

对于第一次运行,使一个零数组等于您的图像大小

 already_taken = zeros(size(bw3)); 

然后在每次运行中,您可以填充此迭代所采用的区域。 因此,在代码的结尾处,将输出保存为png的地方,请将其读回类似的内容

 this_png = rgb2gray(imread(current_png_path))>threshold; 

做一些阈值转换成一个逻辑数组,并将这些值添加到已经采取。 所以在代码的最后,做一个

 already_taken = already_taken | this_png; % You might need to check if you need a single | or a double || 

所以现在你已经有一个已经拍摄像素的图像了,不好意思的是,我不允许bw2在第一时间取这些值

 bw2(already_taken) = 0; 

在代码结束时,当我想写我的PNG时,我的智能边界创build可能再次进入了already_taken区域,所以我不得不再进行一些检查。 据我所知,这个边界是根据你的bw5创build的。 所以,如果你填写这个表格,可以尝试像上面bw2那样进行类似的检查。

我希望这有帮助。

Interesting Posts