Binary Stream into Matlab

조회 수: 6 (최근 30일)
Dan
Dan 2012년 12월 10일
Good evening,
So far the community has been fantastic in aiding me to learn Matlab so thank you. However a new problem has presented itself, in another program I have saved data to a file using a byte[] array (C#), the file is 100MB large.
The data contained within that file is a depth sensor pixel data stored in a byte[] array and saved to file. I am able to read the file and import the data into a single column and that is as far as I am able to get.
I am looking for assistance in how to visualise the data into possible a imshow()/drawnow method.
Thanks again,
Dan

채택된 답변

Image Analyst
Image Analyst 2012년 12월 10일
Why are you reading it into a column when you want a 2D array? You can read directly into a 2D array. Here's a snippet from an m-file of mine:
oneSlice = fread(fileHandle, [x_size y_size], '*uint8');
Ok, then you have a 2D array. Not sure what your difficulty with imshow() is. You can simply do
imshow(oneSlice); % or whatever your matrix is called.
  댓글 수: 6
Dan
Dan 2012년 12월 11일
It would be a great help, if at all possible.
Image Analyst
Image Analyst 2012년 12월 11일
Here is a function that reads a raw binary image with a 3D image in it. User specifies which slice they want and it retrieves that as a 2D image. Instructions for calling it are in the comments at the beginning.
% Read_RAW_Slice
% Reads one slice from a RAW file from disk.
%
% [oneSlice, stHeader] = Read_RAW_Slice(fullFileName, sliceNumber)
% or, alternate usage:
% [oneSlice, stHeader] = Read_RAW_Slice(fullFileName, stInputParameters)
% reads the specified slice from data in 'fullFileName' and
% returns the slice data as a 2D array, and the header as a structure stHeader.
% This method of calling allows for cropping and subsampling.
%
%======== EXAMPLE USAGES =====================================
% Example #1 usage: Simply read a slice. No cropping or subsampling.
% Note that you can pass in just a single number for the second argument and it
% will be the slice number. The Subsampling would then be 1. For example:
% fullFileName = 'SimulatedData_Distance8Bit.RAW';
% [oneSlice, stHeader] = Read_RAW_Slice(fullFileName, 10);
% imshow(oneSlice, []);
%
% Example #2 usage: Read a slice with subsampling in the x, y, and z directions.
% Create a MATLAB structure dynamically to hold the input parameters.
% Use ZStart for the slice number. You don't need to define any other structure members.
% stInputParameters.ZStart = 60;
% stInputParameters.Subsample = 4; % Same for all 3 directions.
% fullFileName = 'SimulatedData_Distance8Bit.RAW';
% [oneSlice, stHeader] = Read_RAW_Slice(fullFileName, stInputParameters);
% imshow(oneSlice, []);
%
% Example #3 usage: Read a slice and crop and subsample it in the x, y, and z directions.
% Create a MATLAB structure dynamically to hold the input parameters.
% stInputParameters.XStart = 200;
% stInputParameters.YStart = 1200;
% stInputParameters.XEnd = 400;
% stInputParameters.YEnd = 1600;
% Use ZStart for the slice number. You don't need to define any other structure members.
% stInputParameters.ZStart = 70;
% stInputParameters.Subsample = 4; % Same for all 3 directions.
% fullFileName = 'SimulatedData_Distance8Bit.RAW';
% [oneSlice, stHeader] = Read_RAW_Slice(fullFileName, stInputParameters);
% imshow(oneSlice, []);
%=============================================================
%
% Image Analyst, 7/30/2007.
%--------------------------------------------------------------------------------------------
function [oneSlice, stHeader] = Read_RAW_Slice(fullFileName, stInputParameters)
% Check syntax. Must have two arguments.
if (nargin ~= 2)
error('Usage: [image2D, stHeader] = Read_RAW_Slice(fullFileName, stInputParameters)');
end
if (ischar(fullFileName) ~= 1)
error('Requires a string filename as an argument.');
end
if ~exist(fullFileName, 'file')
error('Error: file passed in to Read_RAW_Slice\n%s\ndoes not exist.', fullFileName);
end
% Read in header and get 3D image array dimensions.
stHeader = Read_RAW_Header(fullFileName);
% Note: fread() requires that x_size and y_size be doubles.
x_size = double(stHeader.x_size);
y_size = double(stHeader.y_size);
z_size = double(stHeader.z_size);
% Determine the parameters that they passed in.
if isa(stInputParameters, 'double') || isa(stInputParameters, 'integer')
% They didn't pass in a structure - they just passed in a single number (scalar).
% Interpret this number as the slice number.
sliceNumber = int32(stInputParameters);
% For the rest, just take the entire slice.
xStart = int32(1);
yStart = int32(1);
xEnd = int32(x_size);
yEnd = int32(y_size);
Subsampling = int32(1);
else
% They passed in a structure. Make sure they passed in valid numbers.
% Assign defaults to any fields in stInputParameters that they didn't set.
stValidParameters = ValidateInputParameters(stInputParameters, x_size, y_size, z_size);
sliceNumber = int32(stValidParameters.ZStart);
xStart = int32(stValidParameters.XStart);
yStart = int32(stValidParameters.YStart);
xEnd = int32(stValidParameters.XEnd);
yEnd = int32(stValidParameters.YEnd);
Subsampling = int32(stValidParameters.Subsample);
end
% Make sure they asked for a slice that is within range.
if (sliceNumber > z_size)
% Error and exit if they didn't.
error('Slice number must be within the range 1 to %d.\nYou asked for slice %d.', z_size, sliceNumber);
end
% Open file for reading.
fileHandle = fopen(fullFileName, 'rb', stHeader.EndianArg);
if (fileHandle == -1)
error(['Error opening ', fullFileName, ' for input.']);
end
% Skip past header of stHeader.HeaderSize bytes.
bytesToSkip = int32(stHeader.HeaderSize);
fseek(fileHandle, bytesToSkip, 'bof');
% Now, additionally, skip past (sliceNumber - 1) slices
% so that we end up at the beginning byte of the slice that we want.
bytesToSkip = bytesToSkip + int32(x_size * y_size * stHeader.BytesPerVoxel * (sliceNumber - 1));
fseek(fileHandle, bytesToSkip, 'bof');
% Read in image2D image data
% Get original, full-sized 2-D slice.
% Note: fread() requires that x_size and y_size be doubles.
% Note: fread() will return a 2D array if you pass in a 2D array for the number of bytes, as in [x_size y_size].
if stHeader.BytesPerVoxel == 1
oneSlice = fread(fileHandle, [x_size y_size], '*uint8');
elseif stHeader.BytesPerVoxel == 2
oneSlice = fread(fileHandle, [x_size y_size], '*int16'); % It will be a 2D array after this.
else
error('Unsupported BytesPerVoxel %d', stHeader.BytesPerVoxel);
end
% Close the file.
fclose(fileHandle);
% Subsample and/or crop it, if requested.
if Subsampling ~= 1 || xStart ~= 1 || yStart ~= 1 || xEnd ~= x_size || yEnd ~= y_size
oneSlice = oneSlice(xStart:Subsampling:xEnd, yStart:Subsampling:yEnd);
end
return; % from Read_RAW_Slice()

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Walter Roberson
Walter Roberson 2012년 12월 10일
reshape() to a 2D array, and imshow(TheArray)

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by