如何根据另一个参考点调整图像大小

时间:2019-07-16 10:38:47

标签: python-3.x python-imaging-library

我目前有两个图像(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)

3 个答案:

答案 0 :(得分:1)

我认为您正在尝试进行“仿射失真” 。我也许可以在 OpenCV PIL 中找到解决方法,但是就目前而言,这就是我对 ImageMagick 所做的工作。

首先,我在第一张图像的左侧和右侧都找到了定位孔(?)的中心。我得到了这些坐标:

422,775    # left hole centre 1st picture
1246,799   # right hole centre 1st picture

enter image description here

然后我在第二张图片中找到了这些相同的功能:

514,426    # left hole centre 2nd picture
668,426    # right hole centre 2nd picture

enter image description here

然后我在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

enter image description here

如果您想阅读的话,安东尼·蒂森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


结果enter image description here

添加:

如果要将图像修剪到其最小边界框,请按如下所示向命令添加修剪,其中修剪值的范围是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)


enter image description here

答案 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