フィルターのクリア

Save 360 arrays in a cell

1 回表示 (過去 30 日間)
mikel lasa
mikel lasa 2021 年 4 月 15 日
回答済み: mikel lasa 2021 年 4 月 15 日
Hello,
My programs loads 360 images (laser stripe) and from each image gets the 0 crossing of all rows. My issue is that after processing all images, im not able to save the 0 crossing arrays into a cell so I can post process them. Here my code:
clc; clear all; close all;
%% CARGAR LAS IMAGENES (load images)
for k = 1:360
jpgFilename = sprintf('%d.jpg', k);
fullFileName = fullfile('C:\MASTER\S2\percepcion\laser360\imagenes', jpgFilename);
if exist(fullFileName, 'file')
imageData = imread(fullFileName );
imageData=imrotate(imageData,90);
% se binariza la imagen (binarization)
img_o=rgb2gray(imageData);
mask=(img_o(:,:) > 50);
imageData = bsxfun(@times, img_o, cast(mask, 'like', img_o));
% figure()
% imshow(imageData)
% title('Binarizada')
%
[rows, columns, numberOfColorChannels] = size(imageData);
img_peaks = NaN(rows, 1);
img_puntos = zeros(rows, columns);
Xp = [];
Yp = [];
Xn=[];
Yn=[];
m=[];
n=[];
zerocross=[];
coefficients=[];
lineaslaser=cell(k,1);
%se busca la linea del 0 crossing
for icross=1:rows
img_puntos(icross,:)=imageData(icross,:);
%filtrado
filtrado=sgolayfilt(double(img_puntos(icross,:)),3,33 );
for ks=1:length(filtrado)
if filtrado(ks)<0
filtrado(ks)=0;
end
end
%derivada (gradient)
derivada=gradient(filtrado);
%maximo y minimo
[Yp(icross),Xp(icross)]=max(derivada);
[Yn(icross),Xn(icross)]=min(derivada);
%coeficientes de la recta (line coefs)
m(icross)= (Yp(icross)-Yn(icross))/(Xp(icross)-Xn(icross));
n(icross)= (Yp(icross)-m(icross)*Xp(icross));
% 0 crossing
zerocross(icross)= -n(icross)/m(icross);
img_peaks(icross) = zerocross(icross);
end
axis=1:1920;
img_peaks((1:10),1)=NaN;
img_peaks((1500:1920),1)=NaN;
% save 360 lines in a cell
lineaslaser{k}=img_peaks(k);
% figure()
% plot(axis,img_peaks)
% title('plot perfil de la pieza (0 crossing)')
else
warningMessage = sprintf('Warning: image file does not exist:\n%s', fullFileName);
uiwait(warndlg(warningMessage));
end
end
  3 件のコメント
mikel lasa
mikel lasa 2021 年 4 月 15 日
Yes, I want to save an entire vector in a cell for each loop. There is my problem, for each loop a vector is generated, so my aim is to create a variable that saves 360 vectors. I thought that cell is maybe the right way to do that.
Apart from that:
img_peaks((1:10),1)=NaN;
The first 10 elements are NaN because each image has some noise, I delete that noise this way. Its just, for cleaning.
DGM
DGM 2021 年 4 月 15 日
Okay. If you move the preallocation outside the main loop and set that line to
lineaslaser{k}=img_peaks;
does it help?

サインインしてコメントする。

採用された回答

mikel lasa
mikel lasa 2021 年 4 月 15 日
Edit:
I have achieved what I was looking for. As you said I deleted this line:
lineaslaser=cell(k,1);
and I changed my this line:
lineaslaser{k}=img_peaks(k);
for this one:
lineaslaser{k}=img_peaks(:,1);
now works, I have a 360 element cell where each cell is a 1920x1 vector. Thanks for your help!

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

製品


リリース

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by