1. 學(xué)習(xí)目標(biāo)
- 學(xué)習(xí) OpenCV 圖像的翻轉(zhuǎn)函數(shù) cv.flip;
- 學(xué)習(xí) NumPy 矩陣的反轉(zhuǎn)函數(shù) np.flip;
- 自己實(shí)現(xiàn)矩陣反轉(zhuǎn)的函數(shù)。
2. OpenCV 翻轉(zhuǎn)
翻轉(zhuǎn)也稱鏡像,是指將圖像沿軸線進(jìn)行軸對稱變換。水平鏡像是將圖像沿垂直中軸線進(jìn)行左右翻轉(zhuǎn),垂直鏡像是將圖像沿水平中軸線進(jìn)行上下翻轉(zhuǎn),水平垂直鏡像是水平鏡像和垂直鏡像的疊加。
2.1 cv.flip() 函數(shù)說明
cv.flip(src, flipCode[, dst]) -> dst
2.2 參數(shù)說明
參數(shù) | 說明 |
---|---|
src | 表示輸入圖像。 |
flipCode | 表示翻轉(zhuǎn)軸線的控制參數(shù),整型(int)。 |
dst | 表示變換操作的輸出圖像,可選項(xiàng)。 |
2.3 flipCode 值說明
值 | 說明 |
---|---|
0 | 表示水平翻轉(zhuǎn)。 |
1 | 表示垂直翻轉(zhuǎn)。 |
-1 | 表示對角線翻轉(zhuǎn)。 |
3. 翻轉(zhuǎn)實(shí)例
3.1 實(shí)例代碼
import cv2 as cv
import numpy as np
# 圖像翻轉(zhuǎn)
def image_flip():
img = cv.imread("./images/lena.jpg")
cv.imshow("original", img)
# 水平翻轉(zhuǎn)
horizontally_img = cv.flip(img,0)
cv.imshow("horizontally_img", horizontally_img)
# 垂直翻轉(zhuǎn)
vertically_img = cv.flip(img,1)
cv.imshow("vertically_img", vertically_img)
# 對角線翻轉(zhuǎn)
horizontally_vertically_img = cv.flip(img,-1)
cv.imshow("horizontally_vertically_img", horizontally_vertically_img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
image_flip()
3.2 翻轉(zhuǎn)效果
4. 矩陣反轉(zhuǎn)
4.1 np.flip() 函數(shù)說明
numpy.flip(array, axis) → dst_array
4.2 參數(shù)說明
參數(shù) | 說明 |
---|---|
array | 表示輸入的數(shù)組。 |
axis | 表示[integer]軸,陣列沿此軸反轉(zhuǎn)。 |
4.3 axis 值說明
值 | 說明 |
---|---|
0 | 表示上下反轉(zhuǎn)。 |
1 | 表示左右反轉(zhuǎn)。 |
5. 反轉(zhuǎn)實(shí)例
5.1 實(shí)例代碼
import cv2 as cv
import numpy as np
# 陣列反轉(zhuǎn)
def image_np_flip():
img = cv.imread("./images/lena_small.jpg")
cv.imshow("original", img)
# 水平翻轉(zhuǎn)
horizontally_img = np.flip(img,0)
cv.imshow("horizontally_img", horizontally_img)
# 垂直翻轉(zhuǎn)
vertically_img = np.flip(img,1)
cv.imshow("vertically_img", vertically_img)
# 對角線翻轉(zhuǎn)
horizontally_vertically_img0 = np.flip(img,0)
horizontally_vertically_img = np.flip(horizontally_vertically_img0,1)
cv.imshow("horizontally_vertically_img", horizontally_vertically_img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
image_np_flip()
5.2 反轉(zhuǎn)效果
文章來源:http://www.zghlxwxcb.cn/news/detail-459975.html
6. 實(shí)現(xiàn)陣列反轉(zhuǎn)
6.1 實(shí)現(xiàn)陣列上下反轉(zhuǎn)
- 獲取陣列的寬高值;
- 復(fù)制一份改陣列,防止反轉(zhuǎn)的時(shí)候影響了原陣列;
- 上下翻轉(zhuǎn)只需要循環(huán)陣列的行,將第一行和最后一行互換,將第二行和倒數(shù)第二行互換?。?!
- 注意:由于 range 是從 0 開始,所以最后一行需要先減 1?。?!
- 注意:解構(gòu)賦值直接將兩個(gè)值進(jìn)行互換,但是換的第一個(gè)值需要復(fù)制一份互換np.copy(src[i])?。?!
# 上下翻轉(zhuǎn)
def flip_ud(src):
h,w,c = src.shape
src = np.copy(src)
for i in range(h//2):
# cur = np.copy(src[i])
# src[i] = src[h-i-1]
# src[h-i-1] = cur
src[i],src[h-i-1] = src[h-i-1],np.copy(src[i])
return src
6.2 實(shí)現(xiàn)陣列左右反轉(zhuǎn)
- 對比上下反轉(zhuǎn),左右反轉(zhuǎn)需要循環(huán)列一層的互換!??!
# 左右翻轉(zhuǎn)
def flip_lr(src):
h,w,c = src.shape
src = np.copy(src)
for i in range(h):
for j in range(w//2):
src[i][j],src[i][w-j-1] = src[i][w-j-1],np.copy(src[i][j])
return src
6.3 實(shí)現(xiàn)陣列左上角和右下角反轉(zhuǎn)
# 圖像左上角和右下角翻轉(zhuǎn)
def flip_lu_rd(src):
h,w,c = src.shape
src = np.copy(src)
# 左上角和右下角翻轉(zhuǎn)
for i in range(h//2):
for j in range(w//2):
src[i][j],src[h-i-1][w-j-1] = src[h-i-1][w-j-1],np.copy(src[i][j])
return src
6.4 使用 6.3 的方法實(shí)現(xiàn)對角線反轉(zhuǎn)
- 圖像左上角和右下角翻轉(zhuǎn);
- 右上角和左下角翻轉(zhuǎn);
2.1 左右翻轉(zhuǎn);
2.2 圖像左上角和右下角翻轉(zhuǎn);
2.3 左右翻轉(zhuǎn)圖像還原。
def flip_ud_lr(src):
# 圖像左上角和右下角翻轉(zhuǎn)
src = flip_lu_rd(src)
# 右上角和左下角翻轉(zhuǎn)
# 1. 左右翻轉(zhuǎn)
src = flip_lr(src)
# 2. 圖像左上角和右下角翻轉(zhuǎn)
src = flip_lu_rd(src)
# 3. 左右翻轉(zhuǎn)圖像還原
src = flip_lr(src)
return src
6.5 直接使用 6.1 和 6.2 實(shí)現(xiàn)對角線反轉(zhuǎn)
def flip_ud_lr(src):
# 上下翻轉(zhuǎn)
src = flip_ud(src)
# 左右翻轉(zhuǎn)
src = flip_lr(src)
return src
7. 實(shí)現(xiàn)圖像翻轉(zhuǎn)實(shí)例
7.1 翻轉(zhuǎn)實(shí)例代碼
# 上下翻轉(zhuǎn)
def flip_ud(src):
h,w,c = src.shape
src = np.copy(src)
for i in range(h//2):
# cur = np.copy(src[i])
# src[i] = src[h-i-1]
# src[h-i-1] = cur
src[i],src[h-i-1] = src[h-i-1],np.copy(src[i])
return src
# 左右翻轉(zhuǎn)
def flip_lr(src):
h,w,c = src.shape
src = np.copy(src)
for i in range(h):
for j in range(w//2):
src[i][j],src[i][w-j-1] = src[i][w-j-1],np.copy(src[i][j])
return src
# 圖像左上角和右下角翻轉(zhuǎn)
def flip_lu_rd(src):
h,w,c = src.shape
src = np.copy(src)
# 左上角和右下角翻轉(zhuǎn)
for i in range(h//2):
for j in range(w//2):
src[i][j],src[h-i-1][w-j-1] = src[h-i-1][w-j-1],np.copy(src[i][j])
return src
def flip_ud_lr(src):
# 圖像左上角和右下角翻轉(zhuǎn)
src = flip_lu_rd(src)
# 右上角和左下角翻轉(zhuǎn)
# 1. 左右翻轉(zhuǎn)
src = flip_lr(src)
# 2. 圖像左上角和右下角翻轉(zhuǎn)
src = flip_lu_rd(src)
# 3. 左右翻轉(zhuǎn)圖像還原
src = flip_lr(src)
return src
def image_self_flip():
img = cv.imread("./images/lena_small.jpg")
# cv.imshow("original", img)
# 水平翻轉(zhuǎn)
horizontally_img = flip_ud(img)
cv.imshow("horizontally_img", horizontally_img)
# 垂直翻轉(zhuǎn)
vertically_img = flip_lr(img)
cv.imshow("vertically_img", vertically_img)
# 對角線翻轉(zhuǎn)
horizontally_vertically_img = flip_ud_lr(img)
cv.imshow("horizontally_vertically_img", horizontally_vertically_img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
image_self_flip()
實(shí)現(xiàn)效果
文章來源地址http://www.zghlxwxcb.cn/news/detail-459975.html
8. 總結(jié)
- 注意: 陣列的反轉(zhuǎn) 和 OpenCV 的翻轉(zhuǎn) 對比,少了對角線翻轉(zhuǎn),但是使用【上下反轉(zhuǎn)+左右反轉(zhuǎn)】能夠?qū)崿F(xiàn)相同的效果;
- 自己使用循環(huán)陣列的方法實(shí)現(xiàn)水平、垂直、對角線翻轉(zhuǎn),但是相比原生方法,計(jì)算很慢,需要進(jìn)行優(yōu)化!?。?/li>
到了這里,關(guān)于OpenCV-Python學(xué)習(xí)(21)—— OpenCV 圖像幾何變換之圖像翻轉(zhuǎn)(cv.flip、np.flip)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!