OpenCV remap
本教程將討論使用 Python 中 OpenCV 的 remap()
函式根據地圖轉換影象。
使用 OpenCV 的 remap()
函式根據 Python 中的地圖轉換影象
我們可以使用 OpenCV 的 remap()
函式根據地圖轉換影象。例如,如果我們想垂直翻轉影象,我們必須改變其畫素的位置或位置。
要垂直翻轉影象,我們可以將影象的第一行替換為最後一行,將第二行替換為倒數第二行,等等。在 remap()
函式中,我們提供了我們想要的新地圖轉換給定的影象。
remap()
函式將根據給定的地圖移動每個影象畫素並將其儲存在變數中。例如,讓我們使用 remap()
函式垂直翻轉影象。
我們必須建立與源影象大小相同的 x 軸和 y 軸圖。為了初始化地圖,我們可以使用 NumPy
的 zeros()
函式來建立兩個空地圖。
之後,我們需要用我們想要移動給定影象的每個畫素的位置值填充兩個地圖。例如,如果我們要翻轉影象,第一個畫素應該垂直移動到最後一個。
換句話說,我們必須將位於 (0,0) 的畫素移動到 (0, last)。這意味著我們只需更改 y 軸或行的值即可垂直翻轉影象。
在 x 軸圖中,第一列應包含所有零值,最後一列應包含等於給定影象列長度的值。
在 y 軸圖中,第一行的所有值都應該等於給定影象的行長,最後一行的值應該等於 0。
請參閱下面的程式碼。
import cv2
import numpy as np
src_img = cv2.imread('cat.jpg')
print('image shape = ',src_img.shape)
Img_map_x = np.zeros((src_img.shape[0], src_img.shape[1]), dtype=np.float32)
Img_map_y = np.zeros((src_img.shape[0], src_img.shape[1]), dtype=np.float32)
for i in range(Img_map_x.shape[0]):
Img_map_x[i,:] = [x for x in range(Img_map_x.shape[1])]
for j in range(Img_map_y.shape[1]):
Img_map_y[:,j] = [Img_map_y.shape[0]-y for y in range(Img_map_y.shape[0])]
print('First map_x value = ',Img_map_x[0,0])
print('First map_y value = ',Img_map_y[0,0])
dst_img = cv2.remap(src_img, Img_map_x, Img_map_y, cv2.INTER_LINEAR)
cv2.imshow('Original', src_img)
cv2.imshow('Result', dst_img)
cv2.waitKey(0)
輸出:
image shape = (340, 325, 3)
First map_x value = 0.0
First map_y value = 340.0
我們可以在輸出中看到給定影象的形狀以及 x 和 y 軸對映的第一個值。map 的第一個值為 (0, 340) 表示位於 (0, 0) 的影象的第一個畫素將移動到 (0, 340) 位置。
remap()
函式的第一個引數是我們要重新對映的影象。該函式的第二個引數是 x 軸對映,第三個引數是 y 軸對映。
函式的第四個引數是用於重新對映值的方法。我們使用了 cv2.INTER_LINEAR
方法,即最近鄰插值方法,但我們可以將其更改為任何支援的方法,例如 cv2.INTER_LINEAR
用於雙線性插值等。
檢查此連結以獲取有關插值方法的更多詳細資訊。我們還可以在 remap()
函式中設定另外兩個可選引數。
第一個可選引數是 borderMode
,用於設定輸出影象的邊框。預設情況下,邊框模式的值設定為常量邊框,但我們可以將其更改為任何支援的邊框模式。
檢查此連結以獲取有關邊框型別的更多詳細資訊。
如果 borderMode
設定為 cv2.BORDER_TRANSPARENT
,該函式將不會修改輸出影象的異常值。第二個可選引數在恆定邊框模式下設定邊框值。
預設情況下,它的值為 0,但我們可以將其設定為任何數值。