Algorithm to detect overlapping rows of two images

后端 未结 5 1995
借酒劲吻你
借酒劲吻你 2020-12-14 13:28

Let\'s say I have 2 images A and B as below.

\"enter

Notice that the bottom of

5条回答
  •  执念已碎
    2020-12-14 13:56

    I had a little play at doing this with ImageMagick. Here is the animation of what I did, and the explanation and code follow.

    enter image description here

    First I grabbed a couple of StackOverflow pages, using webkit2png, calling them a.png and b.png.

    Then I cropped a rectangle out of the top-left of b.png and a column the same width, but the full height out of a.png

    That gave me this:

    enter image description here

    and this

    enter image description here

    I now overlay the smaller rectangle from the second page onto the bottom of the strip from the first page. I then calculate the difference between the two images by subtracting one from the other and note that when the difference is zero, the pictures must be the same, and the output image will be black, so I have found the point at which they overlap.

    Here is the code:

    #!/bin/bash
    # Grab page 2 as "A" and page 3 as "B"
    # webkit2png -F -o A http://stackoverflow.com/questions?page=2&sort=newest
    # webkit2png -F -o B http://stackoverflow.com/questions?page=3&sort=newest
    
    BLOBH=256  # blob height
    BLOBW=256  # blob width
    
    # Get height of x.png
    XHEIGHT=$(identify -format "%h" x.png)
    
    # Crop a column 256 pixels out of a.png that doesn't contain adverts or junk, into x.png
    convert a.png -crop ${BLOBW}x+0+0 x.png
    
    # Crop a rectangle 256x256 pixels out of top left corner of b.png, into y.png
    convert b.png -crop ${BLOBW}x${BLOBH}+0+0 y.png
    
    # Now slide y.png up across x.png, starting at the bottom of x.png
    # ... differencing the two images as we go
    # ... stop when the difference is nothing, i.e. they are the same and difference is black image
    lines=0
    while :; do
       OFFSET=$((XHEIGHT-BLOBH-1-lines))
       if [ $OFFSET -lt 0 ]; then exit; fi
       FN=$(printf "out-%04d.png" $lines)
       diff=$(convert x.png -crop ${BLOBW}x${BLOBH}+0+${OFFSET} +repage \
               y.png \
               -fuzz 5% -compose difference -composite +write $FN \
               \( +clone -evaluate set 0 \) -metric AE -compare -format "%[distortion]" info:)
       echo $diff:$lines
       ((lines++))
    done
    n=$((BLOBH+lines))
    

提交回复
热议问题