數字圖像處理(四:圖像如果當作矩陣,那加減乘除處理了矩陣,那圖像咋變):從LED冬奧會、奧運會及春晚等等大屏,到手機小屏,快來挖一挖里面都有什么

數字圖像處理(四)

  • 三、(準備工作:玩具咋玩)圖像以矩陣形式存儲,那矩陣一變、圖像立刻跟著變?
    • 原圖
    • 發揮了鈔能力之后的圖
      • 上述代碼包含 10 個圖像處理實驗,每個實驗會生成對應處理后的圖像,以下為各實驗對應生成圖像的大致情況:
        • 實驗 1:生成原始彩色圖像和灰度圖像,還會展示彩色與灰度圖像的矩陣切片信息。
        • 實驗 2:生成原始圖像、僅紅色通道、僅綠色通道、僅藍色通道、通道交換(BGR→RGB )、自定義通道組合(B + R + G )的圖像。
        • 實驗 3:生成原始灰度圖像,以及閾值為 50、100、150 的二值化圖像 。
        • 實驗 4:生成變暗(alpha = 0.7,beta = -20 )、原始、變亮(alpha = 1.3,beta = 30 )、高對比度(alpha = 1.8,beta = -50 )調整后的圖像。
        • 實驗 5:生成原始對比度、增強中間調(輸入范圍 [50,200]→輸出 [0,255] )、壓暗高光(輸入范圍 [0,200]→輸出 [0,255] )、提高陰影(輸入范圍 [50,255]→輸出 [0,255] )調整后的圖像。
        • 實驗 6:生成原始圖像、水平翻轉、垂直翻轉、對角線翻轉后的圖像。
        • 實驗 7:生成原始圖像、順時針 90° 旋轉、180° 旋轉、逆時針 90° 旋轉、45° 旋轉后的圖像,還有旋轉矩陣可視化圖。
        • 實驗 8:以不同插值方法(最近鄰、雙線性、區域重采樣 ),對圖像進行 0.5 倍、1.5 倍、2.0 倍縮放,會生成對應縮放后的多組圖像。
        • 實驗 9:生成原始圖像,以及經模糊、銳化、邊緣檢測、浮雕卷積濾波后的圖像。
        • 實驗 10:生成原始灰度圖像、Sobel X 方向梯度、Sobel Y 方向梯度、Sobel 梯度幅值、Canny 邊緣檢測的圖像,還有梯度矩陣原理說明圖 。

三、(準備工作:玩具咋玩)圖像以矩陣形式存儲,那矩陣一變、圖像立刻跟著變?

你好! 從LED冬奧會、奧運會及春晚等等大屏,到手機小屏,快來挖一挖里面都有什么。

廢話不多說,上圖,上代碼,再上新圖

原圖

在這里插入圖片描述

