Help me with this calculation that uses blockproc()

2 Ansichten (letzte 30 Tage)
TUSHAR MURATKAR
TUSHAR MURATKAR am 4 Aug. 2017
Bearbeitet: Image Analyst am 24 Aug. 2017
I have an input image of size 384x512 double. I applied blockproc() on this input image, with a blocksize of 20x20, and as a result I got new output image of size 58x77 double.
My question is "why is the output image size 58x77?"

Antworten (1)

Walter Roberson
Walter Roberson am 4 Aug. 2017
With a 384 x 512 you do not have full blocks of 20 x 20 in either direction, so you will be operating on partial blocks on the edges.
Whatever operation you are doing is returning a 3 x 3 response for 20 x 20 blocks, but for the partial blocks it is returning 2 x 3 for the 4 x 20 partial blocks vertically, and 3 x 2 for the 20 x 12 the partial blocks horizontally, and 2 x 2 for the 4 x 12 partial corner block.
  2 Kommentare
TUSHAR MURATKAR
TUSHAR MURATKAR am 5 Aug. 2017
@walter, can u pls explain this with a pictorial or numerical example
Walter Roberson
Walter Roberson am 5 Aug. 2017
%I was slightly off on the above output description.
image_rows = 384;
image_columns = 512;
row_blocksize = 20;
column_blocksize = 20;
blockproc_output_rows = 58;
blockproc_output_columns = 77;
row_full_blocks = floor(image_rows/row_blocksize);
input_rows_used_for_full_blocks = row_blocksize * row_full_blocks;
row_partial_block_size = image_rows - input_rows_used_for_full_blocks;
outputs_per_full_row_block = floor(blockproc_output_rows ./ row_full_blocks);
output_rows_used_for_full_blocks = outputs_per_full_row_block * row_full_blocks;
leftover_blockproc_output_rows = blockproc_output_rows - output_rows_used_for_full_blocks;
column_full_blocks = floor(image_columns/column_blocksize);
input_columns_used_for_full_blocks = column_blocksize * column_full_blocks;
column_partial_block_size = image_columns - input_columns_used_for_full_blocks;
outputs_per_full_column_block = floor(blockproc_output_columns ./ column_full_blocks);
leftover_blockproc_output_columns = blockproc_output_columns - outputs_per_full_column_block * column_full_blocks;
output_columns_used_for_full_blocks = outputs_per_full_column_block * column_full_blocks;
leftover_blockproc_output_columns = blockproc_output_columns - output_columns_used_for_full_blocks;
fprintf('Image size is %d by %d\n', image_rows, image_columns);
fprintf('full input blocks are %d by %d\n', row_blocksize, column_blocksize);
fprintf('number of left-over input rows is %d; number of left-over input columns is %d\n', row_partial_block_size, column_partial_block_size);
fprintf('Output size is %d by %d\n', blockproc_output_rows, blockproc_output_columns);
fprintf('full output blocks are %d by %d\n', outputs_per_full_row_block, outputs_per_full_column_block);
fprintf('which uses up %d by %d of the output matrix\n', output_rows_used_for_full_blocks, output_columns_used_for_full_blocks);
fprintf('number of left-over output rows is %d; number of left-over output columns is %d\n', leftover_blockproc_output_rows, leftover_blockproc_output_columns);
fprintf('There are %d rows of output for each of the %d full input blocks with %d rows each\n', outputs_per_full_row_block, row_full_blocks, row_blocksize);
fprintf('There are %d rows of output for the one partial input block that was %d rows high\n', leftover_blockproc_output_rows, row_partial_block_size);
fprintf('There are %d columns of output for each of the %d full input blocks with %d columns each\n', outputs_per_full_column_block, column_full_blocks, column_blocksize);
fprintf('There are %d columns of output for the one partial input block that was %d columns wide\n', leftover_blockproc_output_columns, column_partial_block_size);
temp1 = sprintf('%2dx%2d ', row_blocksize, column_blocksize);
temp2 = [repmat(temp1, 1, column_full_blocks), sprintf('%2dx%2d\n', row_blocksize, column_partial_block_size)];
temp3 = repmat(temp2, 1, row_full_blocks);
temp4 = sprintf('%2dx%2d ', row_partial_block_size, column_blocksize);
temp5 = [repmat(temp4, 1, column_full_blocks), sprintf('%2dx%2d\n', row_partial_block_size, column_partial_block_size)];
fprintf('\nInput diagram:\n\n%s%s\n', temp3, temp5);
temp1 = sprintf('%2dx%2d ', outputs_per_full_row_block, outputs_per_full_column_block);
temp2 = [repmat(temp1, 1, column_full_blocks), sprintf('%2dx%2d\n', outputs_per_full_row_block, leftover_blockproc_output_columns)];
temp3 = repmat(temp2, 1, row_full_blocks);
temp4 = sprintf('%2dx%2d ', leftover_blockproc_output_rows, outputs_per_full_column_block);
temp5 = [repmat(temp4, 1, column_full_blocks), sprintf('%2dx%2d\n', leftover_blockproc_output_rows, leftover_blockproc_output_columns)];
fprintf('\nOutput diagram:\n\n%s%s\n', temp3, temp5);

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Image Processing Toolbox finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by