Đây là một thách thức khá khó khăn tôi có với mã của tôi. Đầu tiên của tất cả các mã tôi đặt ở đây không phải là runnable vì tôi đang sử dụng một bảng Excel (nhưng tôi hạnh phúc để gửi email cho nó nếu mọi người muốn thử sử dụng mã của tôi).Ngăn chặn để vá lỗi nếu khu vực này đã được điền
gì tôi có là một tấm với dữ liệu trên sợi cắt ngang trong một hình ảnh nhỏ tôi đã Excel. Các thông tin cơ bản là: location
của bộ phận, area
, angle
quay.
Từ đó tôi tính toán góc định hướng Phi, và Gamma. Sau đó tôi sử dụng chức năng phân tán để vẽ một dấu chấm các màu khác nhau cho mỗi giá trị góc Phi. Tôi sử dụng một màu liên tục cho một phạm vi 10 độ. Mà mang lại cho tôi một bức tranh như thế này:
Bây giờ mục tiêu của tôi đến là tính toán diện tích của từng vùng đồng nhất. Vì vậy, tôi tìm một cách để vẽ chúng ta hãy nói tất cả các dấu chấm trong vùng -10 +10 (tôi đang làm 20 độ cho bây giờ, nhưng sẽ làm 10 sau). Tôi sử dụng một cái nhìn và tôi nhận được một bức tranh như thế này:
Các tương ứng với màu trắng nơi các dấu chấm nằm trong phạm vi tôi đã chọn. Sau đó, tôi sử dụng hộp công cụ trong MATLAB để chuyển đổi từng dấu chấm thành pixel. Vì vậy, tôi sẽ nhận được một nền màu đen với vô số điểm ảnh màu trắng, sau đó tôi sử dụng imdilate
để tạo vòng tròn, lấp đầy lỗ và cách ly từng vùng bằng một màu cụ thể. Cuối cùng, tôi sử dụng các ranh giới chức năng và bản vá, để tạo ra mỗi ranh giới và điền chúng với một màu. Và tôi nhận được một bức tranh như thế này:
Đó là những gì tôi muốn và tôi có thể lấy diện tích của từng vùng và tổng diện tích (tôi đã sử dụng một ngưỡng để loại bỏ các khu vực nhỏ). Sau đó, tôi chạy mã một thời gian cho mỗi khu vực, và tôi sử dụng imfuse
để đưa chúng trở lại với nhau và xem những gì nó trông giống như.
VẤN ĐỀ là, chúng trùng lặp khá nhiều và đó là do có một số lỗi trong dữ liệu của tôi và do đó một số chấm màu xanh sẽ có màu đỏ và vân vân. Vì vậy, tôi muốn chạy mã một lần, sau đó khi tôi chạy lại nó với phạm vi khác, nó làm điều tương tự nhưng không đưa vào giá trị tài khoản khi có một cái gì đó đã vẽ trước đó.
Tôi cố gắng làm điều đó bằng cách, sau khi chạy một lần, lưu ma trận bw4 và thêm điều kiện khi vẽ ảnh đen trắng, bằng cách nói nếu Phi nằm trong phạm vi của tôi VÀ không có màu trắng ở đây thì bạn có thể đặt màu trắng, nếu không thì nó là màu đen. Nhưng nó dường như không hoạt động.
Tôi hiểu đây là một điều khá phức tạp để giải thích, nhưng tôi sẽ đánh giá cao bất kỳ ý tưởng, và cởi mở để trò chuyện qua email hoặc ngược lại. Tôi đang đặt mã đầy đủ bây giờ, và tôi có thể gửi cho bạn bảng tính Excel của tôi nếu bạn muốn chạy nó trên máy tính của bạn và xem cho chính mình.
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
Chỉ cần để cho bạn thấy nhiều hơn hình ảnh của khi tôi fuse vài trong số họ:
Và khi tôi fuse:
Như bạn có thể thấy họ chồng chéo lên nhau, mà tôi không muốn, vì vậy tôi muốn mỗi hình ảnh mà tôi tạo ra để 'biết' những gì tôi đang làm trên các lần chạy trước đó để nó không trùng lặp. Tôi muốn nhận diện tích phần trăm của từng khu vực và nếu chúng trùng nhau, tôi không thể sử dụng tổng diện tích thực tế của mẫu và kết quả sai.
Giải thích tốt về một vấn đề khó khăn, vì vậy +1 - cũng vì hình ảnh đầu tiên là một tác phẩm nghệ thuật! Tuy nhiên, đây có phải là điều gì đó cho [Xử lý tín hiệu] (http://dsp.stackexchange.com/help/on-topic) không? – pnuts
Tôi đã nhìn chằm chằm vào hình ảnh đầu tiên trong khoảng 10 phút rồi. +1. – rayryeng
LOL Cảm ơn bạn rất nhiều. Tôi không thực sự chắc chắn những người yêu cầu phải trung thực. Tôi không giỏi Matlab, và với dự án này (cho các bậc thầy của tôi), tôi đang học rất nhiều chức năng mà tôi không biết. Tôi chỉ hy vọng nó có ý nghĩa và ai đó sẽ có thể hướng dẫn tôi. Bạn có thể thấy trên mã của tôi mà tôi đã thực hiện một số ý kiến oh những gì tôi sẽ thêm để đặt hạn chế này thêm. –