# %% [markdown]
# # 系統性圖像矩陣處理實驗
# **參考教材**:岡薩雷斯《數字圖像處理》、現代顏色技術原理、圖像畫質算法
# 
# 實驗順序:
# 1. 圖像加載與矩陣表示
# 2. 顏色通道分離與重組
# 3. 圖像二值化(閾值處理)
# 4. 亮度調整(矩陣標量乘法)
# 5. 對比度調整(矩陣線性變換)
# 6. 圖像翻轉(矩陣索引操作)
# 7. 圖像旋轉(矩陣轉置與重排)
# 8. 圖像縮放(矩陣重采樣)
# 9. 卷積濾波(矩陣卷積運算)
# 10. 邊緣檢測(梯度矩陣計算)# %% [code]
# 安裝必要庫
!pip install opencv-python matplotlib numpy scikit-image# %% [code]
import cv2
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files
from skimage import transform# 上傳圖像到Colab
uploaded = files.upload()
image_path = list(uploaded.keys())[0]# %% [markdown]
# ## 實驗1:圖像加載與矩陣表示
# **核心原理**:圖像本質是三維矩陣 [高度, 寬度, 通道]
# - 彩色圖像:3通道 (B, G, R)
# - 灰度圖像:單通道# %% [code]
# 實驗1:圖像加載與矩陣表示
def experiment1(img_path):# 讀取圖像為NumPy矩陣img = cv2.imread(img_path)print("? 圖像已加載為三維矩陣")print(f"矩陣形狀: {img.shape} (高度, 寬度, 通道)")print(f"矩陣數據類型: {img.dtype}")print(f"像素值范圍: {img.min()} ~ {img.max()}")# 顯示原始圖像plt.figure(figsize=(12, 6))# 彩色圖像顯示plt.subplot(121)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.title('原始彩色圖像')plt.axis('off')# 轉換為灰度圖像gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)print(f"\n灰度矩陣形狀: {gray_img.shape} (高度, 寬度)")# 灰度圖像顯示plt.subplot(122)plt.imshow(gray_img, cmap='gray')plt.title('灰度圖像矩陣')plt.axis('off')plt.tight_layout()plt.show()# 顯示矩陣切片(左上角10x10區域)print("\n🔍 彩色圖像左上角10x10x3矩陣切片:")print(img[:10, :10])print("\n🔍 灰度圖像左上角10x10矩陣切片:")print(gray_img[:10, :10])return img, gray_img# 執行實驗1
original_img, gray_img = experiment1(image_path)# %% [markdown]
# ## 實驗2:顏色通道分離與重組
# **核心原理**:彩色圖像由BGR三個通道矩陣組成
# - 分離通道:提取單通道矩陣
# - 重組通道:改變通道組合順序# %% [code]
# 實驗2:顏色通道分離與重組
def experiment2(img):# 分離BGR三個通道b, g, r = cv2.split(img)# 創建純色通道矩陣zero_channel = np.zeros_like(b)# 重組不同通道組合red_only = cv2.merge([zero_channel, zero_channel, r])green_only = cv2.merge([zero_channel, g, zero_channel])blue_only = cv2.merge([b, zero_channel, zero_channel])swapped_channels = cv2.merge([r, g, b])  # RGB順序# 可視化plt.figure(figsize=(15, 10))# 原始圖像plt.subplot(231)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.title('原始圖像')plt.axis('off')# 紅色通道plt.subplot(232)plt.imshow(cv2.cvtColor(red_only, cv2.COLOR_BGR2RGB))plt.title('僅紅色通道')plt.axis('off')# 綠色通道plt.subplot(233)plt.imshow(cv2.cvtColor(green_only, cv2.COLOR_BGR2RGB))plt.title('僅綠色通道')plt.axis('off')# 藍色通道plt.subplot(234)plt.imshow(cv2.cvtColor(blue_only, cv2.COLOR_BGR2RGB))plt.title('僅藍色通道')plt.axis('off')# 通道交換 (BGR → RGB)plt.subplot(235)plt.imshow(cv2.cvtColor(swapped_channels, cv2.COLOR_BGR2RGB))plt.title('通道交換 (BGR→RGB)')plt.axis('off')# 創建特殊通道組合custom_channels = cv2.merge([b, r, g])  # 藍+紅+綠plt.subplot(236)plt.imshow(cv2.cvtColor(custom_channels, cv2.COLOR_BGR2RGB))plt.title('自定義通道組合 (B+R+G)')plt.axis('off')plt.tight_layout()plt.show()# 矩陣變化說明print("\n🎨 通道分離與重組矩陣操作說明:")print("1. 分離通道: b, g, r = cv2.split(img)")print("2. 創建零矩陣: zero_channel = np.zeros_like(b)")print("3. 重組通道: cv2.merge([ch1, ch2, ch3])")print("4. 通道交換改變了顏色信息的排列順序")# 執行實驗2
experiment2(original_img)# %% [markdown]
# ## 實驗3:圖像二值化(閾值處理)
# **核心原理**:通過閾值將灰度矩陣轉換為二值矩陣
# - 矩陣元素值:0(黑) 或 255(白)
# - 公式:dst(x,y) = { 255 if src(x,y) > thresh else 0 }# %% [code]
# 實驗3:圖像二值化
def experiment3(gray_img):# 設置不同閾值thresholds = [50, 100, 150]plt.figure(figsize=(15, 8))# 原始灰度圖像plt.subplot(141)plt.imshow(gray_img, cmap='gray')plt.title('原始灰度圖像')plt.axis('off')# 不同閾值二值化for i, thresh in enumerate(thresholds):# 二值化矩陣操作_, binary_img = cv2.threshold(gray_img, thresh, 255, cv2.THRESH_BINARY)plt.subplot(1, 4, i+2)plt.imshow(binary_img, cmap='gray')plt.title(f'閾值={thresh}')plt.axis('off')# 打印矩陣變化信息print(f"\n🔲 閾值={thresh}時矩陣變化:")print(f"像素值>={thresh}的像素比例: {np.mean(binary_img == 255)*100:.1f}%")plt.tight_layout()plt.show()# 矩陣操作說明print("\n?? 二值化矩陣操作:")print("_, binary = cv2.threshold(gray_img, threshold_value, 255, cv2.THRESH_BINARY)")print("本質是: binary_matrix = np.where(gray_matrix >= threshold, 255, 0)")# 執行實驗3
experiment3(gray_img)# %% [markdown]
# ## 實驗4:亮度調整(矩陣標量乘法)
# **核心原理**:通過標量乘法調整整個矩陣值
# - 公式:dst = src * alpha + beta
# - alpha: 增益(控制對比度)
# - beta: 偏置(控制亮度)# %% [code]
# 實驗4:亮度調整
def experiment4(img):# 創建調整參數adjustments = [("變暗", 0.7, -20),("原始", 1.0, 0),("變亮", 1.3, 30),("高對比度", 1.8, -50)]plt.figure(figsize=(15, 10))for i, (title, alpha, beta) in enumerate(adjustments):# 矩陣運算: dst = img * alpha + betaadjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)# 可視化plt.subplot(2, 2, i+1)plt.imshow(cv2.cvtColor(adjusted, cv2.COLOR_BGR2RGB))plt.title(f'{title}\n(alpha={alpha}, beta={beta})')plt.axis('off')# 計算矩陣變化diff = adjusted.astype(np.float32) - img.astype(np.float32)print(f"\n💡 {title}矩陣變化統計:")print(f"平均亮度變化: {np.mean(diff):.1f}")print(f"最大亮度變化: {np.max(diff):.1f}")plt.tight_layout()plt.show()# 矩陣操作說明print("\n🔧 亮度調整矩陣操作:")print("adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)")print("等效于: adjusted_matrix = np.clip(img_matrix * alpha + beta, 0, 255).astype(np.uint8)")# 執行實驗4
experiment4(original_img)# %% [markdown]
# ## 實驗5:對比度調整(矩陣線性變換)
# **核心原理**:通過分段線性變換調整對比度
# - 增強特定亮度范圍的對比度
# - 壓縮其他范圍的對比度# %% [code]
# 實驗5:對比度調整
def experiment5(img):# 創建對比度調整矩陣操作def adjust_contrast(matrix, low=0, high=255, new_low=0, new_high=255):# 線性變換公式slope = (new_high - new_low) / (high - low)adjusted = matrix.astype(np.float32)adjusted = (adjusted - low) * slope + new_lowreturn np.clip(adjusted, 0, 255).astype(np.uint8)# 創建調整參數adjustments = [("原始對比度", 0, 255, 0, 255),("增強中間調", 50, 200, 0, 255),("壓暗高光", 0, 200, 0, 255),("提高陰影", 50, 255, 0, 255)]plt.figure(figsize=(15, 10))for i, (title, low, high, new_low, new_high) in enumerate(adjustments):adjusted = adjust_contrast(img, low, high, new_low, new_high)# 可視化plt.subplot(2, 2, i+1)plt.imshow(cv2.cvtColor(adjusted, cv2.COLOR_BGR2RGB))plt.title(f'{title}\n輸入范圍:[{low},{high}]→輸出:[{new_low},{new_high}]')plt.axis('off')# 打印變換函數print(f"\n📊 {title}變換函數:")print(f"y = (x - {low}) * {(new_high-new_low)/(high-low):.2f} + {new_low}")plt.tight_layout()plt.show()# 執行實驗5
experiment5(original_img)# %% [markdown]
# ## 實驗6:圖像翻轉(矩陣索引操作)
# **核心原理**:通過矩陣索引重排實現圖像翻轉
# - 水平翻轉:matrix[:, ::-1, :]
# - 垂直翻轉:matrix[::-1, :, :]
# - 對角線翻轉:matrix[::-1, ::-1, :]# %% [code]
# 實驗6:圖像翻轉
def experiment6(img):# 矩陣翻轉操作flip_horizontal = img[:, ::-1, :]  # 水平翻轉flip_vertical = img[::-1, :, :]    # 垂直翻轉flip_both = img[::-1, ::-1, :]     # 對角線翻轉plt.figure(figsize=(15, 10))# 原始圖像plt.subplot(221)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.title('原始圖像')plt.axis('off')# 水平翻轉plt.subplot(222)plt.imshow(cv2.cvtColor(flip_horizontal, cv2.COLOR_BGR2RGB))plt.title('水平翻轉 (矩陣列索引反轉)')plt.axis('off')# 垂直翻轉plt.subplot(223)plt.imshow(cv2.cvtColor(flip_vertical, cv2.COLOR_BGR2RGB))plt.title('垂直翻轉 (矩陣行索引反轉)')plt.axis('off')# 對角線翻轉plt.subplot(224)plt.imshow(cv2.cvtColor(flip_both, cv2.COLOR_BGR2RGB))plt.title('對角線翻轉 (行列索引同時反轉)')plt.axis('off')plt.tight_layout()plt.show()# 矩陣操作說明print("\n🔄 翻轉矩陣操作說明:")print("水平翻轉: flipped = img[:, ::-1, :]")print("垂直翻轉: flipped = img[::-1, :, :]")print("對角線翻轉: flipped = img[::-1, ::-1, :]")print("原理:通過NumPy索引操作重新排列像素位置")# 執行實驗6
experiment6(original_img)# %% [markdown]
# ## 實驗7:圖像旋轉(矩陣轉置與重排)
# **核心原理**:通過旋轉矩陣進行坐標變換
# - 90°旋轉:矩陣轉置 + 翻轉
# - 任意角度:仿射變換矩陣# %% [code]
# 實驗7:圖像旋轉
def experiment7(img):# 90°倍數旋轉rotate_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)       # 順時針90°rotate_180 = cv2.rotate(img, cv2.ROTATE_180)               # 180°rotate_270 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)  # 逆時針90°# 任意角度旋轉(45°)h, w = img.shape[:2]center = (w//2, h//2)M = cv2.getRotationMatrix2D(center, 45, 1.0)  # 旋轉矩陣rotate_45 = cv2.warpAffine(img, M, (w, h))plt.figure(figsize=(15, 12))# 原始圖像plt.subplot(231)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.title('原始圖像')plt.axis('off')# 90°旋轉plt.subplot(232)plt.imshow(cv2.cvtColor(rotate_90, cv2.COLOR_BGR2RGB))plt.title('順時針90°旋轉')plt.axis('off')# 180°旋轉plt.subplot(233)plt.imshow(cv2.cvtColor(rotate_180, cv2.COLOR_BGR2RGB))plt.title('180°旋轉')plt.axis('off')# 270°旋轉plt.subplot(234)plt.imshow(cv2.cvtColor(rotate_270, cv2.COLOR_BGR2RGB))plt.title('逆時針90°旋轉')plt.axis('off')# 任意角度旋轉plt.subplot(235)plt.imshow(cv2.cvtColor(rotate_45, cv2.COLOR_BGR2RGB))plt.title('45°旋轉')plt.axis('off')# 旋轉矩陣可視化plt.subplot(236)plt.text(0.1, 0.5, f"旋轉矩陣(45°):\n{M}", fontsize=12)plt.axis('off')plt.tight_layout()plt.show()# 矩陣操作說明print("\n🔄 旋轉矩陣操作說明:")print("90°旋轉: 使用cv2.rotate()函數")print("任意角度: 創建旋轉矩陣 + cv2.warpAffine()")print("旋轉矩陣本質是坐標變換: x' = a*x + b*y + c, y' = d*x + e*y + f")# 執行實驗7
experiment7(original_img)# %% [markdown]
# ## 實驗8:圖像縮放(矩陣重采樣)
# **核心原理**:通過插值算法重新采樣矩陣
# - 最近鄰插值:快速,有鋸齒
# - 雙線性插值:平滑,質量較好
# - 區域重采樣:保持紋理特征# %% [code]
# 實驗8:圖像縮放
def experiment8(img):# 設置縮放比例scale_factors = [0.5, 1.5, 2.0]methods = [("最近鄰", cv2.INTER_NEAREST),("雙線性", cv2.INTER_LINEAR),("區域重采樣", cv2.INTER_AREA)]plt.figure(figsize=(15, 12))# 原始圖像plt.subplot(331)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.title('原始圖像')plt.axis('off')# 不同縮放方法row = 1for scale in scale_factors:for col, (name, interp) in enumerate(methods):# 計算新尺寸new_size = (int(img.shape[1] * scale), int(img.shape[0] * scale)# 執行縮放resized = cv2.resize(img, new_size, interpolation=interp)# 可視化plt.subplot(3, 3, row)plt.imshow(cv2.cvtColor(resized, cv2.COLOR_BGR2RGB))plt.title(f'{name}縮放 {scale}x')plt.axis('off')# 顯示矩陣信息print(f"\n🖼? {name}縮放 {scale}x: 新矩陣形狀 {resized.shape}")row += 1plt.tight_layout()plt.show()# 矩陣操作說明print("\n📐 縮放矩陣操作說明:")print("縮放本質是重采樣: 根據新尺寸重新計算每個像素值")print("不同插值方法影響重采樣質量:")print("1. 最近鄰: 取最近像素值,速度快但質量低")print("2. 雙線性: 4個最近像素加權平均,平衡速度質量")print("3. 區域重采樣: 考慮像素區域關系,適合縮小圖像")# 執行實驗8
experiment8(original_img)# %% [markdown]
# ## 實驗9:卷積濾波(矩陣卷積運算)
# **核心原理**:使用核矩陣與圖像進行卷積運算
# - 濾波核:3x3或5x5矩陣
# - 卷積操作:核矩陣與圖像局部區域點乘后求和# %% [code]
# 實驗9:卷積濾波
def experiment9(img):# 定義濾波核kernels = {"模糊": np.ones((5,5), np.float32)/25,"銳化": np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32),"邊緣檢測": np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], np.float32),"浮雕": np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]], np.float32)}plt.figure(figsize=(15, 10))# 原始圖像plt.subplot(231)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.title('原始圖像')plt.axis('off')# 應用不同濾波器for i, (name, kernel) in enumerate(kernels.items()):# 執行卷積filtered = cv2.filter2D(img, -1, kernel)# 可視化plt.subplot(2, 3, i+2)plt.imshow(cv2.cvtColor(filtered, cv2.COLOR_BGR2RGB))plt.title(f'{name}濾波')plt.axis('off')# 顯示核矩陣print(f"\n🔶 {name}濾波核:")print(kernel)plt.tight_layout()plt.show()# 矩陣操作說明print("\n🌀 卷積濾波矩陣操作說明:")print("卷積公式: dst(x,y) = Σ(kernel(i,j) * src(x+i, y+j))")print("本質:核矩陣在圖像上滑動,計算局部區域的加權和")# 執行實驗9
experiment9(original_img)# %% [markdown]
# ## 實驗10:邊緣檢測(梯度矩陣計算)
# **核心原理**:通過計算圖像梯度矩陣檢測邊緣
# - Sobel算子:計算x/y方向梯度
# - Canny算法:多階段邊緣檢測# %% [code]
# 實驗10:邊緣檢測
def experiment10(gray_img):# Sobel邊緣檢測sobel_x = cv2.Sobel(gray_img, cv2.CV_64F, 1, 0, ksize=5)sobel_y = cv2.Sobel(gray_img, cv2.CV_64F, 0, 1, ksize=5)sobel_combined = np.sqrt(sobel_x**2 + sobel_y**2)# Canny邊緣檢測edges = cv2.Canny(gray_img, 100, 200)plt.figure(figsize=(15, 10))# 原始灰度圖像plt.subplot(231)plt.imshow(gray_img, cmap='gray')plt.title('原始灰度圖像')plt.axis('off')# Sobel X方向plt.subplot(232)plt.imshow(np.abs(sobel_x), cmap='gray')plt.title('Sobel X方向梯度')plt.axis('off')# Sobel Y方向plt.subplot(233)plt.imshow(np.abs(sobel_y), cmap='gray')plt.title('Sobel Y方向梯度')plt.axis('off')# Sobel組合plt.subplot(234)plt.imshow(sobel_combined, cmap='gray')plt.title('Sobel梯度幅值')plt.axis('off')# Canny邊緣檢測plt.subplot(235)plt.imshow(edges, cmap='gray')plt.title('Canny邊緣檢測')plt.axis('off')# 梯度矩陣說明plt.subplot(236)plt.text(0.1, 0.4, "梯度矩陣計算原理:\n""Gx = Sobel_x * I (水平變化率)\n""Gy = Sobel_y * I (垂直變化率)\n""|G| = √(Gx2 + Gy2)\n""Canny算法使用雙閾值檢測邊緣",fontsize=12)plt.axis('off')plt.tight_layout()plt.show()# 矩陣操作說明print("\n📈 邊緣檢測矩陣操作說明:")print("Sobel算子:計算圖像在x/y方向的導數")print("Canny算法:高斯濾波 → 梯度計算 → 非極大值抑制 → 雙閾值檢測")# 執行實驗10
experiment10(gray_img)# %% [markdown]
# ## 知識體系總結
# 通過以上10個實驗,我們系統性地學習了:
# 
# 1. **圖像本質**:圖像即矩陣(三維:高度×寬度×通道)
# 2. **基礎操作**:通道分離、二值化、亮度/對比度調整
# 3. **幾何變換**:翻轉、旋轉、縮放(矩陣索引與重采樣)
# 4. **圖像增強**:線性變換、卷積濾波
# 5. **特征提取**:邊緣檢測(梯度計算)
# 
# > 掌握這些核心矩陣操作后,您可以自由組合創造更復雜的圖像處理效果!# %% [code]
# 保存所有實驗代碼到文件
with open('image_matrix_experiments.py', 'w') as f:f.write("""
# 圖像矩陣處理實驗完整代碼
# 包含10個核心實驗,可直接運行
import cv2
import numpy as np
import matplotlib.pyplot as plt
# ...(此處包含上面所有實驗函數)""")# 下載代碼文件
files.download('image_matrix_experiments.py')

