How to draw a inclined line which can separate image in percent of white pixels

4 Ansichten (letzte 30 Tage)
I want draw a line which seperate the image white and black pixel areas as shown in the picture. I want to keep first point fixed and move the second point in X direction so that I can adjust the percent of white pixels on either sides. I used attahced code with polyfix function (to fix the point 1) to draw line but the problem with this code is that "it's not seperating picture based on percentage that mentioned in the picture". Is there any possibility to include these percentages in the code. Thanks in advance

Akzeptierte Antwort

Image Analyst
Image Analyst am 17 Jan. 2022
OK, since you were not supplying the binary image, I made one from the picture you posted. Try this:
% 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 = 18;
mask = imread('spray.png') > 128;
imshow(mask);
hold on;
axis('on', 'image')
% Define where you want the starting column to be:
% at column %1, or the last column on row 1 that is white.
startingColumn = 1;
startingColumn = find(mask(1, :), 1, 'last')
% Get the number of white pixels in the image
numWhitePixelsEntireImage = nnz(mask)
[rows, columns] = size(mask);
% Run along the bottom row getting a quadrilateral mask.
for col = columns : -1 : 1
fprintf('Col = %d. \t', col)
hLine = line([startingColumn, col], [1, rows], 'Color', 'r', 'LineWidth', 2);
% Make a mask
x = [startingColumn, columns, columns, col];
y = [1, 1, rows, rows];
hPlot = plot(x, y, 'y-', 'LineWidth', 4);
thisMask = poly2mask(x, y, rows, columns);
% And it with the image
thisMask = mask & thisMask;
% Count the number of pixels in the upper right quadrilateral.
% We're looking for the number in that quadrilateral to be 5% of the total.
numWhite = nnz(thisMask);
pctWhite = 100 * numWhite / numWhitePixelsEntireImage;
fprintf(' Number of white pixels = %d pixels = %.3f %% of %d.\n', numWhite, pctWhite, numWhitePixelsEntireImage)
if pctWhite > 5.0
% Now we have 5% in the upper right quadrilateral so we can quit.
% Go back a column to where it was less than the threshold.
col = col + 1;
delete(hLine);
break;
end
% Delete old graphics.
delete(hPlot);
delete(hLine);
end
delete(hLine);
line([startingColumn, col], [1, rows], 'Color', 'r', 'LineWidth', 2);
  3 Kommentare
Image Analyst
Image Analyst am 18 Jan. 2022
OK, but starting with your binary image, which is where my code starts, does my code work with your binary image?
Rohit Thokala
Rohit Thokala am 18 Jan. 2022
Yes sir, it's working even on the binary image. Thank you for your help

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Image Analyst
Image Analyst am 17 Jan. 2022
Bearbeitet: Image Analyst am 17 Jan. 2022
That image is no good. You attached a screenshot with a huge white frame around it instead of the actual image.
[EDIT] OK after your edit, you attached the original image, but not the background image "Water_T_140_t_inj_15_P_05_M30001.tif" so there is no way we can run your code to get the actual binary image. Please attach it.
So I'll tell you how I'd do it
% Get the number of white pixels in the image
numWhitePixelsEntireImage = nnz(mask);
[rows, columns] = size(mask);
% Run along the bottom row getting a quadrilateral mask.
for col = columns : -1 : 1
% Make a mask
x = [1, columns, columns, col];
y = [1, 1, rows, rows];
thisMask = poly2mask(x, y, rows, columns);
% And it with the image
thisMask = mask & thisMask;
% Count the number of pixels in the upper right quadrilateral.
% We're looking for the number in that quadrilateral to be 5% of the total.
numWhite = nnz(thisMask);
if numWhite / numWhitePixelsEntireImage > numWhitePixelsEntireImage * 0.05
% Now we have 5% in the upper right quadrilateral so we can quit.
% Go back a column to where it was less than the threshold.
col = col + 1;
break;
end
end
Now you know the column number where it broke so you're done. You can draw a line if you want at the final dividing line.
line([1, col], [1, rows], 'Color', 'r', 'LineWidth', 2);

Produkte


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by