Find the median row of a binary column and replace the column with just the median row

2 visualizaciones (últimos 30 días)
I have some binary columns with ones and zeros. I would like to replace the places where there are multiple rows of ones with just one one in the median row index. I would like to do this for every column. For example:
1 0 1 1
1 0 1 1
1 1 1 0
0 1 1 0
0 1 0 0
becomes
0 0 0 1
1 0 1 0
0 0 0 0
0 1 0 0
0 0 0 0
The ones represent a curved y plot graph, that I would like to reduce down to a one pixel width (i.e. 1 y pixel per x value).
line.PNG
Thanks for any advice!
Chees

Respuesta aceptada

mackhina
mackhina el 27 de Dic. de 2019
Got it. Not the most elegant solution, but it works. Thanks for the tips!
size_image = size(image)
filt_image = zeros(size_image)
for j = 1:size_image(2)
[rows, columns] = find((image(:,j)) > 0);
row_index = round(mean(rows));
filt_image(:,j) = image(:,j);
filt_image(:,j) = 0;
filt_image(row_index,j) = 1;
end

Más respuestas (3)

Image Analyst
Image Analyst el 26 de Dic. de 2019
Try bwmorph():
skeletonImage = bwmorph(binaryImage, 'skel', inf);
  1 comentario
mackhina
mackhina el 27 de Dic. de 2019
This reduces the line down nearly all the way, but there are lots of instances where I will have multiple y values for a single value of x.
errors.png

Iniciar sesión para comentar.


Image Analyst
Image Analyst el 27 de Dic. de 2019
Yes of course. Not every stretch will be a horizontal or diagonal stretch.

Andrei Bobrov
Andrei Bobrov el 27 de Dic. de 2019
I = imread('line.png');
bw = im2double(rgb2gray(I));
[i,j] = find(bw);
[n,g] = findgroups(j);
idx = floor(splitapply(@median,i,n));
[k,l] = size(bw);
out = zeros([k,l]);
out(sub2ind([k,l],idx,g)) = 1;

Productos


Versión

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by