2015-04-23 15 views
12

Đâ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:

enter image description here

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:

enter image description here

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:

enter image description here

Đó 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ọ:

enter image description here enter image description here enter image description here Và khi tôi fuse:

enter image description here
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.

+4

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

+1

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

+0

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. –

Trả lời

1

Tôi không có hoạt động của mình nhưng đây là những gì bạn cần làm.

Đối với chạy đầu tiên thực hiện một loạt các số không tương đương với kích thước hình ảnh của bạn

already_taken = zeros(size(bw3)); 

Sau đó, trên mỗi lần chạy, bạn có thể điền vào các vùng chụp bởi lặp này. Vì vậy, ở phần cuối của mã của bạn, nơi bạn lưu các đầu ra vào một png, đọc nó trở lại vào một cái gì đó giống như

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

Chuyển đổi này vào một mảng logic bằng cách thực hiện một số ngưỡng và thêm những giá trị này vào đã được sử dụng. Vì vậy, ở phần cuối của mã này, làm một

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

Vì vậy, bây giờ bạn có một hình ảnh của điểm ảnh đã được sử dụng, bệnh nướng chắc chắn tôi không cho phép bw2 để có những giá trị này ở vị trí đầu tiên

bw2(already_taken) = 0; 

Và ở cuối mã khi tôi muốn viết png của tôi, tạo ranh giới thông minh của tôi một lần nữa có thể đã nhập vào khu vực was_taken vì vậy một lần nữa tôi sẽ phải đặt một số kiểm tra. Theo tôi hiểu, ranh giới này đang được tạo dựa trên bw5 của bạn. Vì vậy, nơi mà bạn đã bao giờ điền vào ma trận này, hãy thử đặt một kiểm tra tương tự như tôi đã làm ở trên cho bw2.

Tôi hy vọng điều này sẽ hữu ích.

+0

Hey cảm ơn sự giúp đỡ của bạn, tôi đã làm việc trên một cái gì đó để cải thiện nó và tôi nghĩ tôi ave figured nó ra với một số trợ giúp. Tôi sẽ cập nhật câu hỏi vào ngày mai –

Các vấn đề liên quan