文章目錄
- 引言
- 1. 準備工作
- 2. 加載并顯示原始圖像
- 3. 創建掩膜
- 3. 應用掩膜
- 5. 計算并顯示直方圖
- 6. 結果分析
- 7. 總結
引言
在圖像處理中,掩膜(Mask)是一個非常重要的概念,它允許我們選擇性地處理圖像的特定區域。今天,我將通過一個實際的例子來展示如何使用OpenCV和Python對手機圖像進行掩膜處理并分析其直方圖。
1. 準備工作
首先,我們需要導入必要的庫:
import cv2
import numpy as np
from matplotlib import pyplot as plt
2. 加載并顯示原始圖像
我們首先加載一張名為"phone.png"的圖像,并將其轉換為灰度圖:
phone = cv2.imread('phone.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('phone', phone)
cv2.waitKey(0)
cv2.IMREAD_GRAYSCALE
參數告訴OpenCV以灰度模式加載圖像。cv2.imshow()
用于顯示圖像,cv2.waitKey(0)
則等待用戶按鍵后才繼續執行。
- 圖像顯示如下:
3. 創建掩膜
接下來,我們創建一個與原始圖像大小相同的全黑圖像作為掩膜基礎:
mask = np.zeros(phone.shape[:2], np.uint8) # 創建黑白圖像,用于制作mask
mask[50:350, 100:470] = 255
cv2.imshow('mask', mask)
cv2.waitKey(0)
這里,我們在掩膜上定義了一個矩形區域(從y=50到350,x=100到470),并將該區域設置為白色(255),其余部分保持黑色(0)。這個白色矩形就是我們的感興趣區域(ROI)。
- 圖片顯示如下:
3. 應用掩膜
使用按位與操作將掩膜應用到原始圖像上:
phone_mask = cv2.bitwise_and(phone, phone, mask=mask)
cv2.imshow('phone_mask', phone_mask)
cv2.waitKey(0)
cv2.bitwise_and()
函數執行按位與操作,由于我們使用了相同的圖像作為兩個輸入,實際上就是使用掩膜來選擇圖像的部分區域。在掩膜為白色的區域,原始圖像內容會被保留;在掩膜為黑色的區域,結果圖像對應位置會被置為0(黑色)。
- 圖片顯示如下:
5. 計算并顯示直方圖
最后,我們計算掩膜區域內圖像的直方圖:
phone_hist_mask = cv2.calcHist([phone], [0], mask, [256], [0,256])
plt.plot(phone_hist_mask) # 使用calcHist的值繪制曲線圖
plt.show()
cv2.calcHist()
函數的參數解釋:
[phone]
: 輸入圖像列表[0]
: 計算直方圖的通道索引(灰度圖只有0通道)mask
: 使用的掩膜[256]
: 直方圖的bin數量[0,256]
: 像素值范圍
然后我們使用Matplotlib的plt.plot()
函數繪制直方圖曲線,plt.show()
顯示圖表。
- 直方圖顯示如下:
6. 結果分析
通過這個過程,我們可以:
- 清晰地看到原始手機圖像
- 觀察我們定義的掩膜區域
- 查看應用掩膜后的效果(只有ROI區域可見)
- 分析ROI區域的像素值分布(直方圖)
直方圖可以幫助我們了解圖像的對比度、亮度分布等信息,對于后續的圖像處理(如閾值分割、對比度增強等)非常有幫助。
7. 總結
通過這個簡單的例子,我們學習了如何使用OpenCV進行基本的圖像掩膜操作和直方圖分析。這些技術是更復雜圖像處理任務的基礎,掌握它們將為你的計算機視覺之旅打下堅實基礎。
希望這篇博客對你有所幫助!如果你有任何問題或建議,歡迎在評論區留言。