how to segment hand from an image with non uniform lighting?
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
H
el 12 de Jul. de 2014
Comentada: Image Analyst
el 14 de Nov. de 2020
I'm trying to segment the hand from the image but due to the non uniform lighting the result come out like this
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/165617/image.png)
the result in uniform lighting
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/165619/image.png)
how to solve this problem?
0 comentarios
Respuesta aceptada
Image Analyst
el 12 de Jul. de 2014
Just fix the lighting - it's so simple! It's almost always easier to prevent the problem than to fix it with software and that is definitely the case here.
If you don't want to get the job done in the most sensible, easy, straightforward, and best way (by fixing the illumination), then there are more complicated ways that you can do it, but you have to make some assumptions, like on the size of the hand, or its color, or on the smoothness of the background, or things like that. Some fix you make for one situation might not work for another. Like if you have that picture and then another where the hand is in front of a flesh colored screen, or a screen with a paisley background - those may all take different algorithms.
For what it's worth, I attach a background correction demo.
4 comentarios
Image Analyst
el 14 de Jul. de 2014
If you know your background is always neutral colored and your hands are not, then you can convert to hsv color space and threshold for reddish pixels. See my demo : http://www.mathworks.com/matlabcentral/fileexchange/28512-simple-color-detection-by-hue
Más respuestas (3)
Laila Kazemi
el 12 de Jul. de 2014
You need adaptive threshold since the background changes. I have not yet found a good code in matlab for this. you might have to find your own algorithm and code it.
Prasad Kalane
el 14 de Jul. de 2014
% Do some image illumination correction.
background = imopen(I,strel('disk',15));
I = I - backgroundbackground
I = imadjust(I);
% level = graythresh(I);
bw = im2bw(I,0.3*level);
0 comentarios
Milion Negewo
el 14 de Nov. de 2020
background = imopen(I,strel('disk',15));
I = I - backgroundbackground
I = imadjust(I);
% level = graythresh(I);
bw = im2bw(I,0.3*level);
1 comentario
Image Analyst
el 14 de Nov. de 2020
Here is your algorithm:
I = imread('hands.png');
% Display original image.
subplot(2, 3, 1);
imshow(I);
title('Original Image');
% Convert to gray scale so we can call imopen().
I = rgb2gray(I);
% Display original image.
subplot(2, 3, 2);
imshow(I);
title('Gray Scale Image');
background = imopen(I, strel('disk',15));
% Display image.
subplot(2, 3, 3);
imshow(background);
title('Background Image');
I = mat2gray(double(I) - double(background));
I = imadjust(I);
% Display image.
subplot(2, 3, 4);
imshow(I);
title('Background Subtracted Image');
level = graythresh(I);
bw = im2bw(I, 0.3*level);
% Display image.
subplot(2, 3, 5:6);
imshow(bw);
title('Final Binary Image');
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/414138/image.png)
The final image doesn't look so good. I think you need to work on it some more.
Ver también
Categorías
Más información sobre Image Segmentation and Analysis en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!