Get pixel values from image patch
5 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hy Guys,
I have a BMP image and I have selected specific regions from the image using the imageregion tool. Now, I want to extract the pixel values from each region and process them in my code. Is it possible to automatically, through the region locations, retrieve the RGB values from each pixel in each region ?
Thanks.
0 comentarios
Respuestas (3)
Image Analyst
el 15 de Feb. de 2012
You might take a look at my imfreehand masking demo:
% Demo to have the user freehand draw an irregular shape over
% a gray scale image, have it extract only that part to a new image,
% and to calculate the mean intensity value of the image within that shape.
% By ImageAnalyst
% Change the current folder to the folder of this m-file.
if(~isdeployed)
cd(fileparts(which(mfilename)));
end
clc; % Clear command window.
clear; % Delete all variables.
close all; % Close all figure windows except those created by imtool.
imtool close all; % Close all figure windows created by imtool.
workspace; % Make sure the workspace panel is showing.
fontSize = 16;
% Read in standard MATLAB gray scale demo image.
grayImage = imread('cameraman.tif');
subplot(2, 3, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize);
set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.
message = sprintf('Left click and hold to begin drawing.\nSimply lift the mouse button to finish');
uiwait(msgbox(message));
hFH = imfreehand();
% Create a binary image ("mask") from the ROI object.
binaryImage = hFH.createMask();
% Display the freehand mask.
subplot(2, 3, 2);
imshow(binaryImage);
title('Binary mask of the region', 'FontSize', fontSize);
% Calculate the area, in pixels, that they drew.
numberOfPixels1 = sum(binaryImage(:))
% Another way to calculate it that takes fractional pixels into account.
numberOfPixels2 = bwarea(binaryImage)
% Get coordinates of the boundary of the freehand drawn region.
structBoundaries = bwboundaries(binaryImage);
xy=structBoundaries{1}; % Get n by 2 array of x,y coordinates.
x = xy(:, 2); % Columns.
y = xy(:, 1); % Rows.
subplot(2, 3, 1); % Plot over original image.
hold on; % Don't blow away the image.
plot(x, y, 'LineWidth', 2);
% Burn line into image by setting it to 255 wherever the mask is true.
burnedImage = grayImage;
burnedImage(binaryImage) = 255;
% Display the image with the mask "burned in."
subplot(2, 3, 3);
imshow(burnedImage);
caption = sprintf('New image with\nmask burned into image');
title(caption, 'FontSize', fontSize);
% Mask the image and display it.
% Will keep only the part of the image that's inside the mask, zero outside mask.
blackMaskedImage = grayImage;
blackMaskedImage(~binaryImage) = 0;
subplot(2, 3, 4);
imshow(blackMaskedImage);
title('Masked Outside Region', 'FontSize', fontSize);
% Calculate the mean
meanGL = mean(blackMaskedImage(binaryImage));
% Report results.
message = sprintf('Mean value within drawn area = %.3f\nNumber of pixels = %d\nArea in pixels = %.2f', ...
meanGL, numberOfPixels1, numberOfPixels2);
msgbox(message);
% Now do the same but blacken inside the region.
insideMasked = grayImage;
insideMasked(binaryImage) = 0;
subplot(2, 3, 5);
imshow(insideMasked);
title('Masked Inside Region', 'FontSize', fontSize);
% Now crop the image.
topLine = min(x);
bottomLine = max(x);
leftColumn = min(y);
rightColumn = max(y);
width = bottomLine - topLine + 1;
height = rightColumn - leftColumn + 1;
croppedImage = imcrop(blackMaskedImage, [topLine, leftColumn, width, height]);
% Display cropped image.
subplot(2, 3, 6);
imshow(croppedImage);
title('Cropped Image', 'FontSize', fontSize);
0 comentarios
Jeff E
el 14 de Feb. de 2012
Not sure what the "imageregion tool" is...
Below is some code that will return a list of RGB values if you give it a 24-bit RGB image and a single contiguous mask region. I suspect there is a faster/easier way to do this, but perhaps someone will post a better solution and we will both benefit. :)
function [rgb_index] = im_rgblist(imgin, maskin)
%IM_RGBLIST accepts an RGB image IMGIN, and a binary mask, MASKIN, and
%returns an array containing the RGB pixel values in RGB_INDEX, with each
%row corresponding to a single pixel in double precision.
maskin = uint8(maskin);
pos_stats = regionprops(maskin, 'BoundingBox'); %get stats to crop imgin
small_img = imcrop(imgin, [pos_stats.BoundingBox]); %crop
small_mask = imcrop(maskin, [pos_stats.BoundingBox]); % crop positive mask
pos_index = reshape(small_mask, [], 1);
rgb_t = double(reshape(small_img(:,:,1), [], 1));
rgb_t(~pos_index)= [];
rgb_index = rgb_t;
rgb_t = double(reshape(small_img(:,:,2), [], 1));
rgb_t(~pos_index) = [];
rgb_index(:,2) = rgb_t;
rgb_t = double(reshape(small_img(:,:,3), [], 1));
rgb_t(~pos_index) = [];
rgb_index(:,3) = rgb_t;
end
3 comentarios
Jeff E
el 14 de Feb. de 2012
So, will calling this function once for each region you have, and concatenating the resulting outputs be sufficient?
If not, you can take out the crop steps and use the whole image. I included it because I work with LARGE images, and the indexing took way too long without cropping.
Mythili Sukumaran
el 17 de Oct. de 2012
how to get the orientations of pixels in an image?
3 comentarios
Ade Aulya
el 18 de Ag. de 2018
may i know please. can we do autosave from the image after done with imtool ? how is it if we can ?
Image Analyst
el 18 de Ag. de 2018
I don't know what that means. If you've shutdown imtool(), then what does it have to do with anything anymore? Once you're back in your code running your program, what does it matter what was done before that?
What does "auto" in "autosave" mean to you?
Of course you can save an image by calling the imwrite() function in your program. Not sure if you consider a call to imwrite "auto" or not. Or you can manually save the image by clicking on the disk icon if you have a toolbar on your figure.
Ver también
Categorías
Más información sobre Basic Display en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!