【圖像處理入門】2. Python中OpenCV與Matplotlib的圖像操作指南

在這里插入圖片描述

一、環境準備

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}")  # 輸出:(高度, 寬度, 通道數)# 顯示圖像
cv2.imshow('OpenCV Window', img)
cv2.waitKey(0)  # 等待按鍵
cv2.destroyAllWindows()# 保存圖像
cv2.imwrite('output.jpg', img)  # 自動保存為JPG格式
使用Matplotlib操作
# 讀取并顯示圖像
plt.figure(figsize=(10,5))
img_plt = plt.imread('example.png')  # 自動歸一化到[0,1]
plt.subplot(121)
plt.imshow(img_plt)
plt.title('Matplotlib顯示')# OpenCV與Matplotlib顏色空間差異
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # BGR轉RGB
plt.subplot(122)
plt.imshow(img_rgb)
plt.title('OpenCV轉RGB顯示')
plt.show()

?? 注意事項:

  1. OpenCV讀取的像素值范圍是[0,255],Matplotlib自動歸一化到[0,1]
  2. 路徑含中文時需使用cv2.imdecode特殊處理
  3. 保存質量可通過參數控制(如cv2.imwrite('out.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 90])

2. 像素級操作

單個像素訪問與修改
# 訪問特定位置像素值
px = img[100, 50]  # 獲取坐標(50,100)處像素值
print(f"Blue={px[0]}, Green={px[1]}, Red={px[2]}")# 修改像素值
img[100, 50] = [0, 255, 0]  # 將該位置改為綠色
區域像素操作
# 提取ROI區域(感興趣區域)
roi = img[50:150, 100:200]# 批量修改像素值
img[200:300, 300:400] = [0, 0, 255]  # 填充紅色矩形
像素值統計分析
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  # 清空藍色通道
多光譜分析示例
# 顯示各通道灰度圖
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()

三、完整實踐案例

def image_processing_pipeline(path):# 1. 圖像讀取src = cv2.imread(path)if src is None:print("錯誤:無法讀取圖像!")return# 2. 通道分析b, g, r = cv2.split(src)# 3. 創建特殊效果special_effect = src.copy()special_effect[:, :, 1] = cv2.add(special_effect[:, :, 1], 50)  # 增強綠色通道# 4. 結果展示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('增強綠色通道')plt.subplot(144)plt.imshow(b, cmap='viridis')  # 使用不同色圖plt.title('藍色通道(Viridis色圖)')plt.tight_layout()plt.show()# 執行處理流程
image_processing_pipeline('test_image.jpg')

四、性能優化技巧

  1. 向量化操作替代循環
# 推薦方式(Numpy向量化)
start_time = cv2.getTickCount()
brighter = cv2.add(img, np.array([30]))
print(f"耗時:{(cv2.getTickCount() - start_time)/cv2.getTickFrequency():.4f}s")# 不推薦方式(雙重循環)
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"耗時:{(cv2.getTickCount() - start_time)/cv2.getTickFrequency():.4f}s")
  1. 內存連續性優化
# 檢查數組內存布局
if not img.flags.c_contiguous:img = np.ascontiguousarray(img)

五、常見問題解決方案

  1. 圖像無法顯示

    • 檢查路徑是否包含中文/特殊字符
    • 確認圖像尺寸是否超過屏幕分辨率
    • 嘗試使用cv2.resizeWindow()調整窗口大小
  2. 顏色顯示異常

    # 統一顏色空間轉換
    def show_image統一(img_bgr, title='Image'):plt.imshow(cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB))plt.title(title)plt.axis('off')plt.show()
    
  3. 大圖像處理

    # 金字塔下采樣
    pyramid = cv2.pyrDown(img)
    print(f"下采樣后尺寸:{pyramid.shape}")
    

六、擴展學習方向

  1. 進階操作

    • 使用cv2.LUT()實現色彩查找表變換
    • 掩膜操作(mask)進行區域處理
    • 利用Numpy數組的布爾索引進行條件修改
  2. 性能提升

    • 使用OpenCV內置函數替代Python循環
    • 多線程處理圖像塊
    • CUDA加速(需安裝opencv-contrib-python包)
  3. 實際應用

    • 圖像增強:直方圖均衡化、CLAHE算法
    • 顏色空間轉換:HSV/YUV等
    • 形態學操作:腐蝕、膨脹

通過掌握這些基礎操作,您將為后續的圖像處理學習打下堅實基礎。建議通過實際項目(如證件照背景替換、圖像特效制作)加深理解。

下一篇我們將進入圖像的「幾何變換世界」,學習如何用數學矩陣實現圖像的平移、旋轉、縮放,以及不同插值算法對圖像質量的影響。現在請打開你的圖像,嘗試裁剪一個有趣的ROI區域并修改它的顏色吧!

思考:為什么對大尺寸圖像使用cv2.split()會更耗內存?如何用NumPy實現更高效的通道分離?

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

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

相關文章

數據庫系統概論(十一)SQL 集合查詢 超詳細講解(附帶例題表格對比帶你一步步掌握)

數據庫系統概論(十一)SQL 集合查詢 超詳細講解(附帶例題表格對比帶你一步步掌握) 前言一、什么是集合查詢?二、集合操作的三種類型1. 并操作2. 交操作3. 差操作 三、使用集合查詢的前提條件四、常見問題與注意事項五、…

如何設計一個支持線上線下的通用訂單模塊 —— 面向本地生活服務行業的架構思路

一、背景與目標 在本地生活服務行業中,訂單模塊作為連接用戶、商戶、商品、支付、履約的核心組件,支撐著平臺內多樣化的業務形態,例如外賣配送、到店服務、團購核銷、即時零售、預約預訂、線下消費等。 設計一個可支持線上線下融合的通用訂…

Django數據庫連接報錯 django.db.utils.NotSupportedError: MySQL 8 or later is required

可嘗試換django版本 pip install django3.2.13 另外mysql下載地址 https://dev.mysql.com/downloads/installer/ 安裝可以參考: https://blog.csdn.net/HHHQHHHQ/article/details/148125549 重點:用戶變量添加 C:\Program Files\MySQL\MySQL Server …

github 提交失敗,連接不上

1. 第一種情況,開了加速器,導致代理錯誤 刪除hosts文件里相關的github代理地址 2. 有些ip不支持22端口連接,改為443連接 ssh -vT gitgithub.com // 命令執行結果 OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2 debug1: C…

24位高精度數據采集卡NET8860音頻振動信號采集監測滿足自動化測試應用現場的多樣化需求

NET8860 高分辨率數據采集卡技術解析 阿爾泰科技的NET8860是一款高性能數據采集卡,具備8路同步模擬輸入通道和24bit分辨率,適用于高精度信號采集場景。其輸入量程覆蓋10V、5V、2V、1V,采樣速率高達256KS/s,能夠滿足多種工業與科研…

JavaScript 模塊系統:CJS/AMD/UMD/ESM

文章目錄 前言一、CommonJS (CJS) - Node.js 的同步模塊系統1.1 設計背景1.2 瀏覽器兼容性問題1.3 Webpack 如何轉換 CJS1.4 適用場景 二、AMD (Asynchronous Module Definition) - 瀏覽器異步加載方案2.1 設計背景2.2 為什么現代瀏覽器不原生支持 AMD2.3 Webpack/Rollup 如何處…

使用NMEA Tools生成GPS軌跡圖

前言 在現代科技快速發展的時代,GPS定位技術已經廣泛應用于各種領域,如導航、物流、運動追蹤等。為了獲取和分析GPS數據,我們常常需要使用一些專業的工具。本文將詳細介紹如何使用一款名為“NMEA Tools”的APK應用,結合GPSVisual…

Word雙欄英文論文排版攻略

word寫雙欄英文論文的注意事項 排版首先改字體添加連字符還沒完呢有時候設置了兩端對齊會出現這樣的情況: 公式文獻 等我下學期有時間了,一定要學習Latex啊,word寫英文論文,不論是排版還是公式都很麻煩的,而Latex一鍵就…

FactoryBean 接口

Spring 框架中 FactoryBean 接口的特性,這是 Spring 提供的一種特殊機制,用于創建和管理復雜 Bean。讓我通過示例和解釋幫您理解這個概念。 一、FactoryBean 是什么? FactoryBean 是 Spring 框架提供的一個工廠接口,用于創建復雜…

MySQL + CloudCanal + Iceberg + StarRocks 構建全棧數據服務

