我目前有两个图像(im1和im2),像素尺寸为(1725,1580)。但是,im2周围有一个较大的边框,我必须创建边框以确保图像大小相同。 im2最初是(1152,864)。
就这样。当我使用PIL.Image.blend
在im1的顶部覆盖im2时,im2似乎覆盖了im1,但是要小很多。我认为可以在图像上使用2个不同的参考点(存在于im1和im2上)以重新缩放im2(以某种方式缩放它)以将im2覆盖在im1的顶部。
我的问题是我一直在研究各种python模块(PIL,scipy,matplotlib等),但似乎无法真正找到任何用途或找到可以解决此问题的解决方案。
我有2个参考点,我认为我可以使用(存在于im1和im2上)重新缩放im2(以某种方式缩放它)以将im2覆盖在im1的顶部。
我看过各种模块,但似乎找不到任何可能起作用的东西(scipy,PIL,matplotlib)
#im1 https://i.imgur.com/dF8uyPw.jpg
#im2 https://i.imgur.com/o4RAhOQ.png
#im2_resized https://i.imgur.com/jfWz1LE.png
im1 = Image.open("pit5Film/Pit_5_5mm_inf.tif")
im2 = Image.open("pit5Overlay/overlay_132.png")
old_size = im2.size
new_size = im1.size
im2_resized = Image.new("RGB", new_size)
im2_resized.paste(im2,((round((new_size[0]-old_size[0])/2)),round(((new_size[1]-old_size[1])/2))))
Image.blend(im1,im2_resized,0.2)
答案 0 :(得分:1)
我认为您正在尝试进行“仿射失真” 。我也许可以在 OpenCV 或 PIL 中找到解决方法,但是就目前而言,这就是我对 ImageMagick 所做的工作。
首先,我在第一张图像的左侧和右侧都找到了定位孔(?)的中心。我得到了这些坐标:
422,775 # left hole centre 1st picture
1246,799 # right hole centre 1st picture
然后我在第二张图片中找到了这些相同的功能:
514,426 # left hole centre 2nd picture
668,426 # right hole centre 2nd picture
然后我在Terminal中运行它进行2点仿射变换:
convert imageA.jpg -virtual-pixel white \
-distort affine '422,775 514,426 1246,799 668,426' +repage \
imageB.png -compose overlay -composite result.jpg
如果您想阅读的话,安东尼·蒂森here提供了大量有用的信息。
答案 1 :(得分:1)
这是在基于Imagemagick的Python Wand中执行此操作的方法。我使用Mark Setchell的图像和等效的Python Wand命令。根据文档,distort命令需要Imagemagick 7。使用当前版本的Python Wand 0.5.5。
脚本:
#!/bin/python3.7
from wand.image import Image
from wand.color import Color
from wand.display import display
with Image(filename='imageA.jpg') as Aimg:
with Image(filename='imageB.jpg') as Bimg:
Aimg.virtual_pixel = 'background'
Aimg.background_color = Color('white')
arguments = (422, 775, 514, 426, 1246, 799, 668, 426)
Aimg.distort('affine', arguments)
Aimg.composite(Bimg, 0, 0, 'overlay')
Aimg.save(filename='image_BoverlayA_composite.png')
display(Aimg)
呼叫命令:
python3.7 wand_affine_overlay.py
添加:
如果要将图像修剪到其最小边界框,请按如下所示向命令添加修剪,其中修剪值的范围是0到量子范围。
#!/bin/python3.7
from wand.image import Image
from wand.color import Color
from wand.display import display
with Image(filename='imageA.jpg') as Aimg:
with Image(filename='imageB.jpg') as Bimg:
Aimg.virtual_pixel = 'background'
Aimg.background_color = Color('white')
arguments = (422, 775, 514, 426, 1246, 799, 668, 426)
Aimg.distort('affine', arguments)
Aimg.composite(Bimg, 0, 0, 'overlay')
Aimg.trim(fuzz=10000)
Aimg.save(filename='image_BoverlayA_composite.png')
display(Aimg)
答案 2 :(得分:0)
使用OpenCV调整图像大小的一种方法
dim = (width, height)
# resize image
resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
使用OpenCV融合两个图像 1:同时加载两个图片
src1 = cv.imread(cv.samples.findFile('img1.jpg'))
src2 = cv.imread(cv.samples.findFile('img2.jpg'))
2:混合两个图像(alpha值在0到1之间,任意浮动)
beta = (1.0 - alpha)
dst = cv.addWeighted(src1, alpha, src2, beta, 0.0)
3:用于显示结果
cv.imshow('dst', dst)
cv.waitKey(0)
如果您不想根据参考点调整图像大小,请考虑使用PYIMAGESEARCH撰写的该博客:PYIMAGESEARCH 4 POINT