Como encontrar a similaridade da articulação do eixo y em duas figuras?

6

Eu quero mesclar duas imagens, mas não sei como encontrar o local de corte no eixo y por qualquer ferramenta Linux / Unix, mas aqui ImageMagick como a primeira ideia. Qualquer abordagem é bem-vinda: uma solução programática ou um método para resolver o problema com assistência manual. Duas imagens têm similaridade conjunta no eixo y, que eu quero minimizar e mesclar para saída. Pseudocódigo

  1. Encontre a localização do eixo y onde os dados são iguais pela primeira vez nas duas imagens.
  2. Minimize a igualdade do eixo y de duas imagens, desde que não haja igualdade entre as imagens.
  3. Corte cada foto pelo local apropriado. Para percentagens por percentagens superiores aqui , convert -gravity SouthWest -crop 100x70%x+0+0 infile.jpg outfile.jpg . Para baixo da mesma forma, convert -gravity NorthWest -crop 100x70%x+0+0 infile.jpg outfile.jpg .
  4. Para mesclar partes corretas de duas imagens, etc. ( aqui ) por convert -append A-edit.jpg B-edit.jpg output.png

1 Imagem A, Fig. 2 Imagem B, Fig. 3 Saída esperada

    
por Léo Léopold Hertz 준영 02.04.2017 / 14:06

2 respostas

4

Hugin irá costurar estas imagens para você.

Há um script disponível no tutorial para costurar imagens digitalizadas chamado run-scan-pto_var.sh que fará exatamente o que você precisa.

No meu sistema Debian eu preciso instalar dois pacotes (e, claro, suas dependências):

apt-get install hugin hugin-tools

No interesse de concluir a questão, incluí uma versão ligeiramente modificada aqui (essa versão aceita nomes de arquivos de imagem na linha de comando, em vez de serem codificados):

#! /bin/sh
# hugin command tools script to stitch scanned images, fov unknown
# use of fov >= 10 should be OK, could simply set FOV=10
# Terry Duell 2013, 2014

# usage...run-scan-pto_var.sh outputprefix fov

#get the output file prefix
Prefix=$1

# get the fov
FOV=$2

shift 2

pto_gen --projection=0 --fov=$FOV -o project.pto "$@"
pto_lensstack -o project1.pto --new-lens i1 project.pto
cpfind -o project1.pto --multirow project1.pto
cpclean -o project2.pto project1.pto
linefind -o project3.pto project2.pto
pto_var -o setoptim.pto --opt r,d,e,!r0,!d0,!e0 project3.pto
autooptimiser -n -o autoptim.pto setoptim.pto
pano_modify  --projection=0 --fov=AUTO --center --canvas=AUTO --crop=AUTO -o autoptim2.pto autoptim.pto
pto2mk -o project.mk -p $Prefix autoptim2.pto
make -j 2 -f project.mk all

# Clean up afterwards
rm -f project.pto project1.pto project2.pto project2.pto project.mk
rm -f "$Prefix"[0-9][0-9][0-9][0-9].tif
rm -f autoptim.pto autoptim2.pto autoptim2.pto_rsp.arg
rm -f setoptim.pto

Se as suas imagens forem chamadas wIowW.jpg e orMDp.jpg - como as suas são nomeadas - e você quiser o resultado em rsp.tif , poderá executar o script assim:

./run-scan-pto_var.sh rsp 10 *.jpg

A saída é sempre gravada em um arquivo TIFF. No entanto, este formato é trivialmente convertível para praticamente qualquer outro formato de imagem.

O resultado?

    
por 17.04.2017 / 09:26
3

Script editado e atualizado:

Esta solução é baseada nas imagens originais. Ele mesclará duas imagens de qualquer altura, mas a largura das duas imagens de entrada deverá corresponder.

Você chamaria esse script assim:

sh ./name-of-script topImg.jpg bottomImg.jpg

As duas imagens de entrada são verificadas para uma seção cruzada que corresponda. Se esta correspondência não for encontrada, o script sairá.

Apenas o ImageMagick é necessário para que isso funcione.

#!/bin/sh
#
# Assume (based on the test images) that the input images are "part of" a
# single image. If not, this will not work :] 
#

# Compare threshold - a value from 0 (100% match) to 100 (nothing alike).
# A low value is a good idea
THRESHOLD=5

# We assume at least 10 pixels overlap
PX=10

# Keep track of the best overlap height
PX_BEST=0

# The overlap diff must be as close to 0 as possible
PX_DIFF=100

# And keep track of the best result so far.
PX_DIFF_BEST=100

# The list of temp files created.
fileList="check1.png check2.png crop2.png"

usage () {
    echo "
Usages:
 ${0##*/} imgTop imgBot

 imgTop: The 'top' image. Height of imgTop does not matter but the 
         width must match the width of the second image.

 imgBot: The 'bottom' image. Same rules as 'imgTop'.

Output will be single image with a file name like:

 imgTop-imgBot-widthxheight.jpg
"
    exit
}

# Check a PX overlap value for a match
checkOverlap () {
    # Cut the overlap amount from the bottom of the top image.
    convert -gravity SouthWest -crop ${W1}x${PX}+0+0 "${1}" +repage check1.png
    # And the top of the bottom image
    convert -gravity NorthWest -crop ${W2}x${PX}+0+0 "${2}" +repage check2.png
    # Compare the two overlap sections
    PX_DIFF='convert check1.png check2.png -compose Difference -composite -colorspace gray -format '%[fx:mean*100]' info:'
}
# We have a PX_BEST which is the size of the overlap, so crop
# this from top and bottom, then join
cropAndJoin () {
    # Crop the overlap from the bottom image
    H2Crop=$(($H2 - $PX_BEST))
    convert -gravity SouthWest -crop ${W2}x${H2Crop}+0+0 "${2}" +repage crop2.png
    # Join the original top with the cropped bottom
    convert -append "${1}" crop2.png merged.png
    echo ""
}

# clean up the temp images and rename the result.
cleanUp () {
    # Get the name of the orginal images
    tmp1=${1##*/}
    tmp2=${2##*/}
    # remove the file extensions
    tmp1=${tmp1%\.*}
    tmp2=${tmp2%\.*}
    # get the file path for the first image (assume second image is here too)
    tmpPath=${1%/*}
    if [ "$tmpPath" = "$1" ]
    then
        tmpPath="."
    fi
    # the name of the new, merged image
    H='identify -format '%h' "merged.png"'
    merged="${tmpPath}/${tmp1}-${tmp2}-${W1}x${H}.png"
    # Remove the temp files
    for x in $fileList
    do
        if [ -f "${x}" ]
        then
            rm -f "${x}"
        fi
    done
    if [ -f "merged.png" ]
    then
        mv -f "merged.png" "${merged}"
        echo "
Merged file can be found here:
 ${merged}
"
    else
        echo "
Something went wrong. Maybe the images where not a match?
"
    fi
}

# Basic checks
if [ "$2" = "" ]
then
    usage
fi
if [ ! -f "$1" -o ! -f "$2" ]
then
    usage
fi

# The width and height of the images
W1='identify -format '%w' "${1}"'
W2='identify -format '%w' "${2}"'

# The width of the two images must match
if [ $W1 -ne $W2 ]
then
    echo "
Images are not the same width.
"
    exit
fi

# Need to know the height of the images too.
H1='identify -format '%h' "${1}"'
H2='identify -format '%h' "${2}"'

# Max height is need to make sure the loop does not go on forever
MAX=$H1

if [ $H1 -gt $H2 ]
then
    MAX=$H2
fi

echo -n "
Looking for a match point "

while [ $PX -lt $MAX ]
do
    echo -n "."
    checkOverlap "${1}" "${2}"
    if [ "$PX_DIFF" != "0" ]
    then
        PX_DIFF=${PX_DIFF%%.*}
    fi
    if [ $PX_DIFF -lt $PX_DIFF_BEST ]
    then
        PX_DIFF_BEST=$PX_DIFF
        PX_BEST=$PX
    fi
    # Check for a perfect match
    if [ $PX_DIFF -eq 0 ]
    then
        PX=$MAX
    else
        PX=$(($PX + 1))
    fi
done

# Check we have a good match, if not tell them.
if [ $PX_DIFF_BEST -gt $THRESHOLD ]
then
    echo "
Unable to find a good match point between the two images.

No merge performed.
"
    exit
fi

# We can assume a good match, try to merge the images.
cropAndJoin "${1}" "${2}"

cleanUp "${1}" "${2}"

echo "Done."
exit
    
por 17.04.2017 / 11:52