Message Boards Message Boards

0
|
6942 Views
|
9 Replies
|
2 Total Likes
View groups...
Share
Share this post:

Extract/crop people from images?

Posted 5 years ago

Hello,

Hope everyone is doing good and I really need some help with regards to automate the image extraction work.

We usually receive team/group images and the majority of the groups are shot on a natural background. We create the path and do the extraction on images.

The normal time of doing the extraction is around 30 minutes for 15-18 people, which we want to reduce.

Kindly suggest a way to automate or reduce time for such processing.

Thank you.

POSTED BY: Mohd Azim Ansari
9 Replies
Posted 6 months ago

A lake in the picture is considered, which has the largest area

POSTED BY: Erfan Abdi

What do you want it to do when the image has multiple lakes? (possibly many lakes?)

POSTED BY: Arnoud Buzing
Posted 7 months ago

Hello have a good day, I have some satellite images for the lakes. How to extract the shape of the lake with maximum accuracy from the image? enter image description here

enter image description here

enter image description here

POSTED BY: Erfan Abdi

Oh, no! No, we are not talking about OpenCV here! This forum is exclusively about Mathematica (http://www.wolfram.com/mathematica/) and other Wolfram technologies!

POSTED BY: Henrik Schachner

Hello,

Thanks for your reply and I am sorry to ask this silly question but I am new to this forum and really dont know where can I execute these commands in order to get the required results.

I believe you are talking about opencv. Please guide. Thanks.

POSTED BY: Mohd Azim Ansari

This is an interesting problem. I cannot offer a satisfying solution, but maybe it is helpful though. The striking feature of your sample images is that the focus lies on the foreground, while the background - which is to be removed - is unsharp. This is the basis of my approach. So I first tried something using Fouriertransform, but then I discovered that RidgeFilter is doing the job. (For this demo I am working with downsized images. When working on bigger images, probably some parameters need to be adjusted.)

img0 = Import[
   "https://community.wolfram.com/c/message_boards/get_message_\
attachment?messageId=1733676&attachment=adult-bangkok-businessmen-\
1571877.jpg"];

img1c = ImageResize[img0, 1000];
img1g = ColorConvert[img1c, "Grayscale"];
img1gs = Sharpen[img1g];
rfImg = DeleteSmallComponents[Binarize[RidgeFilter[img1gs], .02], 500]

enter image description here

From this - using MorphologicalComponents - it easy to create a "background mask":

morphComp = MorphologicalComponents[ColorNegate@Dilation[rfImg, 1]];
bgNumber = First[Commonest@Flatten[morphComp]];
bgMask = Erosion[ImageApply[If[# == bgNumber, 0, 1] &, Image[morphComp]], 2]

enter image description here

The result is an image with transparent background ...

resultImg = RemoveBackground[bgMask img1c]

enter image description here

... so an arbitrary background can be chosen:

testImg = ExampleData[{"TestImage", "House2"}];
ImageCompose[ImageResize[testImg, ImageDimensions[resultImg]], resultImg]

enter image description here

In case of the first image things do not work that well. But in particular small and critical parts (e.g. the hairs in the wind) can perfectly be separated (using a blue background here as an example):

ImageApply[If[# == {0, 0, 0}, {0, 0, 1}, #] &, rfImg img1c]

enter image description here

Hope that helps a bit, regards -- Henrik

POSTED BY: Henrik Schachner
Posted 5 years ago

Take a look at this post on MSE. I tried it on your images. I had to make them smaller, otherwise Mathematica requires too much memory.

(* Copied from the post *)
net = NetModel["Ademxapp Model A1 Trained on ADE20K Data"];

netevaluate[img_, device_: "CPU"] := 
 Block[{resized, encData, dec, mean, var, prob}, 
  resized = ImageResize[img, {504}];
  encData = Normal@NetExtract[net, "Input"];
  dec = NetExtract[net, "Output"];
  {mean, var} = Lookup[encData, {"MeanImage", "VarianceImage"}];
  prob = NetReplacePart[
     net, {"Input" -> 
       NetEncoder[{"Image", ImageDimensions@resized, 
         "MeanImage" -> mean, "VarianceImage" -> var}], 
      "Output" -> Automatic}][resized, TargetDevice -> device];
  prob = ArrayResample[prob, Append[Reverse@ImageDimensions@img, 150]];
  dec[prob]]

getPeople[i_] := Map[ReplaceAll[{13 -> 1, _ -> 0}], netevaluate[i], {2}] // Image

(* Try it on the sample images *)
smile = Import["~/Downloads/Smiling Face.jpg"];
smallSmile = ImageResize[smile, 1000];
smileMask = getPeople[smallSmile];

ImageMultiply[smileMask, smallSmile]

enter image description here

(* Same for the other image *)

enter image description here

It did not do so well on the second image. One thing you could do is to save the mask. Import the image and mask in Photoshop and manually adjust the mask. That should take less effort compared to starting from scratch.

POSTED BY: Rohit Namjoshi

Thanks for your reply and usually we receive single person and team images and I have attached one example for both.

So team images, I understand time consuming and but atleast if I get 80-90% then rest I will do it manually.

Thanks.

Attachment

Attachment

POSTED BY: Mohd Azim Ansari
Posted 5 years ago

Extracting content from images is very dependent on the nature of the image. Can you provide some sample images?

POSTED BY: Rohit Namjoshi
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract