程序员开发实例大全宝库

网站首页 > 编程文章 正文

python之图像仿射变换分析:图像翻转

zazugpt 2024-09-04 00:23:55 编程文章 25 ℃ 0 评论

前言

这次梳理的篇幅主要是涉及图像仿射变换图像翻转,利用python编程实现不同方式的图像翻转,对巩固自己的python知识也是很有帮助的,进一步的对图像处理的内容也是帮助很大的。

但更多的是抛砖引玉,希望对你们有所帮助。

感谢各位鼓励与支持,往期文章都在最后梳理出来了(●'?'●)

接下来就以问题的形式展开梳理

利用flip函数实现翻转

flip函数原型

opencv中flip函数原型如下:

flip(src, flipCode[, dst]) -> dst

参数解析:

  • src 输入图片
  • 1 水平翻转 Horizontally (图片第二维度是column)
  • 0 垂直翻转 *Vertically * (图片第一维是row)
  • -1 同时水平翻转与垂直反转 Horizontally & Vertically

封装函数

为了使用方便, 你也可以封装一下旋转过程

示例代码:

def flip(image, direction):
    if direction == "h":
        flipped = cv2.flip(image, 1)
    elif direction == "v":
        flipped = cv2.flip(image, 0)
    else:
        # both horizontally and vertically
        flipped = cv2.flip(image, -1)

具体源码及效果展示

具体源码如下

'''
反转Demo
'''
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')

def bgr2rbg(img):
    '''
        将颜色空间从BGR转换为RBG
    '''
    return img[:,:,::-1]

# 水平翻转
flip_h = cv2.flip(img, 1)
# 垂直翻转
flip_v = cv2.flip(img, 0)
# 同时水平翻转与垂直翻转
flip_hv = cv2.flip(img, -1)

plt.subplot(221)
plt.title('SRC')
plt.imshow(bgr2rbg(img))

plt.subplot(222)
plt.title('Horizontally')
plt.imshow(bgr2rbg(flip_h))

plt.subplot(223)
plt.title('Vertically')
plt.imshow(bgr2rbg(flip_v))

plt.subplot(224)
plt.title('Horizontally & Vertically')
plt.imshow(bgr2rbg(flip_hv))

plt.show()

原始图像:

图像翻转图像:


利用numpy的索引实现翻转

利用numpy中ndarray的索引, 我们可以非常方便地实现图像翻转。

# 水平翻转
flip_h =  img[:,::-1]
# 垂直翻转
flip_v =  img[::-1]
# 水平垂直同时翻转
flip_hv =  img[::-1, ::-1]

具体源码及效果展示

具体源码如下

'''
使用numpy的索引进行图像反转
'''
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')
height,width,channel = img.shape

# 水平翻转
flip_h =  img[:,::-1]

# 垂直翻转
flip_v =  img[::-1]

# 水平垂直同时翻转
flip_hv =  img[::-1, ::-1]

def bgr2rbg(img):
    '''
        将颜色空间从BGR转换为RBG
    '''
    return img[:,:,::-1]

plt.subplot(221)
plt.title('SRC')
plt.imshow(bgr2rbg(img))

plt.subplot(222)
plt.title('Horizontally')
plt.imshow(bgr2rbg(flip_h))

plt.subplot(223)
plt.title('Vertically')
plt.imshow(bgr2rbg(flip_v))

plt.subplot(224)
plt.title('Horizontally & Vertically')
plt.imshow(bgr2rbg(flip_hv))

plt.show()

原始图像:

翻转后的图像:


利用wrapAffine实现翻转

数学原理推导

注: width 代表图像的宽度; height代表图像的高度

水平翻转的变换矩阵

垂直翻转的变换矩阵:

同时进行水平翻转与垂直翻转:

具体源码及效果展示

具体源码如下

'''
使用仿射矩阵实现反转
'''
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')
height,width,channel = img.shape

# 水平翻转
M1 = np.float32([[-1, 0, width], [0, 1, 0]])
flip_h =  cv2.warpAffine(img, M1, (width, height))

# 垂直翻转
M2 = np.float32([[1, 0, 0], [0, -1, height]])
flip_v =  cv2.warpAffine(img, M2, (width, height))

# 水平垂直同时翻转
M3 = np.float32([[-1, 0, width], [0, -1, height]])
flip_hv =  cv2.warpAffine(img, M3, (width, height))

def bgr2rbg(img):
    '''
        将颜色空间从BGR转换为RBG
    '''
    return img[:,:,::-1]

plt.subplot(221)
plt.title('SRC')
plt.imshow(bgr2rbg(img))

plt.subplot(222)
plt.title('Horizontally')
plt.imshow(bgr2rbg(flip_h))

plt.subplot(223)
plt.title('Vertically')
plt.imshow(bgr2rbg(flip_v))

plt.subplot(224)
plt.title('Horizontally & Vertically')
plt.imshow(bgr2rbg(flip_hv))

plt.show()

原始图像:

翻转后的图像:


「?? 感谢大家」

如果你觉得这篇内容对你挺有有帮助的话:

  1. 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
  2. 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。
  3. 觉得不错的话,也可以阅读近期梳理的文章(感谢各位的鼓励与支持):

「?? 资源传送门」

1. 扫码关注【做一个柔情的程序猿】公众号

2. 在【做一个柔情的程序猿】后台回复 【python资料】【2020秋招】 获取相应资料

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表