Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I replace the white rectangle within an image using ImageMagick?

Overview:

The first picture is my original image. Here I want to replace the white rectangle shown with another image.

enter image description here

My approach:

I have created a mask image using floodfill and it looks as:

enter image description here

Problem:

Now I would like to get the distance or co-ordinates of the rectangle in the second image so that I can use those co-ordinates to overlay a new image on top of the first (original image) here.

I got a little idea to use ImageMagick's chebyshev morphology operator, but don't know how I can do that.

like image 335
Kiran Dash Avatar asked Jun 22 '15 06:06

Kiran Dash


1 Answers

I think you can locate the shape pretty accurately with a simple threshold, like this:

convert image.jpg -threshold 90% result.jpg

enter image description here

and you can then do a Canny edge detection like this:

convert image.jpg -threshold 90% -canny 0x1+10%+30% result.jpg

enter image description here

The next things I would be looking at are, using the -trim function to find the trim box coordinates, like this:

convert result.jpg -format "%@" info:
320x248+152+40

I have marked that on in red below.

enter image description here

If you actually want to do the trim, use this:

convert result.jpg -trim result.jpg

enter image description here

And also, the deskew angle

convert result.jpg -deskew 40 -format "%[deskew:angle]" info:
-0.111906

A Hough line detection may also be effective for you like this:

convert image.jpg -threshold 90% -canny 0x1+10%+30%      \
    \( +clone -background none                           \
              -fill red -stroke red -strokewidth 2       \
              -hough-lines 5x5+80 -write lines.mvg       \
    \) -composite hough.png

enter image description here

And the file lines.mvg contains the 4 lines you are looking for

# Hough line transform: 5x5+80
viewbox 0 0 640 360
line 449.259,0 474.432,360  # 90
line 0,72.5604 640,27.8072  # 143
line 0,293.098 640,248.344  # 187
line 153.538,0 178.712,360  # 153

Being a bit lazy, I didn't feel like solving for the intersections of those lines, so I thought I'd let ImageMagick do that too - by using Morphology to look for Line Junctions like this:

convert image.jpg -threshold 90% -canny 0x1+10%+30%                        \
  \( +clone -background none -fill red -stroke red -hough-lines 5x5+80 \)  \ 
     -composite -fuzz 50% -fill black -opaque white                        \
     -morphology HMT LineJunctions hough.png

enter image description here

like image 140
Mark Setchell Avatar answered Oct 06 '22 03:10

Mark Setchell