發揮了鈔能力之后的圖

在這里插入圖片描述

上述代碼包含 10 個圖像處理實驗,每個實驗會生成對應處理后的圖像,以下為各實驗對應生成圖像的大致情況:

實驗 1:生成原始彩色圖像和灰度圖像,還會展示彩色與灰度圖像的矩陣切片信息。
實驗 2:生成原始圖像、僅紅色通道、僅綠色通道、僅藍色通道、通道交換(BGR→RGB )、自定義通道組合(B + R + G )的圖像。
實驗 3:生成原始灰度圖像,以及閾值為 50、100、150 的二值化圖像 。
實驗 4:生成變暗(alpha = 0.7,beta = -20 )、原始、變亮(alpha = 1.3,beta = 30 )、高對比度(alpha = 1.8,beta = -50 )調整后的圖像。
實驗 5:生成原始對比度、增強中間調(輸入范圍 [50,200]→輸出 [0,255] )、壓暗高光(輸入范圍 [0,200]→輸出 [0,255] )、提高陰影(輸入范圍 [50,255]→輸出 [0,255] )調整后的圖像。
實驗 6:生成原始圖像、水平翻轉、垂直翻轉、對角線翻轉后的圖像。
實驗 7:生成原始圖像、順時針 90° 旋轉、180° 旋轉、逆時針 90° 旋轉、45° 旋轉后的圖像,還有旋轉矩陣可視化圖。
實驗 8:以不同插值方法(最近鄰、雙線性、區域重采樣 ),對圖像進行 0.5 倍、1.5 倍、2.0 倍縮放,會生成對應縮放后的多組圖像。
實驗 9:生成原始圖像,以及經模糊、銳化、邊緣檢測、浮雕卷積濾波后的圖像。
實驗 10:生成原始灰度圖像、Sobel X 方向梯度、Sobel Y 方向梯度、Sobel 梯度幅值、Canny 邊緣檢測的圖像,還有梯度矩陣原理說明圖 。

