Splitting a binary image into 2 parts
Show older comments
HI everybody! I have a binary image matrix uploaded as A.mat:

White pixels correspond to 1, black regions correspond to 0. I would like to split the curve into left and right parts, something like the following:
and
Initially, I thought of finding the indices of midponts of elements having 1 at their positions, at each row. Using the indices, I can substitute ones on the left (and right) of the midpoints (at each row) using relational operators. Maybe there might be a better way to do this, but this method comes to my mind right now.
So I start from the bottommost row, and I keep on moving upwards. As evident from the A.mat figure (first figure), a row can have more than 2 cells having values one. To choose the appropriate cells for calculating midpoints at row "r", I compare the number of elements having one on left and right side of midpoint at row "r+1". I am attaching the code below:
clc;
clearvars;
load('A.mat');
[m,n] = size(A);
midpoint = zeros(m,n);
midpt_idx = zeros(m,1);
%%
A_sep = A;
for r = m:-1:1
k = find(A(r,:));
if size(k,2)==2
midpt_idx(r) = ceil((k(1)+k(2))*0.5);
elseif sum(A(r,1:midpt_idx(r+1))) < sum(A(r,midpt_idx(r+1)+1:end))
midpt_idx(r) = ceil((k(1)+k(2))/2);
elseif sum(A(r,1:midpt_idx(r+1))) > sum(A(r,midpt_idx(r+1)+1:end))
midpt_idx(r) = ceil((k(end-1)+k(end))/2);
elseif sum(A(r,1:midpt_idx(r+1))) == sum(A(r,midpt_idx(r+1)+1:end))
midpt_idx(r) = ceil((k(size(k,2)/2)+k((size(k,2)/2)+1))*0.5);
end
A_sep(r,midpt_idx(r)) = 2; % Midpoints have value 2 in their cells, I change this to 1 for checking solution by using imshow(A_sep)
end
An error is dispayed when execution comes at row 64. There is only one cell having 1 in row 64. For now, this error can be ignored (I think!).
This code runs correctly for some parts, but fails at other parts:

If you run the code along with A.mat file, starting from row 416, it gives correct results till row 278. At row 277, the code fails because there are a larger number of points adjacent to each other on right side, compared to left side of the midpoint index at row 279.
So, basically my method fails in these situations. Can you please help me with this? Maybe an advice for my code, or some other method which is better than what I am doing right now.
Thanks!
Accepted Answer
More Answers (1)
Image Analyst
on 19 Sep 2020
0 votes
Why not simply scan your image column by column with find() finding the topmost and bottommost row?
11 Comments
Ankit Sahay
on 19 Sep 2020
Image Analyst
on 19 Sep 2020
Let's say your blob looks like a capital J. Where would you want the boundary to start?
Ankit Sahay
on 19 Sep 2020
Edited: Ankit Sahay
on 19 Sep 2020
Image Analyst
on 19 Sep 2020
What is they are in different segments, like a U? Start at the middle of the left most segment in the top row?
Why do you want this anyway? What does it matter? And how did you get the edge image in the first place? I'm wondering if we even need it. Lots of people call edge() when there is no reason to and they could segment the blob perfectly well, and better, using thresholding. Then if they need the oundary, they can use bwboundary. Using edge() causes lots of problems, like disconnected edges and then you'll have to do "edge linking" if you want a closed figure (demo attached).
Let's assume you could split this into upper/lower or left/right parts. What would you then do next with that information?
Ankit Sahay
on 19 Sep 2020
Ankit Sahay
on 19 Sep 2020
Image Analyst
on 19 Sep 2020
Again, Matt and I need to see your original gray scale image of your flame front to see if an edge detection is even the right approach.
Ankit Sahay
on 20 Sep 2020
Image Analyst
on 20 Sep 2020
No it doesn't. It's not a complete program. It gives this:
>> flame_edge_code
Unrecognized function or variable 'fb2'.
Error in flame_edge_code (line 2)
fb2_l = fb2(:,1:end/2);
Please delay us (and you) no longer and give us a program that runs.
Ankit Sahay
on 20 Sep 2020
Categories
Find more on Image Arithmetic in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!






