一、函數概述
cv2.subtract()函數是OpenCV中用於圖像減法運算的函數,可以很方便地進行兩個圖像之間的減法操作,也可以用來對一個圖像進行常量的減法操作。
cv2.subtract(src1, src2, dst=None, mask=None, dtype=None) -> dst
其中src1和src2是要進行減法操作的兩個輸入圖像,可以是大小和類型相同的圖像,也可以是大小不同但是通道數相同的圖像;dst是函數的輸出結果,如果不傳入該參數,則會生成一個和輸入圖像類型和大小相同的圖像作為輸出結果;mask參數則可以用來指定一個掩膜,以只對指定區域進行減法運算;dtype參數則用來指定輸出圖像的數據類型,如果不傳入該參數,則會自動選擇src1、src2和輸入圖像中的數據類型中的最大值作為輸出圖像的數據類型。
二、圖像減法操作
1、兩個相同尺寸的圖像
首先讓我們創建兩個相同尺寸的圖像,用於後面的減法操作。代碼如下:
import cv2 import numpy as np img1 = np.zeros((200, 200, 3), dtype=np.uint8) img1[50:150, 50:150, :] = 255 img2 = np.zeros((200, 200, 3), dtype=np.uint8) img2[70:180, 70:180, :] = 255 cv2.imshow("img1", img1) cv2.imshow("img2", img2) cv2.waitKey(0) cv2.destroyAllWindows()
這裡我們創建兩個200×200的三通道圖像,img1中心部分為白色,img2中心部分為白色且稍微比img1更大。運行代碼,可以得到如下圖像:
可以看到,我們成功地生成了兩個用於後面減法操作的圖像。
接下來,我們使用cv2.subtract()函數對這兩個圖像進行減法操作,代碼如下:
result = cv2.subtract(img1, img2) cv2.imshow("result", result) cv2.waitKey(0) cv2.destroyAllWindows()
這裡我們將img1減去img2,並將結果保存在result中,然後將result顯示出來。運行代碼,可以得到如下圖像:
可以看到,我們得到了一個新的圖像,它的中心部分為白色,並且和img1的中心部分重合。這是因為在減法運算中,兩個圖像中相同位置的像素值相減,因此img2的中心部分被減去了,而img1的中心部分保留了下來。
2、兩個不同尺寸的圖像
除了可以對相同尺寸的圖像進行減法操作外,cv2.subtract()函數還可以對不同尺寸但是通道數相同的圖像進行減法操作。代碼如下:
img1 = np.zeros((200, 200, 3), dtype=np.uint8) img1[50:150, 50:150, :] = 255 img2 = np.zeros((300, 300, 3), dtype=np.uint8) img2[70:200, 70:200, :] = 255 result = cv2.subtract(img1, img2) cv2.imshow("result", result) cv2.waitKey(0) cv2.destroyAllWindows()
這裡我們將img2的大小設為300×300,並將中心部分稍微調大一些。運行代碼,可以得到如下圖像:
可以看到,我們依然成功地對img1和img2進行了減法操作。這是因為在兩個圖像大小不同時,cv2.subtract()函數會自動調用resize()函數將圖像大小調整為相同,並且進行減法運算。因此,我們得到的結果和兩個相同大小的圖像進行減法運算時的結果是相同的。
三、常量減法操作
cv2.subtract()函數不僅可以進行圖像減法操作,還可以對一個圖像進行常量減法操作。代碼如下:
img = cv2.imread("lena.jpg") cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows() result = cv2.subtract(255, img) cv2.imshow("result", result) cv2.waitKey(0) cv2.destroyAllWindows()
這裡我們讀入一張名為lena.jpg的圖像,並將它顯示出來。然後,我們對這張圖像進行常量減法操作:將它的每個像素值從255中減去,並將結果保存到result中。最後將result顯示出來。運行代碼,可以得到如下圖像:
原始圖像:
減法結果:
可以看到,我們成功地對lena.jpg圖像進行了常量減法操作,並且得到了一個新的圖像。這是因為在常量減法操作中,每個像素值都會從常量值中減去,並生成一個新的圖像。
四、掩膜減法操作
cv2.subtract()函數還支持使用掩膜對圖像進行減法操作,以只對指定區域進行操作。代碼如下:
img1 = np.zeros((200, 200, 3), dtype=np.uint8) img1[50:150, 50:150, :] = 255 img2 = np.zeros((200, 200, 3), dtype=np.uint8) img2[70:180, 70:180, :] = 255 mask = np.zeros((200, 200), dtype=np.uint8) mask[90:110, 90:110] = 255 cv2.imshow("img1", img1) cv2.imshow("img2", img2) cv2.imshow("mask", mask) cv2.waitKey(0) cv2.destroyAllWindows() result = cv2.subtract(img1, img2, dst=None, mask=mask) cv2.imshow("result", result) cv2.waitKey(0) cv2.destroyAllWindows()
這裡我們同樣創建兩個200×200的圖像img1和img2,並用mask生成一個掩膜,指定要進行減法操作的區域。然後,我們使用cv2.subtract()函數對這兩個圖像進行減法操作,並指定掩膜為mask。運行代碼,可以得到如下圖像:
可以看到,我們成功地使用掩膜對img1和img2進行了減法操作,只對mask指定的部分進行了減法操作。這是因為在掩膜減法操作中,只有掩膜中像素值為非零的部分才會進行減法操作,因此我們成功地保留了img1中心部分的白色區域。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/187636.html