Python+OpenCV數字圖像處理中如何進行ROI區域的提取

蝸牛 互聯網技術資訊 2021-12-17 163 0

本篇文章給大家分享的是有關Python+OpenCV數字圖像處理中如何進行ROI區域的提取,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1、實現原理

先通過cv.cvtColor()函數,將原RGB彩色圖像轉換為hsv色彩空間的圖像,然后通過cv.inRange()函數獲得ROI區域的Mask,最后利用cv.bitwise()函數提取得到ROI區域。

2、使用的函數簡述

(1) cv.cvtColor(img, cv.COLOR_BGR2HSV)函數

img為要進行色彩空間轉換的原圖

cv.COLOR_BGR2HSV即將原圖RGB色彩空間轉換為HSV色彩空間

(2) cv.inRange(hsv, (h_min, s_min, v_min), (h_max, s_max, v_max))函數

cv.inRange函數通過設置不同的h、s、v的min和max閾值可以獲取不同色彩的一個二值的mask圖,下圖為各顏色的閾值表:

Python+OpenCV數字圖像處理中如何進行ROI區域的提取  python 第1張

(3)cv.bitwise_and(img1, img2, mask),cv.bitwise_or(img1, img2, mask)和cv.bitwise_not(img)

第一個函數為按位與操作函數,將img1和img2在mask的區域內,R,G,B三個分量分別進行按位與操作。第二個函數為按位或操作函數,將img1和img2在mask的區域內,R,G,B三個分量分別進行按位或操作。第三個函數為按位取反操作函數,將img在R,G,B三個分量分別進行按位取反操作。

(4)cv.add(img1, img2)函數

將img1和img2 進行相加操作,img1和img2的尺寸必須要相同。

3、代碼實現過程

原圖如下:

Python+OpenCV數字圖像處理中如何進行ROI區域的提取  python 第2張

如圖,要從圖中提取出卡通人物,并將其貼在其他背景上。

(1)讀入原始圖像

src?=?cv.imread('person.jpg')
cv.imshow('src',?src)

Python+OpenCV數字圖像處理中如何進行ROI區域的提取  python 第3張

(2)獲取mask

hsv?=?cv.cvtColor(src,?cv.COLOR_BGR2HSV)???????#?轉換成hsv色彩風格
mask?=?cv.inRange(hsv,?(35,?43,?46),?(99,?255,?255))???#?利用inRange產生mask
cv.imshow('mask1',?mask)

Python+OpenCV數字圖像處理中如何進行ROI區域的提取  python 第4張

由于背景為綠色,可以提取綠色背景的mask,由上表可以查出綠色和青色的值,設置好參數后,就可以獲得mask(白色區域才是mask區域):

注意:這里獲取的mask為背景的mask,我們要獲得人物的mask。

(3)獲取人物mask

通過邏輯非操作取反,即可獲得人物的mask區域(白色區域):

mask?=?cv.bitwise_not(mask)
cv.imshow('mask2',?mask)

Python+OpenCV數字圖像處理中如何進行ROI區域的提取  python 第5張

(4)獲取人物

將原始圖像與原始圖像在mask區域進行邏輯與操作,即可獲取

timg1?=?cv.bitwise_and(src,?src,?mask=mask)
cv.imshow('timg1',?timg1)

Python+OpenCV數字圖像處理中如何進行ROI區域的提取  python 第6張

以上操作即提取了圖像中的ROI(卡通人)區域,下面介紹將介紹將提取出來的圖貼到其他背景上。

(5)新建一張與原始圖一樣大小的藍色的背景圖

background?=?np.zeros(src.shape,?src.dtype)
background[:,:,0]?=?255

(6)得到藍色背景的mask

mask?=?cv.bitwise_not(mask)
dst?=?cv.bitwise_or(timg1,?background,?mask=mask)
cv.imshow('dst1',?dst)

Python+OpenCV數字圖像處理中如何進行ROI區域的提取  python 第7張

(7)將人物圖貼到藍色背景上

dst?=?cv.add(dst,?timg1)
cv.imshow('dst2',?dst)

Python+OpenCV數字圖像處理中如何進行ROI區域的提取  python 第8張

4、整體代碼?

import?cv2?as?cv
import?numpy?as?np

src?=?cv.imread('person.jpg')
cv.imshow('src',?src)
hsv?=?cv.cvtColor(src,?cv.COLOR_BGR2HSV)???????#?轉換成hsv色彩風格
mask?=?cv.inRange(hsv,?(35,?43,?46),?(99,?255,?255))????????#?利用inRange產生mask
cv.imshow('mask1',?mask)
cv.imwrite('mask1.jpg',?mask)

#?獲取mask
mask?=?cv.bitwise_not(mask)
cv.imshow('mask2',?mask)
cv.imwrite('mask2.jpg',?mask)
timg1?=?cv.bitwise_and(src,?src,?mask=mask)
cv.imshow('timg1',?timg1)
cv.imwrite('timg1.jpg',?timg1)

#?生成背景
background?=?np.zeros(src.shape,?src.dtype)
background[:,:,0]?=?255

#?將人物貼到背景中
mask?=?cv.bitwise_not(mask)
dst?=?cv.bitwise_or(timg1,?background,?mask=mask)
cv.imshow('dst1',?dst)
cv.imwrite('dst1.jpg',?dst)

dst?=?cv.add(dst,?timg1)
cv.imshow('dst2',?dst)
cv.imwrite('dst2.jpg',?dst)

cv.waitKey(0)
cv.destroyAllWindows()

以上就是Python+OpenCV數字圖像處理中如何進行ROI區域的提取,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注蝸牛博客行業資訊頻道。

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:niceseo99@gmail.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

評論

日本韩欧美一级A片在线观看