Python实验三:图像中的图像

一、原理介绍

单应性变换是将一个平面内的点映射到另个平面内的二维投影变换。平面是指图像或者三维中的平面表面。
单应性矩阵(Homography)就是一个从一张图像到另一张图像映射关系的转换矩阵(3*3)。可以由下面的公式来表示:
在这里插入图片描述
可以将单应性变换写成如下形式:
在这里插入图片描述

二、Alpha原理
在图形学中,ALPHA指的是除了颜色的三个分量(RGB)外 的第四个分量:透明度。所以,一个真彩色(指利用RGB分量合成颜色)的像素就变成由四个分量组成:R、G、B、A。在我们的讨论里,设R、G、B、A均 为从0到1的值,其中ALPHA=0为完全透明,ALPHA=1为完全覆盖,中间的数值代表半透明。这样的设定是为了能使本文独立于显示硬件。我们把诸如 (R,G,B,A)这样的东西称为四元组。一个这样的四元组代表一个由RA、GA、B*A组合而成的颜色。

有一点重要的是,要清楚分辨如下两个关键像素的意义:

黑色=(0,0,0,1)

完全透明=(0,0,0,0)

下面是如何根据ALPHA通道数据进行混合的算法:

简单地,我们只需要把需要组合的颜色计算出不含ALPHA分量的原始RGB分量然后相加便可。比如现在有两幅图象,分别称为图象A和图象B,由这两幅图象组合而成的图象称为C,则我们有如下的四元组:

A: (Ra,Ga,Ba,ALPHAa)

B: (Rb, Gb, Bb, ALPHAb)

和组合后的RGB三元组:

C: (Rc, Gc, Bc)

则:

Rc = Ra * ALPHAa + Rb * ALPHAb

Gc = Ga * ALPHAa + Gb * ALPHAb

Bc = Ba * ALPHAa + Bb * ALPHAb

便可得出混合后的颜色。

如果有多幅图像需要混合,则按照以上方法两幅两幅地进行混合。

三、实验结果

 # -*- coding: utf-8 -*-
from PCV.geometry import warp, homography
from PIL import  Image
from pylab import *
from scipy import ndimage

# example of affine warp of im1 onto im2

im1 = array(Image.open('D:/pic/112.jpg').convert('L'))
im2 = array(Image.open('D:/pic/111.jpg').convert('L'))
# set to points
tp = array([[120,260,260,120],[16,16,305,305],[1,1,1,1]])
#tp = array([[675,826,826,677],[55,52,281,277],[1,1,1,1]])
im3 = warp.image_in_image(im1,im2,tp)
figure()
gray()
subplot(141)
axis('off')
imshow(im1)
subplot(142)
axis('off')
imshow(im2)
subplot(143)
axis('off')
imshow(im3)

# set from points to corners of im1
m,n = im1.shape[:2]
fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])
# first triangle
tp2 = tp[:,:3]
fp2 = fp[:,:3]
# compute H
H = homography.Haffine_from_points(tp2,fp2)
im1_t = ndimage.affine_transform(im1,H[:2,:2],
(H[0,2],H[1,2]),im2.shape[:2])
# alpha for triangle
alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])
im3 = (1-alpha)*im2 + alpha*im1_t
# second triangle
tp2 = tp[:,[0,2,3]]
fp2 = fp[:,[0,2,3]]
# compute H
H = homography.Haffine_from_points(tp2,fp2)#解释
im1_t = ndimage.affine_transform(im1,H[:2,:2],
(H[0,2],H[1,2]),im2.shape[:2])
# alpha for triangle
alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])
im4 = (1-alpha)*im3 + alpha*im1_t
subplot(144)
imshow(im4)
axis('off')
show()

在这里插入图片描述
使用仿射变换将图像放置于另一幅图片中,它们能够和指定的区域或者标记物对齐。使用image_in_image()函数,该函数的输入参数为两幅图像和一个坐标,该坐标为将第一幅图放置到第二幅图像中的角点坐标。
函数Haffine_from_points()会返回给定对应点对的最优放射变换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值