簡述 在業務數據快速膨脹的今天,企業對 低成本存儲 與 實時查詢分析能力 的需求愈發迫切。 本文將帶你實戰構建一條 MySQL 到 Iceberg 的數據鏈路,借助 CloudCanal 快速完成數據遷移與同步,并使用 StarRocks 完成數據查詢等操作&#xff0c…

javaEE->多線程:線程池

線程池 線程誕生的意義:因為進程的創建/銷毀,太重量了(比較慢) 但如果近一步提高創建/銷毀的頻率,線程的開銷也不容忽視。 有兩種方法可以提高效率: 1.協程(輕量級線程)&#xff…

【001】利用github搭建靜態網站_essay

文章目錄 1. 簡介2. 先了解網址規則2.1 文件及網址形式2.2 相互訪問 3. 搭建網頁的過程3.1 網頁文件3.2 github搭建倉庫及文件上傳3.3 搭建網站 1. 簡介 相信大家都有過想要自己搭建一個穩定可靠的網站,github是一個不錯的選擇,本來國內有gitee可以搭建…

搜索引擎2.0(based elasticsearch6.8)設計與實現細節(完整版)

1 簡介 1.1 背景 《搜索引擎onesearch 1.0-設計與實現.docx》介紹了1.0特性,搜索schema,agg,表達式搜索映射,本文介紹onesearch 2.0 新特性, 參考第2節 規劃特性與發布計劃 1.2 關鍵詞 文檔 Document elasticsearch 一行數據稱為…

【ClickHouse】RollingBitmap

ClickHouse 的 RollingBitmap 是一種基于 Bitmap 的數據結構,用于高效處理數據的動態變化和時間窗口計算。以下是關于 ClickHouse RollingBitmap 的相關信息: RollingBitmap 的應用場景 RollingBitmap 主要用于需要處理動態數據和時間窗口計算的場景&am…

新版智慧社區(小區)智能化弱電系統解決方案

該方案聚焦新版智慧社區智能化弱電系統建設,以物聯網、云計算、AI 人臉識別等技術為支撐,構建涵蓋智能可視化對講、智慧門禁、智能梯控、智慧停車、視頻監控等核心系統的社區智能化體系,并通過智慧社區集成平臺實現設備管理、數據統計、預警聯動等功能。方案旨在解決傳統社區…

11高可用與容錯

一、Broker 高可用架構設計 1.1 RabbitMQ 鏡像集群方案 集群搭建步驟 # 節點1初始化 rabbitmq-server -detached rabbitmq-plugins enable rabbitmq_management# 節點2加入集群 rabbitmqctl stop_app rabbitmqctl join_cluster rabbitnode1 rabbitmqctl start_app# 創建鏡像…

AsyncIOScheduler與BackgroundScheduler的線程模型對比

1. BackgroundScheduler的線程機制? ?多線程模型?:BackgroundScheduler基于線程池執行任務,默認通過ThreadPoolExecutor創建獨立線程處理任務,每個任務運行在單獨的線程中,主線程不會被阻塞。?適用場景?:適合同步…

ceph 對象存儲用戶限額滿導致無法上傳文件

查看日志 kl logs -f rook-ceph-rgw-my-store-a-5cc4c4d5b5-26n6j|grep -i error|head -1Defaulted container "rgw" out of: rgw, log-collector, chown-container-data-dir (init) debug 2025-05-30T19:44:11.573+0000 7fa7b7a6d700

2025-05-31 Python深度學習9——網絡模型的加載與保存

文章目錄 1 使用現有網絡2 修改網絡結構2.1 添加新層2.2 替換現有層 3 保存網絡模型3.1 完整保存3.2 參數保存(推薦) 4 加載網絡模型4.1 加載完整模型文件4.2 加載參數文件 5 Checkpoint5.1 保存 Checkpoint5.2 加載 Checkpoint 本文環境: Py…

批量導出CAD屬性塊信息生成到excel——CAD C#二次開發(插件實現)

本插件可實現批量導出文件夾內大量dwg文件的指定塊名的屬性信息到excel,效果如下: 插件界面: dll插件如下: 使用方法: 1、獲取此dll插件。 2、cad命令行輸入netload ,加載此dll(要求AutoCAD&…