Effacer les filtres
Effacer les filtres

saving elements of a dataset as images

72 vues (au cours des 30 derniers jours)
imaging
imaging le 16 Juil 2024 à 12:59
Commenté : Image Analyst il y a environ 21 heures
hello i would like to ask how to save inputData(:,:,idxSelected(i)) as an image file. thanks very much.
function [data,labelsVec,timestamps] = loadCSIDataset(fileName,label,visualizeData)
% loadCSIDataset Loads and visualizes the pre-recorded CSI dataset
% [DATA,LABELSVEC,TIMESTAMPS] =
% loadCSIDataset(FILENAME,LABEL,VISUALIZEDATA) loads the dataset that
% contains the data with the label (LABEL). Pre-recorded CSIs are
% visualized if (VISUALIZEDATA) is true. The function returns the
% pre-recorded beacon frame CSI (DATA), related timestamps (TIMESTAMPS),
% and the categorical labels vector (LABELSVEC).
% Copyright 2022-2024 The MathWorks, Inc.
arguments
fileName {char,string}
label (1,1) string
visualizeData = true;
end
% Load the pre-recorded dataset
datasetDir = which(fileName);
loadedData = load(datasetDir);
data = loadedData.data;
labelsVec = categorical(repmat(label,size(data,ndims(data)),1));
timestamps = loadedData.timestamps;
disp(['Dimensions of the ' char(label) ' dataset (numSubcarriers x numPackets x numCaptures): ' '[' num2str(size(data)) ']'])
% Visualize the dataset
if visualizeData
plotSamplesFromDataset(data,label);
end
% Plot samples from the pre-recorded dataset
function plotSamplesFromDataset(data,mode)
% Plot at most three random samples of the dataset
inputData = abs(data); % Visualize only the magnitude of the CSI
numTotalCaptures = size(inputData,ndims(inputData));
numPlots = min(3,numTotalCaptures);
idxSelected = sort(randperm(numTotalCaptures,numPlots));
figure;
T = tiledlayout(2,numPlots,'TileSpacing','compact');
% Plot 1 - CSI image
for i = 1:numPlots
nexttile
imagesc(inputData(:,:,idxSelected(i)));
colorbar;
xlabel('Packets');
ylabel('Subcarriers');
title(['Raw CSI (#' num2str(idxSelected(i)),')']);
end
% Plot 2 - Normalized CSI periodogram
for j = 1:numPlots
nexttile
imagesc(csi2periodogram(inputData(:,:,idxSelected(j))));
colorbar;
clim([0 1]);
xlabel('Temporal Index');
ylabel('Spatial Index');
title(['CSI Periodogram (#' num2str(idxSelected(j)),')']);
title(T,['Randomly Selected Samples of "', char(mode) '" Data']);
set(gcf,'Position',[0 0 650 450]);
end
end
end

Réponse acceptée

Image Analyst
Image Analyst le 17 Juil 2024 à 15:51
You want to save inputData(:,:,idxSelected(i)), which is a variable internal to a Mathworks written function called loadCSIDataset. Not exactly sure what that function is but we recommend never changing a built-in function from a Toolbox written by the Mathworks.
What you should do is to make a copy of that function in the current folder, or a folder of your own earlier in the search path, with a different name, like myLoadCSIDataset.m. Then you will modify your copy, not the original function.
Then in the for loop you can construct a filename with sprintf and fullfile and then save the image slice with imwrite. Here is a snippet with the relevant part that you should modify.
% Define the name of the output folder where you want to save these images.
outputFolder = 'C:\whatever'; % TODO: CHANGE THIS LINE.
if ~isfolder(outputFolder)
mkdir(outputFolder);
end
% Plot 1 - CSI image
for k = 1 : numPlots % Use k instead of i (the imaginary constant) as an iteration variable.
sliceNumber = idxSelected(k);
nexttile
imagesc(inputData(:, :, sliceNumber));
colorbar;
xlabel('Packets');
ylabel('Subcarriers');
caption = sprintf('Raw CSI (Slice #%d))', sliceNumber);
title(caption, 'FontSize', 18);
drawnow; % Force it to update the screen display immediately.
% Now make output file name for a lossless compression PNG format file.
baseFileName = sprintf('Slice %3.3d.png', sliceNumber);
fullFileName = fullfile(outputFolder, baseFileName); % Prepend output folder.
% Now save this image slice to disk.
imwrite(inputData(:, :, sliceNumber), fullFileName) % Save to disk.
fprintf('On iteration %d, saved slice #%d as %s.\n', k, sliceNumber, fullFileName); % Print the progress to the command window.
end
  3 commentaires
Image Analyst
Image Analyst le 18 Juil 2024 à 14:23
I'm not sure that makes sense because it doesn't matter what the left hand size size is, as long as you're not using indexing on that side. It just takes whatever is on hte right side and makes a new variable out of it. What are the sizes:
size(img)
size(inputData)
size(r_img)
img=im2double(inputData(:,:,idxSelected(i)));
r_img = cRadon(img, 180);
imaging
imaging le 18 Juil 2024 à 15:41
thanks a lot for your response. the values are size(img)=[52 8] size(inputData)=[52 8 250] size(r_img) i couldn't get it because of the error. the full error message is:
Unable to perform assignment because the size of the left side is 52-by-1 and the size of the right side is
1-by-8. Error in cRadon (line 20)
sg(:, i) = sum(imrotate(img, -angles(i), 'bilinear', 'crop'));

Connectez-vous pour commenter.

Plus de réponses (2)

Muskan
Muskan le 16 Juil 2024 à 17:09
Hi,
As per my understanding, to save the "inputData(:,:,idxSelected(i)") as an image file, you can use MATLAB's "imwrite" function. This function writes an image to a file in various formats such as PNG, JPEG, TIFF, etc.
You can follow the following steps:
  1. Convert the Data to a Suitable Format: Ensure the data is in a format that "imwrite" can handle. Typically, this means converting the data to "uint8" or "double" and normalizing it if necessary.
  2. Save the Image: Use "imwrite" to save the image.
You can also refer to the following documentation of "imwrite" for a better understanding: https://www.mathworks.com/help/matlab/ref/imwrite.html

Image Analyst
Image Analyst le 19 Juil 2024 à 14:55
Your cRadon() will do the radon transform for every angle from 1,2,3,4,....,179,180. Is that what you want or do you want just the single angle of 180 degrees for one projection only?
And more importantly, why not just use the built-in radon function instead of this no-good one? I'm attaching a demo of how to use radon to get projections along different angles.
  4 commentaires
imaging
imaging le 21 Juil 2024 à 17:45
i changed mode to mode1 and made the suggested modifications to the code. the datatype of mode1 is string. the code is working. thanks a lot for your help.
Image Analyst
Image Analyst il y a environ 21 heures
If my Answer solves your original question, then could you please click the "Accept this answer" link to award me with "reputation points" for their efforts in helping you? I'd appreciate it. Thanks in advance. 🙂 Note: you can only accept one answer (so pick the best one) but you can click the "Vote" icon for as many Answers as you want. Voting for an answer will also award reputation points.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Specifying Target for Graphics Output dans Help Center et File Exchange

Produits


Version

R2024a

Community Treasure Hunt

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

Start Hunting!

Translated by