OpenCV-Python學習(七):圖像的基本運算及mask掩膜

目錄:

  • 1.圖像的基本運算
    • 加斤程、減法
    • 圖像混合
    • 按位運算
  • 2.mask掩膜

一旺上、圖像的基本運算

加叹誉、減法

飽和運算:當運算結果大于一個上限或小于一個下限時,結果就等于上限或下限忿项。
opencv的加蓉冈、減法就是一種飽和運算。

加法轩触、減法
    add(src1, src2, dst=None, mask=None, dtype=None)
    subtract(src1, src2, dst=None, mask=None, dtype=None)

示例:

# 加寞酿、減法
import cv2
import numpy

x = numpy.uint8([250])
y = numpy.array([10], dtype=numpy.uint8)

# OpenCV的加、減法是一種飽和運算
print(cv2.add(x, y))  # 250+10=260 ==> 255
print(cv2.subtract(y, x))  # 10-250=-240 ==> 0

# Numpy的加脱柱、減法是一種模運算
print(numpy.add(x, y))  # 250+10=260 %256 = 4
print(numpy.subtract(y, x))  # 10-250=-240 %256 = 16
圖像混合
圖像混合
    addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)

    參數:
        src1: first input array.
        alpha: weight of the first array elements.
        src2: second input array of the same size and channel number as src1.
        beta: weight of the second array elements.
        gamma: scalar added to each sum.
        dst: output array that has the same size and number of channels as the input arrays.
        dtype: optional depth of the output array; when both input arrays have the same depth, dtype
    
        示例: dst = cv2.addWeighted(img1,0.7,img2,0.3,0)
            則 dst = img1*0.7 + img2*0.3 + 0

示例:

import cv2

img1 = cv2.imread("image/1.jpg")
img2 = cv2.imread("image/6.jpg")

add_mix1 = cv2.add(img1, img2)
addWeighted_mix2 = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
addWeighted_mix3 = cv2.addWeighted(img1, 0.3, img2, 0.7, 0)

cv2.imshow("add_mix1", add_mix1)
cv2.imshow("addWeighted_mix2", addWeighted_mix2)
cv2.imshow("addWeighted_mix3", addWeighted_mix3)
cv2.waitKey(0)
cv2.destroyAllWindows()
按位運算
按位運算: AND伐弹、OR、NOT榨为、XOR
    bitwise_not(src, dst=None, mask=None)
    bitwise_and(src1, src2, dst=None, mask=None)
    bitwise_or(src1, src2, dst=None, mask=None)
    bitwise_xor(src1, src2, dst=None, mask=None)

    參數:
        src惨好、src1煌茴、src2: 輸入(數組或一個標量)。
        dst: 輸出(數組或一個標量日川,與輸入的size和type一致)蔓腐。
        mask: 掩膜,可選操作掩碼龄句,8位的單通道矩陣合住,即指定要更改的輸出數組的元素。

示例:

import cv2

# 圖像二值化
gray = cv2.imread("image/1.jpg", cv2.IMREAD_GRAYSCALE)
ret, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

# 按位運算
mask_not = cv2.bitwise_not(mask)
mask_and1 = cv2.bitwise_and(mask, mask)
mask_and2 = cv2.bitwise_and(mask, mask_not)
mask_or1 = cv2.bitwise_or(mask, mask)
mask_or2 = cv2.bitwise_or(mask, mask_not)
mask_xor1 = cv2.bitwise_xor(mask, mask)
mask_xor2 = cv2.bitwise_xor(mask, mask_not)

cv2.imshow("mask", mask)
cv2.imshow("mask_not", mask_not)
cv2.imshow("mask_and1", mask_and1)
cv2.imshow("mask_and2", mask_and2)
cv2.imshow("mask_or1", mask_or1)
cv2.imshow("mask_or2", mask_or2)
cv2.imshow("mask_xor1", mask_xor1)
cv2.imshow("mask_xor2", mask_xor2)
cv2.waitKey(0)
cv2.destroyAllWindows()

二撒璧、mask掩膜

1透葛、OpenCV中的mask掩膜原理

OpenCV中的mask掩膜原理:

  • 掩模一般是小于等于源圖像的單通道矩陣,掩模中的值分為兩種0和非0卿樱。
  • 當mask掩膜中的值不為0僚害,則將源圖像拷貝到目標圖像,當mask中的值為0繁调,則不進行拷貝萨蚕,目標圖像保持不變。
  • 以 dst=cv2.bitwise_and(src1, src2, mask) 為例蹄胰,先進行src1和src2的 "與" 運算岳遥,所得結果再與mask進行掩膜運算(mask為非0的則拷貝到dst中)。
2裕寨、掩膜運用實例

掩膜運用實例: 將img2圖片中的一部分作為logo粘貼到另一張圖片img1上浩蓉,且不想要透明效果。
步驟:

  • 1.截取img1中的感興趣區(qū)域roi,區(qū)域大小與img2相同(得到一個感興趣區(qū)域roi)
    rows,cols,channels = img2.shape
    roi = img1[0:rows,0:cols]
  • 2.先將img2轉化為灰度圖宾袜,再轉化為二值化圖(得到二值化圖mask)
  • 3.對mask使用"非"操作顛倒黑白(得到mask_inv)
  • 4.對感興趣區(qū)域roi進行mask掩膜捻艳,得到感興趣區(qū)域背景圖roi_bg = cv2.bitwise_and(roi,roi,mask=mask)
    這里mask=mask還是mask=mask_inv要根據具體的二值化圖進行分析。
  • 5.對img2進行mask掩膜庆猫,得到前景圖img2_fg = cv2.bitwise_and(img2,img2,mask=mask_inv)
    這里mask=mask還是mask=mask_inv要根據具體的二值化圖進行分析认轨。
  • 6.將roi_bg背景圖和img2_fg前景圖混合,得到混合圖dst = cv2.add(roi_bg,img2_fg)
  • 7.最后月培,將混合圖dst覆蓋img1的感興趣區(qū)域嘁字,img1[0:rows,0:cols] = dst

代碼示例:

import cv2
import matplotlib.pyplot as plt

img1 = cv2.imread("image/mask_img1.jpg")
img2 = cv2.imread("image/mask_img2.jpg")

# 1.截取img1中的感興趣區(qū)域
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]

# 2.將img2轉化為灰度圖,再轉化為二值化圖mask
img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

# 3.對mask做"與"操作顛倒黑白杉畜,得到mask_inv
mask_inv = cv2.bitwise_not(mask)

# 4.對roi進行掩膜操作纪蜒,得到感興趣區(qū)域背景圖roi_bg
roi_bg = cv2.bitwise_and(roi, roi, mask=mask)

# 5.對img2進行掩膜操作,得到img2的前景圖img2_fg
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)

# 6.混合背景圖和前景圖寻行,得到混合圖dst
dst = cv2.add(roi_bg, img2_fg)

# 7.將混合圖dst覆蓋img1的感興趣區(qū)域霍掺,得到最終的效果圖
img1_after = img1.copy()
img1_after[0:rows, 0:cols] = dst

# 結合Matplotlib展示多張圖片
titles = ['img1', 'img2', 'roi', 'mask', 'mask_inv', 'roi_bg', 'img2_fg', 'dst', 'img1_after']
images = [img1, img2, roi, mask, mask_inv, roi_bg, img2_fg, dst, img1_after]
for i in range(9):
    plt.subplot(3, 3, i + 1)
    plt.imshow(images[i][..., ::-1], cmap="gray")
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])
plt.show()

結果如下:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子杆烁,更是在濱河造成了極大的恐慌牙丽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔魂,死亡現場離奇詭異烤芦,居然都是意外死亡,警方通過查閱死者的電腦和手機析校,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門构罗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人智玻,你說我怎么就攤上這事遂唧。” “怎么了吊奢?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵盖彭,是天一觀的道長。 經常有香客問我页滚,道長召边,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任裹驰,我火速辦了婚禮隧熙,結果婚禮上,老公的妹妹穿的比我還像新娘幻林。我一直安慰自己贞盯,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布滋将。 她就那樣靜靜地躺著邻悬,像睡著了一般症昏。 火紅的嫁衣襯著肌膚如雪随闽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天肝谭,我揣著相機與錄音掘宪,去河邊找鬼。 笑死攘烛,一個胖子當著我的面吹牛魏滚,可吹牛的內容都是我干的。 我是一名探鬼主播坟漱,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鼠次,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起腥寇,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤成翩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赦役,有當地人在樹林里發(fā)現了一具尸體麻敌,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年掂摔,在試婚紗的時候發(fā)現自己被綠了术羔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乙漓,死狀恐怖级历,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情叭披,我是刑警寧澤鱼喉,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站趋观,受9級特大地震影響扛禽,放射性物質發(fā)生泄漏。R本人自食惡果不足惜皱坛,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一编曼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剩辟,春花似錦掐场、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吭服,卻和暖如春嚷堡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背艇棕。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工蝌戒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沼琉。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓北苟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親打瘪。 傳聞我的和親對象是個殘疾皇子友鼻,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355