鄧爺爺也說過,理論和實際相結合嘛。咱們做了一波實驗,然后再學點理論,再做實驗…反反復復,這快慢慢隨著我的老年斑的增長,經驗值是不是就上來了

如果想了解一些成像系統、圖像、人眼、顏色等等的小知識,快去看看視頻吧 :

  • GodWarrior、抖音號:59412983611
  • B站:宇宙第一AIYWM
    • 認準一個頭像,保你不迷路:
      在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915914.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot航空訂票系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBoot持久層框架Hibernate成功系統案例:代碼參考數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸出高質…

2025年PostgreSQL 詳細安裝教程(windows)

前言 PostgreSQL 是一個功能強大的開源關系型數據庫管理系統(ORDBMS),以下是對它的全面介紹: 基本概況 名稱:通常簡稱為 "Postgres" 類型:對象-關系型數據庫管理系統 許可:開源,采用類MIT許可…

Java日志按天切分方法

使用 Logrotate(推薦)Logrotate 是 Linux 系統自帶的日志管理工具,支持自動切割、壓縮和刪除舊日志。步驟:創建 Logrotate 配置文件在 /etc/logrotate.d/ 下新建配置文件(如 java-app):sudo nan…

進階向:基于Python的本地文件內容搜索工具

概述 大家好!今天我們將一起學習如何用Python創建一個簡單但強大的本地文件內容搜索工具。這個工具特別適合處理大量文本文件時的快速檢索需求。 為什么要學習這個工具 如果你剛接觸編程,完全不用擔心!我會從零開始講解,確保每…

