Dor*_*ski 12 excel matlab patch image-processing boundary
这对我的代码来说是一个非常艰巨的挑战.首先,我放在这里的代码不可运行,因为我使用的是Excel工作表(但如果有人想尝试使用我的代码,我很乐意通过电子邮件发送).
我所拥有的是Excel表格,其中包含我拍摄的显微图像中的横截面光纤数据.这些信息基本上是:location部分的,area,angle旋转.
从那里我计算出方向角Phi和Gamma.之后,我使用散射函数为每个Phi角度值绘制不同颜色的点.我使用恒定的颜色10度范围.这给了我一张这样的照片:

现在我的目标是计算每个同质区域的面积.因此,我想方设法绘制让我们说-10 +10区域内的所有点(我现在做20度,但之后会做10度).我用了一下,得到了这样一张照片:
白色对应于点在我选择的范围内的位置.之后,我使用MATLAB中的工具箱将每个点转换为一个像素.因此,我会得到一个带有大量白色像素的黑色背景,然后我imdilate用来制作圆圈,填充孔并用特定颜色隔离每个区域.最后,我使用函数边界和补丁,创建每个边界并用颜色填充它们.我得到一张这样的照片:

这就是我想要的,我可以得到每个区域的面积和总面积(我使用了一个阈值来丢弃小区域).然后我为每个区域运行代码几次,然后我用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
Run Code Online (Sandbox Code Playgroud)
只是为了向您展示我融合其中几个的更多照片:
当我融合:

你可以看到它们重叠,我不想要,所以我希望我创建的每个图像都"知道"我在之前的运行中正在做什么,这样它就不会重叠.我想获得每个区域的百分比区域,如果它们重叠,我不能使用我的样本的实际总面积,结果是错误的.
小智 1
我的 matlab 无法工作,但这就是你需要做的。
对于第一次运行,使零数组等于图像大小
already_taken = zeros(size(bw3));
Run Code Online (Sandbox Code Playgroud)
然后在每次运行时,您可以填充本次迭代所占用的区域。因此,在代码末尾,将输出保存为 png,将其读回类似的内容
this_png = rgb2gray(imread(current_png_path))>threshold;
Run Code Online (Sandbox Code Playgroud)
通过进行一些阈值处理将其转换为逻辑数组并将这些值添加到已获取的值中。所以在代码的最后,做一个
already_taken = already_taken | this_png; % You might need to check if you need a single | or a double ||
Run Code Online (Sandbox Code Playgroud)
所以现在你有了一张已经拍摄的像素的图像,请确保我不允许 bw2 首先获取这些值
bw2(already_taken) = 0;
Run Code Online (Sandbox Code Playgroud)
在代码末尾,当我想编写我的 png 时,我的智能边界创建可能再次进入已经采取的区域,因此我必须再次进行一些检查。据我了解,这个边界是根据你的 bw5 创建的。因此,无论您在何处填写此矩阵,请尝试进行类似的检查,就像我上面对 bw2 所做的那样。
我希望这有帮助。