Highlight peaks/dents in a heatmap imagesc()

조회 수: 12 (최근 30일)
Konvictus177
Konvictus177 2022년 1월 15일
댓글: Oliver Tolfts 2023년 3월 2일
Hi,
I am creating an image based on laser distance data (z) that I am collecting using imagesc(x,y,z). This gives me a heatmap/surface map of my object.
How can I automatically highlight the peaks/dents in this map or areas where z is higher/lower than a user defined threshold? I would like to create a circle around that area that has values higher or lower than a threshold or highlight those areas in any other way.
Thanks!
  댓글 수: 2
yanqi liu
yanqi liu 2022년 1월 17일
yes,sir,may be upload your data to do some analysis
Konvictus177
Konvictus177 2022년 1월 17일
편집: Konvictus177 2022년 1월 17일
Imagine you have the following data set:
Z = peaks;
x = linspace(0,2*pi);
y = linspace(0,2*pi);
figure
imagesc(x,y,Z)
Now I want the user to set a threshold value for Z interactively and create contour lines for everything either lower or higher than what the user has set as a threshold.
Thanks.

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

채택된 답변

Mathieu NOE
Mathieu NOE 2022년 1월 18일
hello
a very simple code that combines surf and contour (will not draw a circle but maybe it's still a valuable solution)
[X,Y,Z] = peaks(100);
figure(1),hold on
s = surf(X,Y,Z,'Facealpha',0.75,'Edgecolor','none');
view(2);
colorbar('vert');
threshold = 0.3*max(Z,[],'all');
[c,h] = contour(X,Y,Z,[threshold threshold],'-k','Linewidth',5);
hold off
  댓글 수: 5
Image Analyst
Image Analyst 2022년 1월 19일
Use App Designer to make a GUI. I'm sure there is a tutorial on that somewhere.
Konvictus177
Konvictus177 2022년 1월 22일
Yes, will do. Thanks!

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

추가 답변 (1개)

Image Analyst
Image Analyst 2022년 1월 17일
Use imregionalmax():
Z = mat2gray(peaks);
x = linspace(0,2*pi);
y = linspace(0,2*pi);
subplot(2, 2, 1);
imagesc(x,y,Z)
axis('on', 'image')
% get regional max:
peaks = imregionalmax(Z);
subplot(2, 2, 2);
imshow(peaks, []);
% Overlay it on the original
rgbImage = imoverlay(Z, peaks, 'r');
subplot(2, 2, 3);
imshow(rgbImage);
Now that you have the locations, you can get the values at those locations and set up thresholded images, one for each peak. Then use bwboundaries() to get all the contours and use inpolygon to figure out which contours contain each point. Not hard at all, so I imagine you can do that part yourself, right? Here's my version:
% Initialization steps.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 20;
Z = mat2gray(peaks);
x = linspace(0,2*pi);
y = linspace(0,2*pi);
subplot(2, 2, 1);
imagesc(x,y,Z)
impixelinfo;
axis('on', 'image')
% get regional max:
peaks = imregionalmax(Z);
% Some may have flat tops, so get down to a single point on each peak.
peaks = bwulterode(peaks);
subplot(2, 2, 2);
imshow(peaks, []);
% Overlay it on the original
rgbImage = imoverlay(Z, peaks, 'r');
subplot(2, 2, 3);
imshow(rgbImage);
impixelinfo;
% Get values of the peaks.
values = unique(Z(peaks))
% Get locations of the peaks.
[yp, xp] = find(peaks)
% Get contours
deltaz = 0.05;
subplot(2, 2, 4);
imshow(peaks, []);
hold on;
for k = 1 : length(values)
mask = Z > (values(k) - deltaz);
% imshow(mask);
boundaries = bwboundaries(mask);
thisx = xp(k);
thisy = yp(k);
plot(thisx, thisy, 'r+', 'MarkerSize', 20)
if ~isempty(boundaries)
for k2 = 1 : length(boundaries)
thisBoundary = boundaries{k2};
x = thisBoundary(:, 2);
y = thisBoundary(:, 1);
pointIsInside = inpolygon(thisx, thisy, x, y);
if pointIsInside
plot(x, y, '-', 'LineWidth', 2);
end
end
end
end
  댓글 수: 2
yanqi liu
yanqi liu 2022년 1월 18일
yes,sir,it is great idea,use imregionalmax to get region max and clear boarder,may be use to watermark segment
Oliver Tolfts
Oliver Tolfts 2023년 3월 2일
@Image Analyst, >20% of the graphs of my Ph.D were plotted using your help. Thank you for sharing all your knowledge of Matlab.
thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you thank you

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

카테고리

Help CenterFile Exchange에서 Biomedical Signal Processing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by