두 개의 그림을 병합하고 싶지만 Linux/Unix 도구로 y축의 클리핑 위치를 찾는 방법을 모르지만 여기에서는이미지 마술사첫 번째 생각으로. 어떤 접근 방식이든 환영합니다. 문제 해결을 위한 프로그래밍 방식 솔루션이나 수동 지원이 가능합니다. 두 그림의 y축에는 결합 유사성이 있으므로 이를 최소화한 다음 병합하여 출력하려고 합니다. 의사코드
- 두 그림의 데이터가 처음으로 동일한 y축 위치를 찾습니다.
- 두 그림이 서로 같지 않을 때마다 두 그림의 y축 동일성을 최소화합니다.
- 각 그림을 적절한 위치로 자릅니다. 백분율 기준 상위여기,
convert -gravity SouthWest -crop 100x70%x+0+0 infile.jpg outfile.jpg
.하단과 유사,convert -gravity NorthWest -crop 100x70%x+0+0 infile.jpg outfile.jpg
. - 두 이미지 등의 올바른 부분을 병합합니다(여기) 통과
convert -append A-edit.jpg B-edit.jpg output.png
그림 1 이미지 A, 그림 2 이미지 B, 그림 3 예상 출력
답변1
Hugin이 이러한 이미지를 연결해 드립니다.
사용할 수 있는 스크립트가 있습니다.스캔한 이미지 연결 튜토리얼라고pto_var.sh 스캔 실행이것은 귀하의 요구에 정확히 맞을 것입니다.
내 Debian 시스템에는 두 개의 패키지(및 해당 종속성)를 설치해야 합니다.
apt-get install hugin hugin-tools
질문의 완성도를 높이기 위해 여기에 약간 수정된 버전을 포함했습니다(이 버전은 하드코딩되지 않고 명령줄에서 이미지 파일 이름을 허용합니다).
#! /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
이미지가 호출되고 wIowW.jpg
( orMDp.jpg
이미지 이름대로) 결과를 원하는 경우 rsp.tif
다음과 같이 스크립트를 실행할 수 있습니다.
./run-scan-pto_var.sh rsp 10 *.jpg
출력은 항상 TIFF 파일에 기록됩니다. 그러나 이 형식은 거의 모든 다른 이미지 형식으로 변환할 수 있습니다.
결과?
답변2
편집 및 업데이트된 스크립트:
이 솔루션은 원본 이미지를 기반으로 합니다. 모든 높이의 두 이미지를 병합하지만 두 입력 이미지의 너비는 일치해야 합니다.
다음과 같이 스크립트를 호출할 수 있습니다.
sh ./name-of-script topImg.jpg bottomImg.jpg
두 개의 입력 이미지에 일치하는 교차 부분이 있는지 확인합니다. 일치하는 항목이 없으면 스크립트가 종료됩니다.
이 기능을 구현하려면 ImageMagick만 있으면 됩니다.
#!/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