4 x 4 Mask to Identify Regions on Map with Highest Value

조회 수: 2 (최근 30일)
Michelle De Luna
Michelle De Luna 2020년 7월 18일
댓글: Michelle De Luna 2020년 8월 1일
Good afternoon everyone!
I have a 360 x 576 matrix that represents a map of the world (latitude and longitude, respectively). Each of the elements in the matrix has a value between 0 and 100 that represents the amount of precipitation present at that geographic location. I would like to create a mask that checks every 4 rows by 4 columns to identify those regions on the "map" with the highest concentration of values. Essentially, I am looking for those regions where intense precipitation concentrates so that I may further inspect these geographic locations. Here, I think finding the average of the 4 x 4 mask might be helpful, but I don't know how to apply the averaging method to the entire matrix without overlapping. Also, I'm unsure if I can "highlight" the top five or so "4 x 4 boxes" with the highest values for the entire matrix. Any suggestions? I'm actively working on the problem but would appreciate any ideas. Thanks!
Michelle

채택된 답변

Image Analyst
Image Analyst 2020년 7월 19일
Try this:
% Demo to find 4x4 regions with the highest sum value.
clc; % Clear the command window.
fprintf('Beginning to run %s.m ...\n', mfilename);
close all; % Close all figures (except those of imtool.)
imtool close all; % Close all imtool figures.
clear; % Erase all existing variables.
workspace; % Make sure the workspace panel is showing
fontSize = 15;
% Get temperature array with temps between 20 and 30 degrees celsius.
grayImage = 20 + 10 * rand(360, 576);
subplot(2, 1, 1);
imshow(grayImage, [])
impixelinfo; % Let user see RGB values as they mouse around.
colorbar
axis('on', 'image');
title('Original Image', 'FontSize', fontSize);
% Maximize the window to make it easier to draw.
g = gcf;
g.WindowState = 'maximized'
fprintf('Done running %s.m ...\n', mfilename);
% Get kernel
kernel = ones(4, 4);
sumImage = conv2(grayImage, kernel, 'same');
subplot(2, 1, 2);
imshow(sumImage, []);
axis('on', 'image');
title('Sum Image', 'FontSize', fontSize);
% Find 5 highest sums
sortedValues = sort(sumImage(:), 'descend');
[highRows, highColumns] = find(sumImage >= sortedValues(5))
% Place red squares around those areas.
hold on;
MarkerSize = 30;
plot(highColumns, highRows, 'rs', 'MarkerSize', MarkerSize, 'LineWidth', 3);

추가 답변 (1개)

jonas
jonas 2020년 7월 19일
Using imresize from the image processing TB
%non-overlapping (use conv2 method 'valid' for overlapping)
A = imresize(Z,0.5,'box');
%get indices for max id
[val, id] = max(A,[],[1,2],'linear');
[x,y] = ind2sub(size(A),id)*2;
The indices are multiplied by a factor 2 to get indices in the original matrix.
  댓글 수: 1
Michelle De Luna
Michelle De Luna 2020년 8월 1일
Thank you for your help, Jonas! This was very insightful! :)

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

Community Treasure Hunt

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

Start Hunting!

Translated by