重映射函数
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()
运行结果: