做文案用什么網(wǎng)站宣傳推廣方式有哪些
使用 OpenCV 和 NumPy 進行圖像處理:HSV 范圍篩選實現(xiàn)PS摳圖效果
在計算機視覺和圖像處理領(lǐng)域,OpenCV 是一個非常強大的庫,能夠幫助我們執(zhí)行各種圖像操作。在這篇博客中,我們將通過一個簡單的示例演示如何使用 OpenCV 和 NumPy 來進行 HSV(色相、飽和度、明度)范圍篩選,以提取圖像中的特定顏色區(qū)域。
1. 創(chuàng)建虛擬環(huán)境
新建文件夾, 并在文件夾中創(chuàng)建虛擬環(huán)境,可以使用Vscode打開文件夾, 然后在終端中輸入以下命令:
python -m venv venv
2. 激活虛擬環(huán)境
在終端中輸入以下命令:
venv\Scripts\activate
3. 安裝依賴
在終端中輸入以下命令:
pip install opencv-python
4. 代碼實現(xiàn)
首先,我們需要導(dǎo)入所需的庫:
import cv2
import numpy as np
接下來,我們定義一個函數(shù) inrange_demo
,該函數(shù)接收一幅圖像作為參數(shù),并執(zhí)行以下步驟:
1. 將圖像從 BGR 轉(zhuǎn)換為 HSV
OpenCV 默認(rèn)使用 BGR(藍、綠、紅)顏色空間,因此我們首先需要將圖像轉(zhuǎn)換為 HSV 顏色空間,以便更容易地進行顏色范圍篩選。
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
cv2.waitKey(0)
2. 創(chuàng)建 HSV 范圍的掩膜
我們使用 cv2.inRange
函數(shù)來創(chuàng)建一個掩膜,該掩膜只保留在指定 HSV 范圍內(nèi)的像素。這里的范圍是 (35, 43, 46)
到 (77, 255, 255)
,這通常對應(yīng)于綠色的顏色范圍。
mask = cv2.inRange(hsv, (35, 43, 46), (77, 255, 255))
cv2.imshow("mask", mask)
cv2.waitKey(0)
3. 創(chuàng)建黑色背景
我們創(chuàng)建一個與原始圖像相同大小的黑色背景,以便后續(xù)操作。
redback = np.zeros(image.shape, image.dtype)
4. 反轉(zhuǎn)掩膜
通過 cv2.bitwise_not
函數(shù),我們可以反轉(zhuǎn)掩膜,以便選擇不在指定顏色范圍內(nèi)的區(qū)域。
mask_inv = cv2.bitwise_not(mask)
cv2.imshow("inverted mask", mask_inv)
cv2.waitKey(0)
5. 確保掩膜是三通道
為了將掩膜應(yīng)用于原始圖像,我們需要將反轉(zhuǎn)后的掩膜擴展到三通道。
mask_inv_3d = mask_inv[:, :, np.newaxis]
6. 應(yīng)用掩膜并顯示結(jié)果
最后,我們使用 np.where
函數(shù)將原始圖像與黑色背景結(jié)合,顯示出感興趣區(qū)域。
redback[:] = np.where(mask_inv_3d == 255, image, redback)
cv2.imshow("roi區(qū)域", redback)
示例用法
在函數(shù)定義之后,我們可以通過以下代碼讀取一幅圖像并調(diào)用 inrange_demo
函數(shù):
image = cv2.imread("D:\\images\\1.png")
inrange_demo(image)
cv2.waitKey(0)
cv2.destroyAllWindows()
圖像素材
實現(xiàn)效果
在運行代碼后,你將看到以下圖像:
總結(jié)
以上代碼演示了如何使用 OpenCV 和 NumPy 進行基本的圖像處理,特別是 HSV 范圍篩選。通過這種方法,我們可以提取圖像中感興趣的顏色區(qū)域,并在黑色背景上顯示它們。這種技術(shù)在物體檢測和識別、圖像分割等應(yīng)用中非常有用。
擴展
使用白色背景顯示圖像特定區(qū)域
import cv2
import numpy as npdef inrange_demo(image):# Convert the image from BGR to HSVhsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)cv2.imshow("hsv", hsv)cv2.waitKey(0)# Create a mask for the specified HSV rangemask = cv2.inRange(hsv, (35, 43, 46), (77, 255, 255))cv2.imshow("mask", mask)cv2.waitKey(0)# Create a white backgroundredback = np.zeros(image.shape, dtype=image.dtype)whiteback=redback+255# Invert the maskmask_inv = cv2.bitwise_not(mask)# Show the inverted maskcv2.imshow("inverted mask", mask_inv)cv2.waitKey(0)# Ensure mask_inv is 3-channel by expanding its dimensionsmask_inv_3d = mask_inv[:, :, np.newaxis]# Copy the original image to the background where the mask is appliedwhiteback[:] = np.where(mask_inv_3d == 255, image, whiteback)# Show the region of interestcv2.imshow("roi區(qū)域", whiteback)# Example usage:
image = cv2.imread("D:\\images\\1.png")
inrange_demo(image)
cv2.waitKey(0)
cv2.destroyAllWindows()
實現(xiàn)效果
這里特別提供一下HSV顏色取值范圍,建議收藏一下:
HSV 顏色取值范圍
希望這篇博客對你理解圖像處理有所幫助!