多模態AI的可解釋性

多模態AI的可解釋性挑戰 在深入探討解決方案之前,首先需要精確地定義問題。多模態模型因其固有的復雜性,其內部決策過程對于人類觀察者而言是不透明的。 模態融合機制 (Modal Fusion Mechanism):模型必須將來自不同來源(如圖像和文…

MySQL深度理解-MySQL事務優化

1.什么是事務事務就是進行多個操作,要么同時執行成功,要么同時執行失敗。2.事務的特性 - ACID特性2.1原子性Atomicity原子性(Atomicity):當前事務的操作要么同時成功,要么同時失敗。原子性由undo log日志來…

2025小學所有學習科目的全部版本電子教材

2025春小學最新課本-新版電子教材【文末自行獲取全部資料~】 小學語文: 小學數學: 小學英語: 小學科學: 小學道德與法治: 小學勞動技術: 小學美術: 小學書法練習指導: 小學體育與健康…

華為視覺算法面試30問全景精解

華為視覺算法面試30問全景精解 ——技術引領 工程極致 智能未來:華為視覺算法面試核心考點全覽 前言 華為作為全球領先的ICT(信息與通信技術)解決方案供應商,在智能終端、云計算、智慧城市、自動駕駛、工業互聯網等領域持續推動視覺AI的創新與產業落地。華為視覺算法崗…

【Anaconda】Conda 虛擬環境打包遷移教程

Conda 虛擬環境打包遷移教程本文介紹如何使用 conda-pack 將 Conda 虛擬環境打包,并在另一臺電腦上快速遷移、部署。0. 安裝 conda-pack conda-pack 并非 Conda 默認自帶工具,首次使用前必須手動安裝。以下兩種安裝方式任選其一即可: ? 方法…

matrix-breakout-2-morpheus靶機通關教程

目錄 一、信息搜集 二、嘗試GetShell 三、反彈Shell 一、信息搜集 首先搜集信息,觀察頁面。 發現什么都沒有,我們先來發現一下它的IP以及開放的端口。首先我們觀察一下它的網絡模式是怎么樣的,來確定IP段。 可以發現他是NAT模式&#xff0…

深入思考【九九八十一難】的意義,試用歌曲能否解釋

1. 《平凡之路》- 樸樹契合點:前半生追求明白:“我曾經失落失望失掉所有方向,直到看見平凡才是唯一的答案”。后半生修行糊涂:“時間無言,如此這般,明天已在眼前”。對過去的釋然與對未來的隨緣&#xff0c…

SSM之表現層數據封裝-統一響應格式全局異常處理

SSM之表現層數據封裝-統一響應格式&全局異常處理一、為什么需要表現層數據封裝?二、表現層數據封裝的通用格式成功響應示例失敗響應示例三、SSM中實現統一響應對象3.1 定義響應對象類(Result.java)四、全局異常處理4.1 實現全局異常處理器…

微軟Fabric重塑數據管理:Forrester報告揭示高ROI

在數字化轉型加速的今天,微軟公司推出的Microsoft Fabric數據管理平臺正以其卓越的經濟效益和全面的技術能力引領行業變革。根據Forrester Consulting最新發布的總體經濟影響(TEI)研究報告,該平臺展現出令人矚目的商業價值:實現379%的投資回報…

基于Qt和OpenCV的圖片與視頻編輯器

應用技術:Qt C、OpenCV、多線程、單例模式,qss樣式表、OpenGL、ffmpeg。 本項目為Qt mingw6.5.3版本,QtCreator編寫運行。 void XVideoWidget::do_setImage(cv::Mat mat) {QImage::Format fmt QImage::Format_RGB888;int pixSize 3;//處理…

NOTEPAD!NPCommand函數分析之comdlg32!GetSaveFileNameW--windows記事本源代碼分析

第一部分:kd> kcUSER32!InternalCallWinProc USER32!UserCallDlgProcCheckWow USER32!DefDlgProcWorker USER32!SendMessageWorker USER32!InternalCreateDialog USER32!InternalDialogBox USER32!DialogBoxIndirectParamAorW USER32!DialogBoxIndirectParamW US…

【Qt開發】信號與槽(一)

目錄 1 -> 信號和槽概述 1.1 -> 信號的本質 1.2 -> 槽的本質 2 -> 信號與槽的連接方式 2.1 -> 一對一 2.2 -> 一對多 2.3 -> 多對一 3 -> 小結 1 -> 信號和槽概述 在 Qt 中,用戶和控件的每次交互過程稱為一個事件。比如 “用戶…

目標檢測中的標簽分配算法總結

目標檢測中的標簽分配算法是訓練過程中的一個核心環節,它決定了如何將標注好的真實目標框分配給模型預測出來的候選框(Anchor Boxes或Points),從而為這些候選框提供監督信號(正樣本、負樣本、忽略樣本)。它…

圖片轉 PDF三個免費方法總結

📌 為什么需要圖片轉 PDF? 在工作和生活中,我們經常需要將多張圖片整理成 PDF 文檔,例如:工作資料歸檔, 學習筆記整理,作品集展示,便捷分享。 方法一、iLoveOFD在線工具 提供圖片…

Kafka 在分布式系統中的關鍵特性與機制深度解析

在分布式系統架構中,消息中間件扮演著 "數據樞紐" 的核心角色,而 Kafka 憑借其卓越的性能和可靠性,成為眾多企業的首選。本文將深入剖析 Kafka 在分布式環境中的核心特性與底層機制,揭示其高吞吐、高可用的底層邏輯。一…

Python實戰:基于Streamlit的股票篩選系統,實時K線圖+數據緩存優化

基于 Streamlit 構建的股票篩選分析工具,整合了 Tushare 接口獲取股票數據,并通過交互式界面實現股票篩選、信息展示和 K 線圖分析。以下是深度解讀:一、代碼結構概覽依賴庫導入import streamlit as st import tushare as ts import pandas a…