無錫做食品網(wǎng)站的公司網(wǎng)絡(luò)銷售好做嗎
目錄
二七、離散余弦變換
執(zhí)行離散余弦變換 (dct) 和逆變換 (idct)
解釋
實(shí)際應(yīng)用
JPEG壓縮示例(簡(jiǎn)化版)
二八、圖像幾何變換
仿射變換 (warpAffine 和 getAffineTransform)
透視變換 (warpPerspective 和 getPerspectiveTransform)
旋轉(zhuǎn)變換 (getRotationMatrix2D)
極坐標(biāo)變換 (warpPolar 和 linearPolar)
http://t.csdnimg.cn/i8pqt?—— opencv—常用函數(shù)學(xué)習(xí)_“干貨“_總(VIP)
散的正在一部分一部分發(fā),不需要VIP。
資料整理不易,有用話給個(gè)贊和收藏吧。
二七、離散余弦變換
????????在OpenCV中,離散余弦變換(DCT)和其逆變換(IDCT)是常用于圖像壓縮和處理的技術(shù)。DCT將圖像數(shù)據(jù)從時(shí)域轉(zhuǎn)換到頻域,而IDCT則是將數(shù)據(jù)從頻域轉(zhuǎn)換回時(shí)域。OpenCV提供了兩個(gè)主要函數(shù):dct
和 idct
。
離散余弦變換函數(shù) | |
dct | idct |
執(zhí)行離散余弦變換 | 執(zhí)行離散余弦逆變換 |
執(zhí)行離散余弦變換 (dct
) 和逆變換 (idct
)
import cv2
import numpy as np# 讀取圖像并轉(zhuǎn)換為灰度圖
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 將圖像轉(zhuǎn)換為浮點(diǎn)型
image_float = np.float32(image) / 255.0# 執(zhí)行離散余弦變換
dct_image = cv2.dct(image_float)# 顯示DCT變換后的圖像
cv2.imshow('DCT Image', dct_image)
cv2.waitKey(0)# 執(zhí)行離散余弦逆變換
idct_image = cv2.idct(dct_image)# 將結(jié)果轉(zhuǎn)換回0-255范圍的圖像
idct_image = np.uint8(idct_image * 255)# 顯示逆變換后的圖像
cv2.imshow('IDCT Image', idct_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
解釋
dct
函數(shù):對(duì)輸入圖像進(jìn)行離散余弦變換。該函數(shù)將圖像數(shù)據(jù)從時(shí)域轉(zhuǎn)換到頻域,通常用于壓縮算法,如JPEG壓縮。idct
函數(shù):對(duì)頻域數(shù)據(jù)進(jìn)行逆變換,恢復(fù)到時(shí)域。
實(shí)際應(yīng)用
????????離散余弦變換在圖像壓縮中有廣泛的應(yīng)用。例如,在JPEG壓縮中,圖像被分割成8x8的塊,并對(duì)每個(gè)塊執(zhí)行DCT變換,然后進(jìn)行量化處理。
JPEG壓縮示例(簡(jiǎn)化版)
# 讀取圖像并轉(zhuǎn)換為灰度圖
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)
h, w = image.shape# 將圖像轉(zhuǎn)換為浮點(diǎn)型
image_float = np.float32(image) / 255.0# 分塊處理(8x8)
block_size = 8
dct_blocks = np.zeros_like(image_float)# 執(zhí)行DCT變換
for i in range(0, h, block_size):for j in range(0, w, block_size):block = image_float[i:i+block_size, j:j+block_size]dct_block = cv2.dct(block)dct_blocks[i:i+block_size, j:j+block_size] = dct_block# 顯示DCT變換后的圖像
cv2.imshow('DCT Blocks', dct_blocks)
cv2.waitKey(0)# 執(zhí)行逆DCT變換
idct_blocks = np.zeros_like(dct_blocks)
for i in range(0, h, block_size):for j in range(0, w, block_size):block = dct_blocks[i:i+block_size, j:j+block_size]idct_block = cv2.idct(block)idct_blocks[i:i+block_size, j:j+block_size] = idct_block# 將結(jié)果轉(zhuǎn)換回0-255范圍的圖像
idct_image = np.uint8(idct_blocks * 255)# 顯示逆變換后的圖像
cv2.imshow('IDCT Blocks', idct_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
????????通過這些示例,可以看到如何使用OpenCV中的DCT和IDCT函數(shù)來進(jìn)行離散余弦變換及其逆變換。根據(jù)具體的應(yīng)用需求,可以靈活運(yùn)用這些函數(shù)來實(shí)現(xiàn)復(fù)雜的圖像處理和壓縮任務(wù)。
二八、圖像幾何變換
????????在OpenCV中,幾何變換是圖像處理中的基本操作,包括旋轉(zhuǎn)、縮放、平移、透視變換等。下面介紹一些常用的幾何變換函數(shù)及其使用示例。
圖像幾何變換函數(shù) | ||||
logPolar | warpPolar | linearPolar | getAffineTransform | warpAffine |
對(duì)圖像進(jìn)行對(duì)數(shù)極坐標(biāo)變換 | 對(duì)圖像進(jìn)行極坐標(biāo)變換 | 對(duì)圖像進(jìn)行線性極坐標(biāo)變換 | 計(jì)算仿射變換矩陣 | 對(duì)圖像進(jìn)行仿射變換 |
invertAffineTransform | getPerspectiveTransform | warpPerspective | getRotationMatrix2D | |
計(jì)算仿射變換矩陣的逆矩陣 | 計(jì)算透視變換矩陣 | 對(duì)圖像進(jìn)行透視變換 | 計(jì)算二維旋轉(zhuǎn)矩陣 |
仿射變換 (warpAffine
和 getAffineTransform
)
import cv2
import numpy as np# 讀取圖像
image = cv2.imread('path_to_image.jpg')# 獲取圖像尺寸
rows, cols, ch = image.shape# 定義三個(gè)點(diǎn)及其對(duì)應(yīng)變換后的點(diǎn)
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])# 計(jì)算仿射變換矩陣
M = cv2.getAffineTransform(pts1, pts2)# 對(duì)圖像進(jìn)行仿射變換
dst = cv2.warpAffine(image, M, (cols, rows))cv2.imshow('Affine Transform', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
透視變換 (warpPerspective
和 getPerspectiveTransform
)
# 定義四個(gè)點(diǎn)及其對(duì)應(yīng)變換后的點(diǎn)
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])# 計(jì)算透視變換矩陣
M = cv2.getPerspectiveTransform(pts1, pts2)# 對(duì)圖像進(jìn)行透視變換
dst = cv2.warpPerspective(image, M, (300, 300))cv2.imshow('Perspective Transform', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
旋轉(zhuǎn)變換 (getRotationMatrix2D
)
# 定義旋轉(zhuǎn)中心、角度和縮放因子
center = (cols // 2, rows // 2)
angle = 45
scale = 1.0# 計(jì)算旋轉(zhuǎn)矩陣
M = cv2.getRotationMatrix2D(center, angle, scale)# 對(duì)圖像進(jìn)行旋轉(zhuǎn)變換
rotated = cv2.warpAffine(image, M, (cols, rows))cv2.imshow('Rotated Image', rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()
極坐標(biāo)變換 (warpPolar
和 linearPolar
)
# 極坐標(biāo)變換
polar_image = cv2.warpPolar(image, (cols, rows), (cols//2, rows//2), max(cols, rows) // 2, cv2.WARP_FILL_OUTLIERS)# 對(duì)數(shù)極坐標(biāo)變換
log_polar_image = cv2.logPolar(image, (cols//2, rows//2), 40, cv2.WARP_FILL_OUTLIERS)cv2.imshow('Polar Transform', polar_image)
cv2.imshow('Log Polar Transform', log_polar_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
????????這些示例展示了如何使用OpenCV中的幾何變換函數(shù)來處理圖像。根據(jù)具體的應(yīng)用需求,可以靈活運(yùn)用這些函數(shù)來實(shí)現(xiàn)復(fù)雜的圖像處理任務(wù)。