OpenCV图像的剪切和移位(python)

一、图像的剪切

获取剪切范围内的像素矩阵,如:
假 设 : 以 图 片 左 顶 点 为 原 点 , 向 右 为 x 轴 , 向 下 为 y 轴 i m g [ 0 : 250 , 200 : 450 ] 获 取 点 ( 200 , 0 ) 为 剪 切 图 片 的 左 顶 点 250 × 250 的 像 素 矩 阵 假设:以图片左顶点为原点,向右为x轴,向下为y轴 \\ img[0:250,200:450] 获取点 (200, 0) 为剪切图片的左顶点 250×250 的像素矩阵 xyimg[0:250,200:450](200,0)250×250

import cv2
img = cv2.imread('image.jpg', 1)
cv2.imshow('img', img)
imgInfo = img.shape
dst = img[0:250,200:450] # 剪切
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

二、图像的移位

1. API 调用实现
import numpy as np
import cv2
img = cv2.imread('image.jpg', 1)
cv2.imshow('img', img)
imgInfo = img.shape
height = imgInfo[0] # 获取高
width = imgInfo[1] # 获取宽
matShift = np.float32([[1,0,50],[0,1,80]]) # 2×3矩阵
# 参数: 1 图片 2 移位矩阵matShift 3 尺寸info
dst = cv2.warpAffine(img, matShift, (width, height))
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

实现原理:
将 [ [ 1 , 0 , 50 ] , [ 0 , 1 , 80 ] ] 拆 分 为 2 × 2 和 2 × 1 的 矩 阵 [ [ 1 , 0 ] , [ 0 , 1 ] ] 2 × 2 设 为 A [ [ 50 ] , [ 80 ] ] 2 × 1 设 为 B [ [ x ] , [ y ] ] 2 × 1 设 为 C A ∗ C + B = [ [ 1 × x + 0 × y ] , [ 0 × x + 1 × y ] ] + [ [ 50 ] , [ 80 ] ] = [ [ x + 50 ] , [ y + 80 ] ] 即 , 在 x 轴 上 向 右 移 动 50 p x , 在 y 轴 上 向 下 移 动 80 p x 将[[1,0,50],[0,1,80]]拆分为 2\times2 和 2\times1 的矩阵 \\ [[1,0],[0,1]]\quad\quad 2\times2 \quad\quad 设为A \\ [[50],[80]]\quad\quad 2\times1 \quad\quad 设为B \\ [[x],[y]]\quad\quad 2\times1 \quad\quad 设为C \\ A*C+B = [[1\times x+0\times y], [0\times x+1\times y]]+[[50],[80]]=[[x+50],[y+80]] \\ 即,在x轴上向右移动50px,在y轴上向下移动80px [[1,0,50],[0,1,80]]2×22×1[[1,0],[0,1]]2×2A[[50],[80]]2×1B[[x],[y]]2×1CAC+B=[[1×x+0×y],[0×x+1×y]]+[[50],[80]]=[[x+50],[y+80]]x50pxy80px
移位结果:

根据上述的原理,同样也可以实现图片的缩放 (类似于最近临域插值法):
假 设 A 为 : [ [ 0.5 , 0 ] , [ 0 , 0.5 ] ] , 设 B 为 : 0 , 设 C 为 : [ [ x ] , [ y ] ] A ∗ C + B = [ [ 0.5 x ] , [ 0.5 y ] ] 假设A为: [[0.5,0],[0,0.5]],设B为: 0 ,设C为:[[x],[y]] \\ A*C+B = [[0.5x],[0.5y]] A:[[0.5,0],[0,0.5]],B:0,C[[x],[y]]AC+B=[[0.5x],[0.5y]]

import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('img', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
matShift = np.float32([[0.5,0,0], [0,0.5,0]]) # 缩放比为0.5
dst = cv2.warpAffine(img, matShift, (round(width*0.5), round(height*0.5)))
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

2. 直接通过循环实现像素位置的变换
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('img', img)
imgInfo = img.shape
height = imgInfo[0] # 获取高
width = imgInfo[1] # 获取宽
h = 60 #在高方向上移动的像素
w = 100 # 在宽方向上移动的像素
dst = np.zeros((height, width,3), np.uint8) # 创建一个画板
for i in range(height-h):
    for j in range(width-w):
        dst[i+h][j+w] = img[i][j]
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

图片向下移动了60px,向右移动了100px,结果如下:

猜你喜欢

转载自blog.csdn.net/xwmrqqq/article/details/108853818