Python中OpenCV與Matplotlib的圖像操作入門指南
一、環(huán)境準(zhǔn)備
import cv2 import numpy as np import matplotlib.pyplot as plt # 配置中文字體顯示(可選) plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
二、圖像的基本操作
1. 圖像讀取、顯示與保存 使用OpenCV操作
# 讀取圖像(支持多種格式) img = cv2.imread('example.jpg') print(f"圖像尺寸: {img.shape}") # 輸出:(高度, 寬度, 通道數(shù)) # 顯示圖像 cv2.imshow('OpenCV Window', img) cv2.waitKey(0) # 等待按鍵 cv2.destroyAllWindows() # 保存圖像 cv2.imwrite('output.jpg', img) # 自動(dòng)保存為JPG格式
使用Matplotlib操作
# 讀取并顯示圖像 plt.figure(figsize=(10,5)) img_plt = plt.imread('example.png') # 自動(dòng)歸一化到[0,1] plt.subplot(121) plt.imshow(img_plt) plt.title('Matplotlib顯示') # OpenCV與Matplotlib顏色空間差異 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR轉(zhuǎn)RGB plt.subplot(122) plt.imshow(img_rgb) plt.title('OpenCV轉(zhuǎn)RGB顯示') plt.show()
?? 注意事項(xiàng):
OpenCV讀取的像素值范圍是[0,255],Matplotlib自動(dòng)歸一化到[0,1]路徑含中文時(shí)需使用cv2.imdecode
特殊處理保存質(zhì)量可通過(guò)參數(shù)控制(如cv2.imwrite('out.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
)
2. 像素級(jí)操作
單個(gè)像素訪問(wèn)與修改
# 訪問(wèn)特定位置像素值 px = img[100, 50] # 獲取坐標(biāo)(50,100)處像素值 print(f"Blue={px[0]}, Green={px[1]}, Red={px[2]}") # 修改像素值 img[100, 50] = [0, 255, 0] # 將該位置改為綠色
區(qū)域像素操作
# 提取ROI區(qū)域(感興趣區(qū)域) roi = img[50:150, 100:200] # 批量修改像素值 img[200:300, 300:400] = [0, 0, 255] # 填充紅色矩形
像素值統(tǒng)計(jì)分析
print(f"最大像素值: {img.max()}") print(f"最小像素值: {img.min()}") print(f"平均像素值: {img.mean()}")
3. 通道操作
通道分離與合并
# 分離通道(OpenCV方式) b, g, r = cv2.split(img) cv2.imshow('Blue Channel', b) # 合并通道 merged = cv2.merge([b, g, r]) # 直接操作特定通道(Numpy方式) img_copy = img.copy() img_copy[:, :, 0] = 0 # 清空藍(lán)色通道
多光譜分析示例
# 顯示各通道灰度圖 plt.figure(figsize=(12, 3)) for i, ch in enumerate(['Blue', 'Green', 'Red']): plt.subplot(1,3,i+1) plt.imshow(cv2.split(img)[i], cmap='gray') plt.title(f'{ch}通道') plt.axis('off') plt.show()
三、完整實(shí)踐案例
def image_processing_pipeline(path): # 1. 圖像讀取 src = cv2.imread(path) if src is None: print("錯(cuò)誤:無(wú)法讀取圖像!") return # 2. 通道分析 b, g, r = cv2.split(src) # 3. 創(chuàng)建特殊效果 special_effect = src.copy() special_effect[:, :, 1] = cv2.add(special_effect[:, :, 1], 50) # 增強(qiáng)綠色通道 # 4. 結(jié)果展示 plt.figure(figsize=(15, 5)) plt.subplot(141) plt.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB)) plt.title('原圖') plt.subplot(142) plt.imshow(r, cmap='gray') plt.title('紅色通道') plt.subplot(143) plt.imshow(special_effect[:, :, [2,1,0]]) plt.title('增強(qiáng)綠色通道') plt.subplot(144) plt.imshow(b, cmap='viridis') # 使用不同色圖 plt.title('藍(lán)色通道(Viridis色圖)') plt.tight_layout() plt.show() # 執(zhí)行處理流程 image_processing_pipeline('test_image.jpg')
四、性能優(yōu)化技巧
向量化操作替代循環(huán):
# 推薦方式(Numpy向量化) start_time = cv2.getTickCount() brighter = cv2.add(img, np.array([30])) print(f"耗時(shí):{(cv2.getTickCount() - start_time)/cv2.getTickFrequency():.4f}s") # 不推薦方式(雙重循環(huán)) start_time = cv2.getTickCount() for y in range(img.shape[0]): for x in range(img.shape[1]): img[y,x] = np.clip(img[y,x] + 30, 0, 255) print(f"耗時(shí):{(cv2.getTickCount() - start_time)/cv2.getTickFrequency():.4f}s")
內(nèi)存連續(xù)性優(yōu)化:
# 檢查數(shù)組內(nèi)存布局 if not img.flags.c_contiguous: img = np.ascontiguousarray(img)
五、常見問(wèn)題解決方案
圖像無(wú)法顯示:
- 檢查路徑是否包含中文/特殊字符
- 確認(rèn)圖像尺寸是否超過(guò)屏幕分辨率
- 嘗試使用
cv2.resizeWindow()
調(diào)整窗口大小
顏色顯示異常:
# 統(tǒng)一顏色空間轉(zhuǎn)換 def show_image統(tǒng)一(img_bgr, title='Image'): plt.imshow(cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)) plt.title(title) plt.axis('off') plt.show()
大圖像處理:
# 金字塔下采樣 pyramid = cv2.pyrDown(img) print(f"下采樣后尺寸:{pyramid.shape}")
六、擴(kuò)展學(xué)習(xí)方向
進(jìn)階操作:
- 使用
cv2.LUT()
實(shí)現(xiàn)色彩查找表變換 - 掩膜操作(mask)進(jìn)行區(qū)域處理
- 利用Numpy數(shù)組的布爾索引進(jìn)行條件修改
性能提升:
- 使用OpenCV內(nèi)置函數(shù)替代Python循環(huán)
- 多線程處理圖像塊
- CUDA加速(需安裝opencv-contrib-python包)
實(shí)際應(yīng)用:
- 圖像增強(qiáng):直方圖均衡化、CLAHE算法
- 顏色空間轉(zhuǎn)換:HSV/YUV等
- 形態(tài)學(xué)操作:腐蝕、膨脹
通過(guò)掌握這些基礎(chǔ)操作,您將為后續(xù)的圖像處理學(xué)習(xí)打下堅(jiān)實(shí)基礎(chǔ)。建議通過(guò)實(shí)際項(xiàng)目(如證件照背景替換、圖像特效制作)加深理解。
下一篇我們將進(jìn)入圖像的「幾何變換世界」,學(xué)習(xí)如何用數(shù)學(xué)矩陣實(shí)現(xiàn)圖像的平移、旋轉(zhuǎn)、縮放,以及不同插值算法對(duì)圖像質(zhì)量的影響?,F(xiàn)在請(qǐng)打開你的圖像,嘗試裁剪一個(gè)有趣的ROI區(qū)域并修改它的顏色吧!
思考:為什么對(duì)大尺寸圖像使用
cv2.split()
會(huì)更耗內(nèi)存?如何用NumPy實(shí)現(xiàn)更高效的通道分離?
到此這篇關(guān)于Python中OpenCV與Matplotlib的圖像操作指南的文章就介紹到這了,更多相關(guān)Python OpenCV與Matplotlib圖像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python讀取并顯示圖片的三種方法(opencv、matplotlib、PIL庫(kù))
- Python應(yīng)用案例之利用opencv實(shí)現(xiàn)圖像匹配
- Python?opencv圖像膨脹與腐蝕處理實(shí)例探究
- Python中的OpenCV圖像腐蝕處理和膨脹處理
- Python?matplotlib繪圖時(shí)使用鼠標(biāo)滾輪放大/縮小圖像
- Python?matplotlib繪圖時(shí)指定圖像大小及放大圖像詳解
- 利用Python?NumPy庫(kù)及Matplotlib庫(kù)繪制數(shù)學(xué)函數(shù)圖像
- Python+Matplotlib實(shí)現(xiàn)給圖像添加文本標(biāo)簽與注釋
相關(guān)文章
python網(wǎng)絡(luò)爬蟲學(xué)習(xí)筆記(1)
這篇文章主要為大家詳細(xì)介紹了python網(wǎng)絡(luò)爬蟲學(xué)習(xí)筆記的第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04解決python3 Pycharm上連接數(shù)據(jù)庫(kù)時(shí)報(bào)錯(cuò)的問(wèn)題
今天小編就為大家分享一篇解決python3 Pycharm上連接數(shù)據(jù)庫(kù)時(shí)報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python用win32gui遍歷窗口并設(shè)置窗口位置的方法
今天小編就為大家分享一篇python用win32gui遍歷窗口并設(shè)置窗口位置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07Python實(shí)現(xiàn)一鍵PDF轉(zhuǎn)Word(附完整代碼及詳細(xì)步驟)
pdf2docx 是一個(gè)基于 Python 的第三方庫(kù),專門用于將 PDF 文件轉(zhuǎn)換為可編輯的 Word 文檔,下面我們就來(lái)看看如何通過(guò)pdf2docx實(shí)現(xiàn)一鍵將PDF轉(zhuǎn)為Word吧2025-05-05python 進(jìn)程的幾種創(chuàng)建方式詳解
這篇文章主要介紹了python 進(jìn)程的幾種創(chuàng)建方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08動(dòng)態(tài)創(chuàng)建類實(shí)例代碼
Python中要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,要首先導(dǎo)入該類或者該類所屬的模塊。2009-10-10