图像扭曲(仿射变换)

图片扭曲(仿射变换)
1、仿射变换
仿射变换其实就是将图片上每一个像素点按照一定的规律映射到新的位置上,实际上就是求解新的x,y的过程,这跟矩阵仿射变换非常像,仿射变换的实质其实就是将原图像的三个点映射到目标图片三个新的位置上,这三个位置对于原图片来说位于左上角,左下角以及右上角,通过把原图片上三个点映射到目标图片三个新的位置上。
其中求解x,y的过程一般可以表达为如下式子:在这里插入图片描述
仿射变换可以表达为如下式子:
在这里插入图片描述
仿射扭曲的一个简单例子是,将图像或者图像的一部分放置在另一幅图像中,使得他们能够和指定的区域或者标记物对齐。将扭曲的图像和第二幅图像融合,我们就创建了alpha图像。该图像定义了每个像素从各个图像中获取的像素值成分多少。

2、运行结果
下面为代码

# -*- 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('xiaohui.jpg').convert('L'))
im2 = array(Image.open('zsjng0.png').c
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当进行图像分块仿射变换时,可能会出现接缝处扭曲错位的问题。这是因为在对每个小块进行仿射变换时,我们只考虑了当前小块内的像素,而没有考虑周围小块像素的影响。解决这个问题的方法是使用重叠区域,即在每个小块的边界上留下一定的重叠区域,这样可以保证相邻小块的像素之间有重叠,从而避免出现接缝处扭曲错位的问题。 以下是修改后的Python代码: ```python import cv2 import numpy as np # 定义仿射变换函数 def affine_transform(img, src, dst): M = cv2.getAffineTransform(src, dst) rows, cols = img.shape[:2] res = cv2.warpAffine(img, M, (cols, rows)) return res # 定义图像分块函数 def block_split(img, block_size, overlap_size): h, w = img.shape[:2] bh, bw = block_size oh, ow = overlap_size blocks = [] for i in range(0, h-bh+1, bh-oh): for j in range(0, w-bw+1, bw-ow): blocks.append(img[i:i+bh, j:j+bw]) return blocks # 定义图像分块仿射变换函数 def block_affine_transform(img, block_size, overlap_size, src, dst): blocks = block_split(img, block_size, overlap_size) res_blocks = [] for i, block in enumerate(blocks): if i % (img.shape[1] // block_size[1]) != 0: src[0][1] += overlap_size[0] src[1][1] += overlap_size[0] dst[0][1] += overlap_size[0] dst[1][1] += overlap_size[0] res_block = affine_transform(block, src, dst) res_blocks.append(res_block) rows, cols = img.shape[:2] bh, bw = block_size oh, ow = overlap_size res = np.zeros((rows, cols, 3), dtype=np.uint8) for i in range(len(res_blocks)): row = (i // (cols // (bw - ow))) * (bh - oh) col = (i % (cols // (bw - ow))) * (bw - ow) res[row:row+bh, col:col+bw] = res_blocks[i] return res # 读取图像 img = cv2.imread('img.jpg') # 定义原始坐标和目标坐标 src = np.float32([[0, 0], [0, 100], [100, 0]]) dst = np.float32([[0, 0], [50, 100], [100, 0]]) # 进行图像分块仿射变换 res = block_affine_transform(img, (100, 100), (20, 20), src, dst) # 显示结果图像 cv2.imshow('result', res) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个修改后的示例中,我们首先修改了图像分块函数`block_split`,加入了重叠区域的概念。在每个小块的边界上留下一定的重叠区域,这里我们设置重叠区域大小为`(20, 20)`。接着,在图像分块仿射变换函数`block_affine_transform`中,我们判断当前小块是否为第一列小块,如果不是,则将源坐标和目标坐标的y坐标增加重叠区域的大小。这样可以保证相邻小块的像素之间有重叠,从而避免出现接缝处扭曲错位的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值