MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
Asked by FIR on 28 Nov 2012

I have values named in variabla Block in the my values are as

val(:,:,1)

8x8 matrix values

val(:,:,2) ; ; ; val(:,:,3) 8x8 matrix values

for these all i have to find mean,for val(:,:,1) to vali(:,:,3)

please assist me

*No products are associated with this question.*

Answer by Jan Simon on 28 Nov 2012

Edited by Jan Simon on 28 Nov 2012

Please read the documentation of `mean()`:

help mean doc mean

It can be solved in one single line. Either a `reshape` is helful, or remember that the mean value of a set of variables is the mean value of the mean values of subsets, when they all have the same size.

Show 2 older comments

FIR on 28 Nov 2012

Jan it gives answer but if i try to do 8x8 matrix to 8x1 if i do Block(:) it gives matrix for whole block,i need for each block

Jan Simon on 28 Nov 2012

Did you read the documentation of `mean` already? If so, read it again. Look for the method to define the dimension to operate on.

In the original question it seems like you have a [8 x 8 x N] array and want to get the means as an [1 x N] vector. Then the command I've posted already does this: `mean(mean(B))`.

Image Analyst on 28 Nov 2012

He talks about "each block" so I'm guessing that he's processing a much larger array in "chunks" of 8 by 8. So he processes one block, then "jumps" over to the adjacent block and processes that, and so on for each block. Thus I thought blockproc() would be perfect for that. But he doesn't seem to know how to extract a plane from the N dimensional array, like

plane1 = val(:, :, 1); plane2 = val(:, :, 2);

and so on.

Answer by Image Analyst on 28 Nov 2012

Use blockproc(). Here's three grayscale examples that you can adapt to color very easily.

% Demo code to divide the image up into 16 pixel by 16 pixel blocks % and replace each pixel in the block by the median, mean, or standard % deviation of all the gray levels of the pixels in the block. % clc; clearvars; close all; workspace; fontSize = 16;

% Read in a standard MATLAB gray scale demo image. folder = fullfile(matlabroot, '\toolbox\images\imdemos'); if ~exist(folder, 'dir') % If that folder does not exist, don't use a folder % and hope it can find the image on the search path. folder = []; end baseFileName = 'cameraman.tif'; fullFileName = fullfile(folder, baseFileName); grayImage = imread(fullFileName); % Get the dimensions of the image. numberOfColorBands should be = 1. [rows columns numberOfColorBands] = size(grayImage) % Display the original gray scale image. subplot(2, 2, 1); imshow(grayImage, []); title('Original Grayscale Image', 'FontSize', fontSize);

% Enlarge figure to full screen. set(gcf, 'Position', get(0,'Screensize')); set(gcf,'name','Image Analysis Demo','numbertitle','off')

% Define the function that we will apply to each block. % First in this demo we will take the median gray value in the block % and create an equal size block where all pixels have the median value. % Image will be the same size since we are using ones() and so for each block % there will be a block of 8 by 8 output pixels. medianFilterFunction = @(theBlockStructure) median(theBlockStructure.data(:)) * ones(size(theBlockStructure.data), class(theBlockStructure.data));

% Block process the image to replace every pixel in the % 8 pixel by 8 pixel block by the median of the pixels in the block. blockSize = [8 8]; % Quirk: must cast grayImage to single or double for it to work with median(). % blockyImage8 = blockproc(grayImage, blockSize, medianFilterFunction); % Doesn't work. blockyImage8 = blockproc(single(grayImage), blockSize, medianFilterFunction); % Works. [rows columns] = size(blockyImage8);

% Display the block median image. subplot(2, 2, 2); imshow(blockyImage8, []); caption = sprintf('Block Median Image\n32 blocks. Input block size = 8, output block size = 8\n%d rows by %d columns', rows, columns); title(caption, 'FontSize', fontSize);

% Block process the image to replace every pixel in the % 4 pixel by 4 pixel block by the mean of the pixels in the block. % The image is 256 pixels across which will give 256/4 = 64 blocks. % Note that the size of the output block (2 by 2) does not need to be the size of the input block! % Image will be the 128 x 128 since we are using ones(2, 2) and so for each of the 64 blocks across % there will be a block of 2 by 2 output pixels, giving an output size of 64*2 = 128. % We will still have 64 blocks across but each block will only be 2 output pixels across, % even though we moved in steps of 4 pixels across the input image. meanFilterFunction = @(theBlockStructure) mean2(theBlockStructure.data(:)) * ones(2,2, class(theBlockStructure.data)); blockSize = [4 4]; blockyImage64 = blockproc(grayImage, blockSize, meanFilterFunction); [rows columns] = size(blockyImage64);

% Display the block mean image. subplot(2, 2, 3); imshow(blockyImage64, []); caption = sprintf('Block Mean Image\n64 blocks. Input block size = 4, output block size = 2\n%d rows by %d columns', rows, columns); title(caption, 'FontSize', fontSize);

% Block process the image to replace every pixel in the % 8 pixel by 8 pixel block by the standard deviation % of the pixels in the block. % Image will be smaller since we are not using ones() and so for each block % there will be just one output pixel, not a block of 8 by 8 output pixels. blockSize = [8 8]; StDevFilterFunction = @(theBlockStructure) std(double(theBlockStructure.data(:))); blockyImageSD = blockproc(grayImage, blockSize, StDevFilterFunction); [rows columns] = size(blockyImageSD);

% Display the block standard deviation filtered image. subplot(2, 2, 4); imshow(blockyImageSD, []); title('Standard Deviation Filtered Image', 'FontSize', fontSize); caption = sprintf('Block Standard Deviation Filtered Image\n32 blocks. Input block size = 8, output block size = 1\n%d rows by %d columns', rows, columns); title(caption, 'FontSize', fontSize);

Image Analyst on 28 Nov 2012

Yes. I know. That's why I gave the code. It processes blocks with examples for a 8 by 8 block and a 2 by 2 block of pixels. It does **not** give the mean of each pixel. If you think about it, the mean of each pixel is simply the **image itself** again - pretty worthless thing to do, so why would I do that?

## 1 Comment

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/55028#comment_114345

Please, FIR, explain the input data in valid Matlab syntax. I cannot guess what "val(:,:,1) 8x8 matrix values" and the three semicolons exactly mean. We try to help you, but it would be much easier if you care about clear questions also.