identify the pixel color as a single number (no RGB triplet)

1 Ansicht (letzte 30 Tage)
Hi. I am using the function you find at this link1 (but you can also use Image Viewer App explained at this link2).
I should ask for some information:
1. Is there a way to display the single number (not the RGB triplet) as visible in link2 (see "pixel region tool")?
2. Is there a way to display the single number directly on the image as shown? (see image on the left)

Akzeptierte Antwort

Adam Danz
Adam Danz am 23 Jan. 2023
Is there a way to display the single number (not the RGB triplet)?
Here are two ways to explore the CData in your image interactively.
Show CData value under the cursor
This uses the axes currentPoint property that shows the location of your cursor within the axes. It assumes that the image's XData and YData properties are default where pixels are centered on consecutive integers. Pardon the poor GIF quality.
rgb = imread('moon.tif');
I = imshow(rgb);
colorbar()
ax = ancestor(I,'axes');
hold on
txt = text(ax,nan, nan, '', 'FontSize', 10, 'Color','r','VerticalAlignment','bottom');
set(gcf,'WindowButtonMotionFcn', {@showCData,txt,ax,I})
function showCData(~,~,txt,ax,I)
currpt = round(ax.CurrentPoint(1,1:2));
isInImg = inpolygon(currpt(1),currpt(2),ax.XLim([1 2 2 1]),ax.YLim([1 1 2 2]));
if isInImg
% Find nearest pixel
str = string(I.CData(currpt(2),currpt(1)));
set(txt,'Position', [currpt,0], 'String', str)
else
txt.String = '';
end
end
Show all CData values within a subsection of the image
Showing all CData values across the entire image would exhaust the graphics system unless the image was very small. Insead, this use the LimitsChangedFcn to detect when the x-axis limits have changed (you can adapt it to respond to the y-axis too). When the limits result in a smaller subsection of pixels, a threshold I set to 15 pixels along the x-axis, the CData values will turn on within the frame. This demo also assumes that the image's XData and YData properties are default where pixels are centered on consecutive integers.
rgb = imread('moon.tif');
I = imshow(rgb);
colorbar()
hold on
ax = gca();
ax.XAxis.LimitsChangedFcn = {@imageZoomLabeler,I};
function imageZoomLabeler(ruler,limitsChanged,img)
xrng = limitsChanged.NewLimits(2)-limitsChanged.NewLimits(1);
persistent texthandles
delete(texthandles)
if xrng < 15 % set threshold
x = ceil(limitsChanged.NewLimits(1)) : floor(limitsChanged.NewLimits(2));
yl = ruler.Parent.YLim;
y = ceil(yl(1)) : floor(yl(2));
xm = x.*ones(numel(y),1);
ym = y.'.*ones(1,numel(x));
ind = sub2ind(size(img.CData),ym,xm);
str = string(img.CData(ind));
texthandles = text(ruler.Parent,xm(:),ym(:),str(:), ...
'FontSize',10,'Color','r',...
'VerticalAlignment','middle',...
'HorizontalAlignment','center');
end
end

Weitere Antworten (0)

Kategorien

Mehr zu Modify Image Colors finden Sie in Help Center und File Exchange

Produkte


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by