Q: Matlab create window on image I need to create A 16X16 window to scan over an entire image in matlab and record the position and grey level value of pixel with largest grey level in window. 
Can anyone guide me on how to do this? Cant find any help on creating windows on images.
Thanks

A: Just for fun, here is another way of achieving this: store the intensity and the position of the maximum in your window as the real and imaginary parts of a complex number. You can then use the nfilter function to perform the moving filtering:
fun = @(x) complex(double(max(x(:))),double(find(x==max(x(:)), 1, 'first')));
B = nlfilter(YourImage,[16 16],fun);

You can then access the maximum and its position from the complex map. Here is an example of the results when applied to one of the images given in this post:
Max intensity in the neighborhood (imagesc(real(B))):

Position of the maximum (imagesc(img(B))):


A: You could do it like this:
% img = [matrix representing your image]

N = 16;

window = repmat(struct, ceil(size(img, 1) / N), ceil(size(img, 2) / N));
for row = 1:N:size(img, 1)
    for col = 1:N:size(img, 2)
        r = (row - 1) / N + 1;
        c = (col - 1) / N + 1;

        imgWindow = img(row:min(end,row+N-1), col:min(end,col+N-1));
        largest = max(imgWindow(:));
        [rLarg, cLarg] = find(imgWindow == largest, 1, 'first');

        window(r, c).largest = largest;
        window(r, c).row = rLarg + row - 1;
        window(r, c).col = cLarg + col - 1;
    end
end

You'll have a matrix called window where window(r,c) contains information about window (r,c), with the fields:


*

*window(r,c).largest: gray level of the largest pixel

*window(r,c).row, window(r,c).col: position of the largest pixel on the original image


A: Old school for-Loop method -
%%// Outputs that you are interested in are - img, x1 and y1
img = rgb2gray(input_image); %%// Gray level values
x1 = zeros(size(img)); %%// Row values for the maximum pixel in the 16x16 window
y1 = zeros(size(img)); %%// Column values for the maximum pixel in the 16x16 window
for k1= 1:size(img,1)-15
    for k2= 1:size(img,2)-15
        img1 = img(k1:k1+15,k2:k2+15);        
        [val,ind1] = max(img1(:));
        img(k1+8,k2+8)=val; %%// Store the max grey value into the image
        [x1(k1,k2),y1(k1,k2)] = ind2sub([16 16],ind1);
    end
end

Edit 1: For calculating mean across this sliding window, use this -
window_size = 16; %%// Edit this to your window size

wsz = window_size-1;
mp = round(window_size/2);

%%// Outputs that you are interested in are - img, x1 and y1
img = rgb2gray(input_image); %%// Gray level values
x1 = zeros(size(img)); %%// Row values for the maximum pixel in the 16x16 window
y1 = zeros(size(img)); %%// Column values for the maximum pixel in the 16x16 window

img1 = img;
for k1= 1:size(img,1)-wsz
    for k2= 1:size(img,2)-wsz
        window_data = img(k1:k1+wsz,k2:k2+wsz);        
        val = round(mean(window_data(:)));
        img1(k1+mp,k2+mp)=val; %%// Store the mean grey value into the image
    end
end

figure,imshow(img1)

Edit 2:
img1 = Z;
for k1= 1:size(Z,1)-wsz
    for k2= 1:size(Z,2)-wsz
        window_data = Z(k1:k1+wsz,k2:k2+wsz);        
        val = mean(window_data(:))
        if (val~=0)
            keyboard;
            error('Look, there is a non-zero mean value!');
        end
       % img1(k1+mp,k2+mp)=val; %%// Store the mean grey value into the image
        display(val);
    end
end


A: The key step you need is to extract a sub image the given scanning window (i.e. rectangle area). If the scanning winow, say roi is in format [x, y, width, height], you can simply call imcrop:
subImage = imcrop(Image, roi);

Then you can find the max gray level in the sub image, like this
[value, location] = max(subImage(:));

Of course, you need to update the scanning window i.e. roi in order to scan over the whole image.
