重映射

本文详细介绍了OpenCV中的重映射函数(cv2.remap),包括如何使用该函数进行像素值复制、图像复制,以及如何通过修改map1和map2实现图像的翻转效果。文章提供了丰富的代码示例,涵盖了不同场景下的应用。
摘要由CSDN通过智能技术生成

重映射函数

dst=cv2.remap(src,map1,map2,interpolation[,borderMode,borderValue])

dst:目标图像。
src:原始图像。
map1:点(x,y)的一个映射或者点(x,y)的x值。
map2:其值与map1的值有关。当map1表示(x,y)的一个映射时,map2为空。当map1表示点(x,y)的x值时,map2表示点(x,y)的y值。
interpolation:插值方式。
borderMode:边界模式。
borderValue:边界值。

注:map1和map2都是浮点数,目标图像可以映射到原始图像中不存在像素值的位置。

复制

1、像素值复制

import cv2 as cv
import numpy as np

image = np.random.randint(0, 256, size=[6, 6], dtype=np.uint8)  # 构建6*6的随机灰度图像数组
h, w = image.shape  # 获得图像的高和宽
# 建立新数组的大小
x = np.zeros((w, h), np.float32)
y = np.zeros((w, h), np.float32)
# 实现新数组的访问赋值操作
for i in range(h):
    for j in range(w):
        x.itemset((i, j), j)  # x存放新数组点(x,y)的x值(宽值)
        y.itemset((i, j), i)  # y存放新数组点(x,y)的y值(高值)
rst = cv.remap(image, x, y, cv.INTER_LINEAR)  # 数组复制
print('image=\n', image)
print('rst=\n', rst)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

2、图像复制

import cv2 as cv
import numpy as np

image=cv.imread("d:/exercise/lusi.jpg")#读取图像
h, w = image.shape[:2]  # 获得图像的高和宽
# 建立新图像的大小
map1 = np.zeros((h,w), np.float32)
map2 = np.zeros((h,w), np.float32)
# 实现新图像的访问遍历操作
for i in range(h):
    for j in range(w):
        map1.itemset((i, j), j)  # map1存放新数组点(x,y)的x值(宽值)
        map2.itemset((i, j), i)  # map2存放新数组点(x,y)的y值(高值)
rst = cv.remap(image, map1, map2, cv.INTER_LINEAR)  # 图像复制
cv.imshow('image',image)
cv.imshow('rst',rst)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

绕x轴翻转

map1的值不变,map2的值变为:总行数-1-当前行号。(-1是因为行号的下标是从0开始的)

1、像素绕x轴翻转

import cv2 as cv
import numpy as np

image = np.random.randint(0, 256, size=[6, 6], dtype=np.uint8)  # 构建6*6的随机灰度图像数组
h, w = image.shape  # 获得图像的高和宽
# 建立新数组的大小
x = np.zeros((w, h), np.float32)
y = np.zeros((w, h), np.float32)
# 实现新数组的访问赋值操作
for i in range(h):
    for j in range(w):
        x.itemset((i, j), j)  # x存放新数组点(x,y)的x值(宽值)
        y.itemset((i, j), h-1-i)  # y存放翻转后的y值(高值)
rst = cv.remap(image, x, y, cv.INTER_LINEAR)  # 数组绕x轴翻转
print('image=\n', image)
print('rst=\n', rst)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

2、图像绕x轴翻转

import cv2 as cv
import numpy as np

image=cv.imread("d:/exercise/lusi.jpg")#读取图像
h, w = image.shape[:2]  # 获得图像的高和宽
# 建立新图像的大小
map1 = np.zeros((h,w), np.float32)
map2 = np.zeros((h,w), np.float32)
# 实现新图像的访问遍历操作
for i in range(h):
    for j in range(w):
        map1.itemset((i, j), j)  # map1存放新数组点(x,y)的x值(宽值)
        map2.itemset((i, j), h-1-i)  # map2存放翻转后的y值(高值)
rst = cv.remap(image, map1, map2, cv.INTER_LINEAR)  # 图像绕x轴翻转
cv.imshow('image',image)
cv.imshow('rst',rst)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

绕y轴翻转

map2的值不变,map1的值变为:总列数-1-当前列号。(-1是因为列号的下标是从0开始的)

1、像素绕y轴翻转

import cv2 as cv
import numpy as np

image = np.random.randint(0, 256, size=[6, 6], dtype=np.uint8)  # 构建6*6的随机灰度图像数组
h, w = image.shape  # 获得图像的高和宽
# 建立新数组的大小
x = np.zeros((w, h), np.float32)
y = np.zeros((w, h), np.float32)
# 实现新数组的访问赋值操作
for i in range(h):
    for j in range(w):
        x.itemset((i, j), w-1-j)  # x存放翻转后的x值(宽值)
        y.itemset((i, j), i)  # y存放新数组点(x,y)的y值(高值)
rst = cv.remap(image, x, y, cv.INTER_LINEAR)  # 数组绕y轴翻转
print('image=\n', image)
print('rst=\n', rst)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

2、图像绕y轴翻转

import cv2 as cv
import numpy as np

image=cv.imread("d:/exercise/lusi.jpg")#读取图像
h, w = image.shape[:2]  # 获得图像的高和宽
# 建立新图像的大小
map1 = np.zeros((h,w), np.float32)
map2 = np.zeros((h,w), np.float32)
# 实现新图像的访问遍历操作
for i in range(h):
    for j in range(w):
        map1.itemset((i, j), w-1-j)  # map1存放翻转后的x值(宽值)
        map2.itemset((i, j), i)  # map2存放新数组点(x,y)的y值(高值)
rst = cv.remap(image, map1, map2, cv.INTER_LINEAR)  # 图像绕y轴翻转
cv.imshow('image',image)
cv.imshow('rst',rst)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

绕x轴与y轴翻转

map1的值变为:总列数-1-当前列号。map2的值变为:总行数-1-当前行号。(-1是因为行号,列号的下标是从0开始的)

1、像素绕x轴,y轴翻转

import cv2 as cv
import numpy as np

image = np.random.randint(0, 256, size=[6, 6], dtype=np.uint8)  # 构建6*6的随机灰度图像数组
h, w = image.shape  # 获得图像的高和宽
# 建立新数组的大小
x = np.zeros((w, h), np.float32)
y = np.zeros((w, h), np.float32)
# 实现新数组的访问赋值操作
for i in range(h):
    for j in range(w):
        x.itemset((i, j), w-1-j)  # x存放翻转后的x值(宽值)
        y.itemset((i, j), h-1-i)  # y存放翻转后的y值(高值)
rst = cv.remap(image, x, y, cv.INTER_LINEAR)  # 数组绕x轴,y轴翻转
print('image=\n', image)
print('rst=\n', rst)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

2、图像绕x轴,y轴翻转

import cv2 as cv
import numpy as np

image=cv.imread("d:/exercise/lusi.jpg")#读取图像
h, w = image.shape[:2]  # 获得图像的高和宽
# 建立新图像的大小
map1 = np.zeros((h,w), np.float32)
map2 = np.zeros((h,w), np.float32)
# 实现新图像的访问遍历操作
for i in range(h):
    for j in range(w):
        map1.itemset((i, j), w-1-j)  # map1存放翻转后的x值(宽值)
        map2.itemset((i, j), h-1-i)  # map2存放翻转后的y值(高值)
rst = cv.remap(image, map1, map2, cv.INTER_LINEAR)  # 图像绕x轴,y轴翻转
cv.imshow('image',image)
cv.imshow('rst',rst)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值