Excel 如果该区域已填充,则防止修补

Excel 如果该区域已填充,则防止修补,excel,matlab,image-processing,patch,boundary,Excel,Matlab,Image Processing,Patch,Boundary,这对我的代码来说是一个相当艰巨的挑战。首先,我在这里输入的代码无法运行,因为我使用的是Excel工作表(但如果有人想尝试使用我的代码,我很乐意发送电子邮件) 我所拥有的是一张Excel表格,上面有我拍摄的显微图像中横截面纤维的数据。信息基本上是:截面位置,区域,旋转角度 由此我计算出取向角φ和伽马。之后,我使用散射函数为每个φ角值绘制不同颜色的点。我使用10度范围内的恒定颜色。这给了我一张这样的照片: 现在我的目标是计算每个均匀区域的面积。所以我寻找一种方法来绘制-10+10区域内的所有点(我

这对我的代码来说是一个相当艰巨的挑战。首先,我在这里输入的代码无法运行,因为我使用的是Excel工作表(但如果有人想尝试使用我的代码,我很乐意发送电子邮件)

我所拥有的是一张Excel表格,上面有我拍摄的显微图像中横截面纤维的数据。信息基本上是:
截面位置
区域
旋转角度

由此我计算出取向角φ和伽马。之后,我使用散射函数为每个φ角值绘制不同颜色的点。我使用10度范围内的恒定颜色。这给了我一张这样的照片:

现在我的目标是计算每个均匀区域的面积。所以我寻找一种方法来绘制-10+10区域内的所有点(我现在做20度,但之后会做10度)。我用了一个眼神,得到了这样一张照片:

白色对应点在我选择的范围内的位置。之后,我使用MATLAB中的工具箱将每个点转换为一个像素。因此,我将得到一个黑色背景和大量的白色像素,然后我使用
imdeplate
制作圆圈,填充孔洞,并用特定的颜色隔离每个区域。最后,我使用函数boundary和patch来创建每个边界并用颜色填充它们。我得到一张这样的照片:

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

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

我试着这样做,在运行一次之后,保存矩阵bw4,并在绘制黑白图片时添加一个条件,如果Phi在我的范围内,并且这里没有白色,那么你可以把白色放进去,否则它是黑色的。但它似乎不起作用

我明白这是一件很复杂的事情,但我会很感激任何想法,并愿意通过电子邮件或其他方式聊天。我现在把完整的代码,我可以给你我的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=[c c c];

%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
clearvars-数据col4除外
全部关闭
clc
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%更改每个样本的数据%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cd'C:\Users\dkarta\Desktop\Sample 12\12.6'
数据=xlsread('Sample12_6res.xlsx');
cd'C:\Users\dkarta\Documents\MATLAB'
%数据=样本121res;%数据名
imax=长度(数据);%数据表中的行数
y=11900;%图像j上y方向上的像素数
%%
数据(:,15)=数据(:,9)*pi/180;%反转第9列(旋转角度),单位为rads
数据(:,16)=y-数据(:,6);%将Y坐标轴重置为左下角
δ=0:0.01:2*pi;%参数方程中的角度
θ=45*pi/180;%rads中的样品切割角度
%AA=[数据(:,5)'数据(:,16)'φ']
%定义颜色
beta=acos(数据(1:imax,8)。/data(1:imax,7));%/acos(0);
phi=atan(sin(beta)。*cos(数据(1:imax,15))/(sin(θ)*sin(beta)。*sin(数据(1:imax,15))+cos(θ)*cos(beta))/(pi/2);
phi2=phi/2+1/2;%在0和1之间的平面角度φ中缩放
gamma=atan((cos(θ)*sin(β)。*sin(数据(1:imax,15))-sin(θ)*cos(β))/。。。
(sin(θ)*sin(β)。*sin(数据(1:imax,15))+cos(θ)*cos(β))/(pi/2);
伽马2=伽马+1/2;%在0和1之间缩放平面外角度gamma
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%网格和彩色地图%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
x1=数据(1:imax,5);
y1=数据(1:imax,16);
z1=φ*90;
z2=伽马*90;
n=300;
%跨数据空间创建规则网格
[X,Y]=meshgrid(linspace(min(x1),max(x1),n),linspace(min(y1),max(y1),n));
%创建具有10度恒定颜色的颜色贴图
map4=[0 0 1;0 1/3 1;0 2/3 1;0 1 1;0 1 2/3;0 1 0;1/3 1 0;2/3 1 0;1 10;1 0.75 0;1 0.5 0;1 0.25 0;1 0 0 0 0;0.75 0.25;0.50 0 0.5;0.25 0 0 0.75;0 0 1];
Colormap4=colormap(map4);
h=色条;
caxis([-90])
设置(h,'YTick',[-90:10:90])
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%使用散点绘制-隔离某些区域%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a=-10;%角间隔的下边界
b=10;%角间隔的上边界
c=z1>a&z1a%&&bw4(轮(y1(i)),轮(x1(i))==0
c(i)=1;
c1(圆形(y2(i)),圆形(x1(i))=1;
其他的
c(i)=0;
c1(圆形(y2(i)),圆形(x1(i))=0;
结束
结束
C=[C];
%c(find(c==0))=NaN;
%轮廓线(X,Y,网格数据(x1,y1,c,X,Y),100,'EdgeColor','None')
图(1),散布(x1,y1,3,z1,'填充');
轴相等
轴([0 8000 0 12000])
轴心分离
图(2),散布(x1,y1,3,C,'填充');
轴相等
轴([0 8000 0 12000])
轴心分离
se=应力('圆盘',50,8);
bw2=扩张(c1,se);
bw4=bwlabel(bw2);
bw3=填充物(bw4,“孔”);
最大值(bw4(:);
图(3),imshow(c1,“初始放大”,10);
图(4),imshow(bw2,“初始放大”,10);
图(5),imshow(bw3,“初始放大”,10);
图(6),imshow(标签2RGB(bw4),“初始放大”,10);
k=一(最大值(bw4(:)),1);
清除bw5
对于i=1:长度(x1)
如果bw3(圆(y2(i)),圆(x1(i))~=0
m=bw3(圆形(y2(i)),圆形(x1(i));
bw5{m}(k(m),1)=x1(i);bw5{m}(k(m),2)=y2(i);
k(m)=k(m)+1;
结束
结束
图(7),imshow(~c1,“初始放大”,10);
等等
对于i=1:最大值(bw4(:)
%散射(bw5{i}(:,1),bw5{i}(:,2))
j=边界(bw5{i}(:,1),bw5{i}(:,2),0.5);
%poly=convhull(bw5{i}(:,1),bw5{i}(:,2));
%图(bw5{i}(poly,1),bw5{i}(poly,2)
already_taken = zeros(size(bw3));
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(already_taken) = 0;