How to find pixel in one square block?

Hello,
I have an Image called checkerboard, now i know the size of one square block is 34 x 34 mm. how can i find that in that one square block 34mm has how many pixel?
is there any formula to find or function?
Thank you in advance.

 Accepted Answer

Try this. You'll find meanArea = 102.3 pixels.
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 = 22;
%--------------------------------------------------------------------------------------------------------
% READ IN IMAGE
folder = pwd;
baseFileName = 'checkerboard.jpg';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% The file doesn't exist -- didn't find it there in that folder.
% Check the entire search path (other folders) for the file by stripping off the folder.
fullFileNameOnSearchPath = baseFileName; % No path this time.
if ~exist(fullFileNameOnSearchPath, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image.
% numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
[rows, columns, numberOfColorChannels] = size(grayImage);
if numberOfColorChannels > 1
% It's not really gray scale like we expected - it's color.
% Use weighted sum of ALL channels to create a gray scale image.
grayImage = rgb2gray(grayImage);
% ALTERNATE METHOD: Convert it to gray scale by taking only the green channel,
% which in a typical snapshot will be the least noisy channel.
% grayImage = grayImage(:, :, 2); % Take green channel.
end
% Display the image.
subplot(2, 2, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize, 'Interpreter', 'None');
impixelinfo;
hFig = gcf;
hFig.WindowState = 'maximized'; % May not work in earlier versions of MATLAB.
drawnow;
% Display histogram
subplot(2, 2, 2);
imhist(grayImage);
grid on;
title('Histogram of original gray image', 'FontSize', fontSize);
%--------------------------------------------------------------------------------------------------------
% SEGMENTATION OF IMAGE
binaryImage = grayImage < 40;
% Display the image.
subplot(2, 2, 3);
imshow(binaryImage, []);
title('Binary Image', 'FontSize', fontSize, 'Interpreter', 'None');
impixelinfo;
% Measure areas
labeledImage = bwlabel(binaryImage, 4);
props = regionprops(labeledImage, 'Area', 'BoundingBox');
allAreas = [props.Area]
bb = vertcat(props.BoundingBox);
widths = bb(:, 3);
heights = bb(:, 4);
aspectRatios = widths ./ heights
keepers = find(allAreas' > 80 & aspectRatios > 0.8 & aspectRatios < 1.3);
% Get new image with just the squares.
binaryImage = ismember(labeledImage, keepers);
% Display the image.
subplot(2, 2, 4);
imshow(binaryImage, []);
title('New Binary Image', 'FontSize', fontSize, 'Interpreter', 'None');
impixelinfo;
% Measure areas of only hte "good" blobs.
labeledImage = bwlabel(binaryImage, 4);
props = regionprops(labeledImage, 'Area', 'BoundingBox');
allAreas = [props.Area]
meanArea = mean(allAreas)

13 Comments

Hi Image Analyst,
Thank you so much for your help. I want to just ask you that, is it measure the number of pixel of one square block?
so it will measure all the pixel in every square block then it will take average of it and at the end we found that in one square block we have average 102.3 pixels. is it correct?
Correct. allAreas is the area of every black square, and meanArea is the average of all those.
DO NOT use jpg images for image analysis. Your borders were gray and fuzzy/blurry probably because you saved it as jpg. That affected the area by a lot depending on if the border of the square was above or below the threshold. If you can, save your images in a lossless format like PNG, TIFF, or BMP.
Prashant
Prashant on 17 Aug 2020
Edited: Prashant on 17 Aug 2020
Thank you so much. I will not use now JPG format, thanks for the info.
One more question is that i used your spatialcalibration_demo.m and i wanted to see that how many pixels i am getting from one square block and i found that the number of pixels in one square block was 10.89 pixels. I used your code as follows:
1. I know the square block size, real world distance was 34 x 34 mm
2. then i drew the line of that one block and they show me that i have 10.89 pixels in one block so we have 10.89 pixels = 34 mm.
in this present code, we are finding 102.3 pixels , so just wanted to konw that why this difference we got?
here is my code for spatial_calibration and also one screenshot as below:
You should always use the largest distance possible. So don't look at each square, like you asked, but at the distance of the entire bounding box of all the squares. So the distance should be 17*10 pixels or 170 pixels. The distance would be 17*34 = 578 mm. You can more accurately draw 170 pixels than 10 pixels.
Anyway, 102.3 pixels is the AREA of the black squares, not the side length. The side length would be sqrt(102.3) which is 10.11, which is a fraction of a pixel different than your 10.89, which is pretty good considering that you manually drew a line onto a blurry image.
Perfect!! you said it correctly. so the formula should be
% Measure areas of only hte "good" blobs.
labeledImage = bwlabel(binaryImage, 4);
props = regionprops(labeledImage, 'Area', 'BoundingBox');
allAreas = [props.Area]
meanArea = mean(allAreas)
%so the side length will be write like this?
distanceinpixel = sqrt(meanArea)
Yes, but again, I say that's not the right way to do it. You should call bwconvhull(mask, 'union') to get the convex hull of everything rather than just do it on the average of dozens of imprecise little squares. Do you know how to do that?
no i do not know :\
could you show me please.
Prashant
Prashant on 18 Aug 2020
Edited: Prashant on 18 Aug 2020
hi Image analyst,
could you please show me again bwconvhull(mask, 'union') how to do this code in my case?
and what is the function of this code? is it detect the boundary of the square box or ?
Try this:
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 = 22;
%--------------------------------------------------------------------------------------------------------
% READ IN IMAGE
folder = pwd;
baseFileName = 'checkerboard.jpg';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% The file doesn't exist -- didn't find it there in that folder.
% Check the entire search path (other folders) for the file by stripping off the folder.
fullFileNameOnSearchPath = baseFileName; % No path this time.
if ~exist(fullFileNameOnSearchPath, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image.
% numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
[rows, columns, numberOfColorChannels] = size(grayImage);
if numberOfColorChannels > 1
% It's not really gray scale like we expected - it's color.
% Use weighted sum of ALL channels to create a gray scale image.
grayImage = rgb2gray(grayImage);
% ALTERNATE METHOD: Convert it to gray scale by taking only the green channel,
% which in a typical snapshot will be the least noisy channel.
% grayImage = grayImage(:, :, 2); % Take green channel.
end
% Display the image.
subplot(2, 2, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize, 'Interpreter', 'None');
impixelinfo;
hFig = gcf;
hFig.WindowState = 'maximized'; % May not work in earlier versions of MATLAB.
drawnow;
% Display histogram
subplot(2, 2, 2);
imhist(grayImage);
grid on;
title('Histogram of original gray image', 'FontSize', fontSize);
%--------------------------------------------------------------------------------------------------------
% SEGMENTATION OF IMAGE
binaryImage = grayImage < 40;
% Display the image.
subplot(2, 2, 3);
imshow(binaryImage, []);
title('Binary Image', 'FontSize', fontSize, 'Interpreter', 'None');
impixelinfo;
% Measure areas
labeledImage = bwlabel(binaryImage, 4);
props = regionprops(labeledImage, 'Area', 'BoundingBox');
allAreas = [props.Area]
bb = vertcat(props.BoundingBox);
widths = bb(:, 3);
heights = bb(:, 4);
aspectRatios = widths ./ heights
keepers = find(allAreas' > 80 & aspectRatios > 0.8 & aspectRatios < 1.3);
% Get new image with just the squares.
binaryImage = ismember(labeledImage, keepers);
% Get the convex hull of them
binaryImage = bwconvhull(binaryImage, 'union');
% Display the image.
subplot(2, 2, 4);
imshow(binaryImage, []);
title('New Binary Image', 'FontSize', fontSize, 'Interpreter', 'None');
impixelinfo;
% Measure areas of only the "good" blobs.
labeledImage = bwlabel(binaryImage, 4);
props = regionprops(labeledImage, 'Area');
areaInPixels = props.Area
% There are 17 * 19 squares, each with a width of 34 mm. So the area is
areaInMm = 17 * 19 * 34^2
% Compute the linear spatial calibration factor:
mmPerPixel = sqrt(areaInMm / areaInPixels);
message = sprintf('You have %.3f mm per pixel.', mmPerPixel);
fprintf('%s\n', message);
uiwait(helpdlg(message));
You get
areaInPixels =
40946
areaInMm =
373388
You have 3.020 mm per pixel.
Thank you so much Image Analyst.. I will go with this code and i will not use only one square block for finding the number of pixel. I believe in you and i will do as you said. saying thanks to you is really not enough, you are really a wise and intelligent person. I wish, in the future i will be like you. :)
You are my best teacher and good advisor.
Prashant
Prashant on 19 Aug 2020
Edited: Prashant on 19 Aug 2020
so now i know the value of pixels in 3.020 mm. with this value how can i find 34 mm has how many pixels?
Just invert it and multiply by 34, but it really shouldn't even be necessary since we're not ever going to use that information, remember?
% Pixels = mm * pixels/mm
mmPerPixel = sqrt(areaInMm / areaInPixels);
pixelsPerMm = 1 / mmPerPixel; % or sqrt(areaInPixels / areaInMm)
pixelDistance34 = 34 * pixelsPerMm % Number of pixels across a 34 mm span.
ja correct, you right. I just asked you to know only. :)

Sign in to comment.

More Answers (1)

Use bwconncomp with connection 4. Pass the result to regionprops asking for BoundingBox . You will get a struct array returned. You can put them together into one array using vertcat(). Now you can use median() on the 3rd and 4th columns to find out what the median box size is in pixels. Then knowing that represents 34 mm of physical space, you can calculate the image resolution.

2 Comments

Hi walter,
thank you for your quick response. Could you please show me how to write this code because i am new with matlab and would be great for me to make one example or write one code for me.
I have attached my picture, please have a look.
Hi walter,
I have written this code please have a look. and please correct for me some problem here.
bcs with this code i am getting center to center distance but i want from corner to corner of one block. how can i find this?
here is the code:
fontSize = 13;
numImages = 20;
files = cell(1, numImages);
for i = 1:numImages
files{i} = fullfile('S:\EE_Elektrik_Elektronik\Licht_Sicht_Stud\1000_Studenten\Khandelwal\Masterarbeit\MATLAB\Image_processing\Calibration\10m\10m\Image_neue', sprintf('IMG_%d.JPG', i));
end
% Display one of the calibration images
magnification = 20;
I = imread(files{1});
imshow(I) % a1=original image (unprocessed)
a1G=mat2gray(I);
a1GCT=graythresh(a1G);
a1B=im2bw(a1G,a1GCT);
a1C=imcrop(a1B);
a1RP=regionprops(a1C,'Centroid','MajorAxisLength',...
'MinorAxisLength','Orientation', 'Eccentricity');
CentroidS=cat(1,a1RP.Centroid);
x = CentroidS(:,1);
y = CentroidS(:,2);
figure
imshow(a1C)
hold on
plot(x,y,'b*')
w = msgbox('Pick 2 points');
waitfor(w)
while 1
xy = ginput(2); % get coordinates of mouse clicks
% find 2 closes points
[~,ind] = pdist2([x y],xy,'euclidean','Smallest',1);
x1 = x(ind);
y1 = y(ind);
plot(x1,y1,'o-r') % plot closes points
d = pdist([x1 y1]); % distance between points
t = text(mean(x1),mean(y1),num2str(d));
set(t,'Color','Yellow','BackgroundColor','Black');
w = waitforbuttonpress; % mouse click - conntinue, button - quit
disp('press anything to quit')
if w % if button was pressed - quit
break
end
end

Sign in to comment.

Categories

Find more on Deep Learning Toolbox in Help Center and File Exchange

Asked:

on 16 Aug 2020

Commented:

on 19 Aug 2020

Community Treasure Hunt

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

Start Hunting!