如果区域已经被填充,请勿进行补丁操作。

12
这是我在我的代码中遇到的一个相当棘手的挑战。首先,我所提供的代码无法运行,因为我使用了一个Excel表格(但如果有人想尝试使用我的代码,我很乐意通过电子邮件发送它)。
我手头有一份Excel表格,其中记录了我拍摄的显微图像中横截面纤维的数据。这些信息基本上包括:部位的“位置”、“面积”和“旋转角度”。
从这些信息中,我计算出定向角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

这里有更多图片,展示了我将它们融合在一起的情况:

输入图像描述 输入图像描述 输入图像描述 当我进行融合时:

输入图像描述
你可以看到它们重叠在一起,这不是我想要的,所以我想让我创建的每个图像“知道”我在之前的运行中正在做什么,以便它们不会重叠。 我想获取每个区域的百分比面积,如果它们重叠,则无法使用我的样本的实际总面积,结果会出错。


1
我已经盯着第一张图片看了大约10分钟。+1。 - rayryeng
谢谢你。说实话,我不太确定该问谁。我不是很擅长Matlab,在这个项目(我的硕士论文)中,我学到了很多我不知道存在的函数。我只希望它有意义,有人能够指导我。你可以看到我的代码上,我已经添加了一些注释来说明我会添加什么额外的约束条件。 - Dorian Kartalovski
@DorianKartalovski - 这绝对是一个有趣的问题。您能否上传数据,以便我们重建您的问题?我有一些想法想要尝试。 - rayryeng
我要做的是将我的Excel表格上传到Google Drive上,并在这里放置超链接,因为有大约10万行内容。https://drive.google.com/file/d/0B_cS79c9GkkOSTUtMEdvRHhlN2c/view?usp=sharing - Dorian Kartalovski
我认为你在这里得到更好的曝光机会。 - krisdestruction
显示剩余4条评论
1个回答

1
我不会使用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时,我的智能边界创建可能再次进入已经占用的区域,因此我需要再次进行一些检查。据我所知,这个边界是基于你的bw5创建的。因此,无论您在哪里填充此矩阵,请尝试像我为bw2做的那样放置类似的检查。
我希望这可以帮助到您。

嘿,感谢你的帮助,我一直在努力改进它,现在我想我已经通过一些帮助找到了解决方法。明天我会更新问题。 - Dorian Kartalovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接