久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

使用OpenCV實現(xiàn)圖像覆蓋

 小白學(xué)視覺 2021-01-28

重磅干貨,第一時間送達(dá)

每張圖像都包括RGB三個通道,,分別代表紅色,、綠色和藍(lán)色,使用它們來定義圖像中任意一點的像素值,,紅綠藍(lán)的值在0-255之間,。
例如:一個像素值[255,0,0]代表全部為紅色,像素值[255,255,,0]是紅色和綠色的混合,,將顯示為黃色,。
但是,,如果使用OpenCV讀取圖像,它將以BGR格式生成圖像,,那么[255,0,0]將代表藍(lán)色,。

使用OpenCV讀取一張圖像

任何圖像都可以通過OpenCV使用命令讀取。不過,,OpenCV不支持HEIC格式的圖像,,所以不得不使用其它類型的庫,如Pillow來讀取HEIC類型的圖像(或者先將它們轉(zhuǎn)換為JPEG格式)
import cv2image = cv2.imread(‘image.jpg’)

當(dāng)讀取圖像之后,,如果有必要的話可以將其從BGR格式轉(zhuǎn)換為RGB格式,,通過使用cv2.cvtColor()命令實現(xiàn)。

image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

覆蓋

圖像可以看作是是一堆像素值以類似矩陣的格式存儲,。任何像素的值都可以獨立于其他像素進(jìn)行更改,。這里有一張圖像,,使用OpenCV讀取圖像:

image_1

image_1 = cv2.imread(‘image_1.jpg’)print(image_1)
這里將給出矩陣形式的一系列像素值
array([[[107, 108, 106],[107, 108, 106],[107, 108, 106],…,[ 77, 78, 76],[ 77, 78, 76],[ 76, 77, 75]],…,[[ 93, 88, 87],[ 93, 88, 87],[ 92, 87, 86],…,[ 52, 62, 62],[ 52, 62, 62],[ 52, 62, 62]]], dtype=uint8)

如果只改變圖像某一區(qū)域的像素值,比如更改為[0,0,0],,這部分區(qū)域?qū)⒆兂珊谏?,因為這是顏色為黑色的像素值。同樣,,如果將像素值更改為[255,0,0],,則該區(qū)域?qū)⒆優(yōu)樗{(lán)色(OpenCV以BGR格式讀取圖像)。

image_1[50: 100, 50:100] = [255, 0, 0]

同樣,,這些像素值可以被另一幅圖像替換,,只需通過使用該圖像的像素值。
為了做到這一點,,我們需要將覆蓋圖像修改為要替換的像素值的大小,。可以通過使用函數(shù)來實現(xiàn)
image_2 = cv2.imread(‘image_2.jpg’)resized_image_2 = cv2.resize(image_2, dsize=(100, 100))
其中,代表圖像要被修改的尺寸,。
現(xiàn)在,,可以將第二張圖像夠覆蓋在第一張圖片的上面
image_1[50:150, 50:150] = resized_image_2


 覆蓋PNG圖像

與JPEG圖像不同,PNG圖像有第四個通道,,它定義了給定像素的ALPHA(不透明度),。
除非另有規(guī)定,否則OpenCV以與JPEG圖像相同的方式讀取PNG圖像,。
為了讀取帶有Alpha值的PNG圖像,,我們需要在讀取一張圖像時指定標(biāo)志現(xiàn)在,這個圖像已經(jīng)有了四個通道:BGRA
image_3 = cv2.imread(‘image_3.png’, cv2.IMREAD_UNCHANGED)print(image_3)array([[[0 0 0 0][0 0 0 0][0 0 0 0]…[0 0 0 0][0 0 0 0][0 0 0 0]]…[[0 0 0 0][0 0 0 0][0 0 0 0]…[0 0 0 0][0 0 0 0][0 0 0 0]]], dtype=uint8)

然而,,這個圖像有4個通道,,但是我們的JPEG圖像只有3個通道,所以這些值不能簡單地替換,。
我們需要在我們的JPEG圖像中添加一個虛擬通道,。
為此,我們將使用,??梢允褂?/span>命令安裝它。

提供了一個函數(shù)來根據(jù)深度疊加值,。
首先,,我們需要一個與圖像大小相同的虛擬數(shù)組。
為了創(chuàng)建虛擬通道,,我們可以使用函數(shù)創(chuàng)建一個數(shù)組,。
import numpy as npones = np.ones((image_1.shape[0], image_1.shape[1]))*255image_1 = np.dstack([image_1, ones])
我們將其數(shù)組與255相乘,因為alpha通道的值也存在于0-255之間,。
現(xiàn)在,,我們可以用PNG圖像替換圖像的像素值,。
image_1[150:250, 150:250] = image_3
然而,它不會給出期望的結(jié)果,,因為我們將alpha通道的值改為了零,。


我們只需要替換那些具有非零值的像素值。為了做到這一點,,我們可以通過檢查每個像素值和替換非零值來強行執(zhí)行,,但這很耗時。

這里有一個更好的方法,。我們可以獲取要覆蓋圖像的alpha值,。
alpha_image_3 = image_3[:, :, 3] / 255.0

我們將像素值除以255.0,以保持值在0-1之間,。
的alpha之和需要等于255,。因此,我們可以創(chuàng)建另一個數(shù)組,,其中包含和等于255的所需alpha值
alpha_image = 1 — alpha_image_3
現(xiàn)在,,我們可以簡單的取每個圖像的alpha值和每個通道的圖像像素值的元素乘積,并取它們的和,。
for c in range(0, 3): image_1[150:250, 150:250, c] = ((alpha_image*image_1[150:250, 150:250, c]) + (alpha_image_3*image_3[:, :, c]))

交流群

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多