Get pixel values from image patch

17 views (last 30 days)
mk mk
mk mk on 13 Feb 2012
Moved: DGM on 20 Feb 2023
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.

Answers (3)

Image Analyst
Image Analyst on 15 Feb 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);

Jeff E
Jeff E on 14 Feb 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 Comments
mk mk
mk mk on 14 Feb 2012
Moved: DGM on 20 Feb 2023
By the way, thanks for the code Jeff. I am creating the mask by using the commands below:
img = imread('myimg.bmp');
h_im = imshow(img);
e = imrect(gca,POSITION);
BW = createMask(e,h_im);
where POSITION is the rectangle coordinates extracted manually by the imtool, and then pass the BW argument in your code.
Jeff E
Jeff E on 14 Feb 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.

Sign in to comment.


Mythili Sukumaran
Mythili Sukumaran on 17 Oct 2012
how to get the orientations of pixels in an image?
  3 Comments
Ade Aulya
Ade Aulya on 18 Aug 2018
may i know please. can we do autosave from the image after done with imtool ? how is it if we can ?
Image Analyst
Image Analyst on 18 Aug 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.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!