數字圖像處理(三)
- 一、(準備工作:咋玩,用什么玩具)圖像以矩陣形式存儲,那矩陣一變、圖像立刻跟著變?
- 1. Python + Jupyter Notebook/Lab + 庫 (NumPy, OpenCV, Matplotlib, scikit-image)
- 2. MATLAB + Image Processing Toolbox
- 3. JavaScript + HTML5 Canvas + 瀏覽器
- 4. 專業的圖像處理軟件 (帶腳本/插件功能)
- 二、(準備工作:玩具咋買咋裝)圖像以矩陣形式存儲,那矩陣一變、圖像立刻跟著變?
一、(準備工作:咋玩,用什么玩具)圖像以矩陣形式存儲,那矩陣一變、圖像立刻跟著變?
你好! 從LED冬奧會、奧運會及春晚等等大屏,到手機小屏,快來挖一挖里面都有什么。
為了不拘束各位看官,把各種玩法給大家列出來
1. Python + Jupyter Notebook/Lab + 庫 (NumPy, OpenCV, Matplotlib, scikit-image)
- 完全控制矩陣: 你直接操作的就是圖像對應的NumPy數組 (np.array)。每個像素值(R, G, B 或灰度)就是一個矩陣元素。
- 實時可視化: 在Jupyter Notebook中,一行代碼修改矩陣,下一行代碼就能用matplotlib.imshow()或cv2.imshow()顯示結果圖像,變化立竿見影。
- 強大的庫: OpenCV (cv2) 和 scikit-image (skimage) 提供了幾乎所有你能想到的圖像處理操作(本質都是矩陣運算),并且你能看到它們內部是如何操作矩陣的(或者你自己用NumPy實現)。
- 交互性 (可選): 結合ipywidgets庫,可以創建滑塊、按鈕等交互控件,動態調整矩陣參數(比如卷積核系數、閾值、亮度增益),圖像實時更新,效果極其直觀。
- 你可以實現翻轉(np.flip)、旋轉(np.rot90)、裁剪(切片[:, :])、顏色空間轉換(cv2.cvtColor)、卷積濾波(cv2.filter2D 或手動實現)、閾值分割(np.where)等等。每一步操作后顯示圖像,變化過程清晰可見。
比如
import cv2
import numpy as np
from matplotlib import pyplot as plt# 1. 讀取圖像為NumPy矩陣 (BGR格式)
image = cv2.imread('your_image.jpg') # 矩陣 shape: (height, width, 3)# 2. 顯示原始圖像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # OpenCV是BGR, matplotlib用RGB
plt.title('Original Image (Matrix)')# 3. 直接操作矩陣!例如,將紅色通道(R)置零
modified_image = image.copy() # 避免修改原圖
modified_image[:, :, 2] = 0 # 第3個維度索引2是OpenCV BGR中的R通道# 4. 顯示修改后的圖像
plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(modified_image, cv2.COLOR_BGR2RGB))
plt.title('Matrix Changed (Red Channel Zeroed)')
plt.show()
2. MATLAB + Image Processing Toolbox
-
優點: 如果你在學校或研究所有MATLAB可用,這也是一個非常好的選擇。
- 矩陣是核心: MATLAB本身就是為矩陣運算設計的語言。圖像直接表示為矩陣(或高維數組)。
- 強大的工具箱: Image Processing Toolbox 提供了極其豐富的圖像處理函數和優秀的可視化工具 (imshow, imtool)。
- 交互式工具: 像 imtool 允許你查看像素值、測量距離、調整窗寬窗位等,直接關聯底層矩陣。
- 豐富的文檔和示例: 學習資源多。
-
缺點:
- 商業軟件,需要許可證。
- 不如Python生態開放和通用。
3. JavaScript + HTML5 Canvas + 瀏覽器
- 優點: 如果你想創建一個網頁應用或交互式演示來展示圖像處理效果,這是最佳選擇。庫如p5.js可以簡化Canvas操作。
- 高度交互性和可視化: 非常適合構建在線的、交互式的圖像處理演示。用戶可以在網頁上直接操作,效果實時反饋。
- Canvas API: 可以通過ImageData對象直接訪問和操作像素數據(就是一個巨大的Uint8ClampedArray,本質是RGBA一維數組,需要轉換處理)。
- 缺點:
- 直接操作像素數組相對于NumPy操作多維矩陣來說,有時會更底層、更繁瑣一些(需要自己處理索引計算)。
- 對于復雜的數學運算和大型矩陣操作,性能可能不如Python或C++。
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const img = new Image();
img.onload = function() {// 繪制原圖ctx.drawImage(img, 0, 0);// 獲取圖像矩陣數據 (RGBA)const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);const data = imageData.data; // Uint8ClampedArray [R, G, B, A, R, G, B, A, ...]// 操作矩陣/像素數據:例如,反轉顏色for (let i = 0; i < data.length; i += 4) {data[i] = 255 - data[i]; // Reddata[i + 1] = 255 - data[i + 1]; // Greendata[i + 2] = 255 - data[i + 2]; // Blue// Alpha (data[i+3]) 保持不變}// 將修改后的矩陣數據放回Canvas,圖像立刻變化!ctx.putImageData(imageData, 0, 0);
};
img.src = 'your_image.jpg';
4. 專業的圖像處理軟件 (帶腳本/插件功能)
- 例如: GIMP (支持Python-Fu, Script-Fu), ImageJ/Fiji (Java宏, 腳本), Adobe Photoshop (JS腳本, 動作)
- 優點
- 提供直觀的GUI界面進行常規操作。
- 腳本/宏允許你編寫代碼自動化操作(本質上也是在操作像素矩陣)。
- 缺點
- 直接訪問和可視化底層矩陣不如Python/NumPy或MATLAB方便和透明。
- 腳本語言可能不如通用編程語言靈活。
二、(準備工作:玩具咋買咋裝)圖像以矩陣形式存儲,那矩陣一變、圖像立刻跟著變?
我是個懶蛋,懶得翻,所以就第一種了
- 安裝Anaconda(包含Python和Jupyter Notebook等科學計算庫):https://www.anaconda.com/products/individual
- 安裝OpenCV和Matplotlib(如果Anaconda沒有自帶):
在Anaconda Prompt中運行 pip install opencv-python matplotlib scikit-image or pip install opencv-python matplotlib numpy scikit-image ipywidgets pillow
下次開始玩玩具吧,這次先撂了
如果想了解一些成像系統、圖像、人眼、顏色等等的小知識,快去看看視頻吧 :
- GodWarrior、抖音號:59412983611
- B站:宇宙第一AIYWM
- 認準一個頭像,保你不迷路:
- 認準一個頭像,保你不迷路: