一:圖像算數(shù)運算
(1)加法運算
A:概述
加法運算:指將兩幅同大小的圖像進行像素級別的加法操作,得到一幅新的圖像。設(shè)兩幅圖像對應的像素值分別為 f 1 ( x , y ) f_{1}(x,y) f1?(x,y)和 f 2 ( x , y ) f_{2}(x,y) f2?(x,y),則它們的加法運算可表示為
g ( x , y ) = f 1 ( x , y ) + f 2 ( x , y ) g(x,y)=f_{1}(x,y) + f_{2}(x,y) g(x,y)=f1?(x,y)+f2?(x,y)
進行圖像加法運算時,處理和值的方式主要有以下幾種
- 截斷處理:當兩幅圖像的對應像素值相加結(jié)果超出圖像灰度級的最大值時,將結(jié)果強制截斷為最大灰度級,例如在8位灰度圖像中,最大值為255
- 加權(quán)求和:不同位置的像素值不僅僅是簡單地相加,還需要根據(jù)不同位置的權(quán)重進行加權(quán),以便更好地滿足具體的應用需求
- 縮放處理:將兩幅圖像的對應像素值相加結(jié)果縮放到指定的灰度級范圍內(nèi),例如在8位灰度圖像中,將結(jié)果除以一個因子,使其不超過255
- 溢出處理:當兩幅圖像的對應像素值相加結(jié)果超出圖像灰度級的最大值時,將結(jié)果自動溢出到下一級別,例如在8位灰度圖像中,溢出到9級時,像素值為0,溢出到10級時,像素值為1,以此類推
- 飽和度處理:當兩幅圖像的對應像素值相加結(jié)果超出圖像灰度級的最大值時,將結(jié)果設(shè)定為最大值。這種處理方式也被稱為上溢出處理,而下溢出處理則將結(jié)果設(shè)定為0
圖像加法運算主要應用如下
- 圖像增強:通過將一幅圖像與一幅較亮或較暗的圖像相加,可以增強圖像的對比度和亮度,使其更加清晰明亮
- 圖像融合:將兩幅不同角度或不同波段的圖像進行加權(quán)和處理,可以得到一幅融合后的圖像,用于提高圖像的質(zhì)量和信息量
- 目標檢測:將不同尺度或不同方向的圖像進行加權(quán)和處理,可以得到一幅新的圖像,用于檢測目標的位置和形狀
- 噪聲去除:通過將一幅圖像與一幅平滑或模糊的圖像相加,可以抑制圖像中的噪聲,提高圖像的信噪比
- 彩色圖像生成:將不同波段的灰度圖像進行加權(quán)和處理,可以得到一幅新的彩色圖像,用于彩色圖像的生成和處理
B:程序
MATLAB實現(xiàn):相關(guān)函數(shù)如下,具體解釋可看MATLAB幫助手冊
imadd(X,Y)
函數(shù):是MATLAB中用于執(zhí)行圖像加法運算的函數(shù)
-
A
和B
是兩幅需要相加的圖像,它們可以是灰度圖像、RGB圖像或二值圖像 - 除此之外,
imadd()
函數(shù)還可以通過添加一些可選參數(shù)來控制圖像加法運算的處理方式。以下是其中一些常用的可選參數(shù)-
scaling
:用于控制圖像加法運算的縮放方式,可選值有uint8
、uint16
、single
、double
。默認值為uint8
-
outputtype
:用于指定輸出圖像的數(shù)據(jù)類型,可選值包括與輸入圖像類型相同的類型,默認值與輸入圖像類型相同 -
fillvalues
:用于指定當相加結(jié)果超出圖像灰度級范圍時,如何填充超出范圍的像素值-
bound
:截斷處理(默認) -
nearest
:最近鄰差值 -
samesize
:將超出范圍的像素值設(shè)為輸入圖像的最大值
-
-
uint16
:用于將輸出圖像的數(shù)據(jù)類型指定為16位無符號整型,可用于處理高動態(tài)范圍圖像
-
實現(xiàn)如下效果
Back = imread('desert.jpg');
Foreground = imread('car.jpg');
result1 = imadd(Foreground,-100);
result2 = imadd(Back, Foreground);
result3 = imadd(Back, result1);
subplot(221),imshow(Foreground),title('原目標圖');
subplot(222),imshow(result1),title('原目標圖加標量');
subplot(223),imshow(result2),title('原目標圖加背景');
subplot(224),imshow(result3),title('加標量圖疊加背景');
Python實現(xiàn):使用Python實現(xiàn)上述同樣的功能
cv2.add(src1, src2[, dst[, mask[, dtype]]])
函數(shù):該函數(shù)將每個像素的值相加,并將結(jié)果存儲在輸出圖像中。如果相加的結(jié)果大于輸出圖像的數(shù)據(jù)類型所能表示的最大值,則該像素的值將被截斷,并存儲為最大值。如果輸出圖像的數(shù)據(jù)類型為無符號整數(shù)類型,則任何小于0的像素值都會被截斷為0。如果輸出圖像的數(shù)據(jù)類型為有符號整數(shù)類型,則任何大于最大值的像素值都會被截斷為最大值
-
src1
:第一個輸入圖像。 -
src2
:第二個輸入圖像。 -
dst
:輸出圖像,它的大小和類型與輸入圖像相同,或者可以為None
。 -
mask
:一個可選的掩膜圖像,它必須與輸入圖像具有相同的尺寸,或者可以為None
。 -
dtype
:輸出圖像的數(shù)據(jù)類型,如果沒有指定,則默認為src1.dtype
。
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
Back = cv2.imread('desert.jpg')
Foreground = cv2.imread('car.jpg')
result1 = cv2.add(Foreground, -100)
result2 = cv2.add(Back, Foreground)
result3 = cv2.add(Back, result1)
plt.subplot(221), plt.imshow(cv2.cvtColor(Foreground, cv2.COLOR_BGR2RGB)), plt.title('原目標圖')
plt.subplot(222), plt.imshow(cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)), plt.title('原目標圖加標量')
plt.subplot(223), plt.imshow(cv2.cvtColor(result2, cv2.COLOR_BGR2RGB)), plt.title('原目標圖加背景')
plt.subplot(224), plt.imshow(cv2.cvtColor(result3, cv2.COLOR_BGR2RGB)), plt.title('加標量圖疊加背景')
plt.show()
(2)減法運算
A:概述
減法運算:指將兩幅同大小的圖像進行像素級別的加法操作,得到一幅新的圖像。設(shè)兩幅圖像對應的像素值分別為 f 1 ( x , y ) f_{1}(x,y) f1?(x,y)和 f 2 ( x , y ) f_{2}(x,y) f2?(x,y),則它們的減法運算可表示為
g ( x , y ) = f 1 ( x , y ) ? f 2 ( x , y ) g(x,y)=f_{1}(x,y) - f_{2}(x,y) g(x,y)=f1?(x,y)?f2?(x,y)
進行圖像加法運算時,處理和值的方式主要有以下幾種
- 截斷處理:將兩幅圖像對應像素點的灰度值相減后,如果差值超過了一定的閾值,就將其截斷為該閾值,否則保留原值作為差值結(jié)果
- 取絕對值:將兩幅圖像對應像素點的灰度值相減,再取絕對值作為兩幅圖像差值的結(jié)果。該方法簡單易實現(xiàn),但容易受到圖像亮度和對比度的影響,對灰度變化較大的圖像效果不佳
- 平方差值:將兩幅圖像對應像素點的灰度值相減后取平方,再將所有差值求和并開方,作為兩幅圖像差值的結(jié)果。該方法能夠有效地消除灰度變化對結(jié)果的影響,但會放大灰度變化較大的區(qū)域,從而影響差值的準確性
- 加權(quán)平方差值:為了平衡兩種方法的缺點,可以使用加權(quán)平方差值法,即將每個像素點的差值乘以一個權(quán)重系數(shù)后再求和并開方。常用的權(quán)重系數(shù)包括高斯函數(shù)、均勻分布函數(shù)等,能夠有效地消除灰度變化對結(jié)果的影響,同時避免了平方差值法放大灰度變化較大的區(qū)域的缺點
圖像減法運算主要應用如下
- 目標檢測:將背景圖像與包含目標的圖像相減,得到只有目標區(qū)域的差異圖像,可以通過差異圖像進行目標檢測和識別
- 圖像增強:將圖像的低頻分量與高頻分量分離,去除低頻分量得到的高頻圖像與原圖像相減,可以增強圖像的邊緣和細節(jié)
- 背景消除:在視頻處理中,通過將當前幀圖像與前一幀圖像相減,得到差異圖像,可以用于背景消除和移動物體的跟蹤
- 紋理分析:在紋理分析中,將一幅圖像與其經(jīng)過旋轉(zhuǎn)或縮放等變換后的圖像相減,可以得到只包含紋理信息的圖像,用于紋理分類和分析
- 形態(tài)學處理:在形態(tài)學處理中,將圖像進行二值化處理后,將原圖像與腐蝕、膨脹等形態(tài)學操作的結(jié)果圖像相減,可以得到形態(tài)學處理后的圖像
B:程序
MATLAB實現(xiàn):相關(guān)函數(shù)如下,具體解釋可看MATLAB幫助手冊
imsubtract
函數(shù):是MATLAB中用于計算兩幅圖像之間像素值差異的函數(shù)。它可以用來減去一個圖像中的像素值,以及兩幅圖像中對應像素之間的差異
- 輸入?yún)?shù)
I1
和I2
表示需要計算差異的兩幅圖像,它們可以是灰度圖像或彩色圖像。輸出參數(shù)J
是計算得到的結(jié)果圖像,它的大小和類型與輸入圖像相同 - 可選參數(shù)
'uint8'
和'intensity'
用于指定輸出結(jié)果的數(shù)據(jù)類型,可以是uint8
或double
類型。如果省略這個參數(shù),imsubtract
函數(shù)會默認使用與輸入圖像相同的數(shù)據(jù)類型
J = imsubtract(I1, I2);
J = imsubtract(I1, I2, 'uint8');
J = imsubtract(I1, I2, 'intensity');
imabsdiff
函數(shù):是MATLAB中用于計算兩幅圖像之間像素值絕對差異的函數(shù)。它可以用來計算兩幅圖像中對應像素之間的絕對差異。該函數(shù)沒有可選參數(shù)
實現(xiàn)如下效果
Back=imread('hallback.bmp');
Foreground=imread('hallforeground.bmp');
result = imabsdiff(Foreground,Back);
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Foreground),title('前景圖');
subplot(133),imshow(result),title('圖像相減');
Python實現(xiàn):使用Python實現(xiàn)上述同樣的功能
cv2.absdiff(src1, src2[, dst])
函數(shù):是OpenCV中用于計算兩個圖像差異的函數(shù)
-
src1
:第一個輸入圖像,可以是單通道或多通道圖像,數(shù)據(jù)類型為numpy
數(shù)組 -
src2
:第二個輸入圖像,與src1
有相同的尺寸和數(shù)據(jù)類型,可以是單通道或多通道圖像,數(shù)據(jù)類型為numpy
數(shù)組 -
dst
:可選參數(shù),輸出圖像,與輸入圖像有相同的尺寸和數(shù)據(jù)類型,數(shù)據(jù)類型為numpy
數(shù)組。如果沒有指定,則會創(chuàng)建一個與src1
和src2
有相同尺寸和數(shù)據(jù)類型的數(shù)組作為輸出
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 讀取背景和前景圖像
Back = cv2.imread('hallback.bmp')
Foreground = cv2.imread('hallforeground.bmp')
# 計算前景圖像和背景圖像的像素絕對差值
result = cv2.absdiff(Foreground, Back)
# 使用matplotlib展示結(jié)果圖像
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(Back, cv2.COLOR_BGR2RGB))
plt.title('背景')
plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(Foreground, cv2.COLOR_BGR2RGB))
plt.title('前景圖')
plt.subplot(1, 3, 3)
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.title('圖像相減')
plt.show()
(3)乘法運算
A:概述
加法運算:是一種逐像素進行的二元運算。它將兩個輸入圖像中對應像素的像素值相乘,得到一個新的輸出圖像。設(shè)兩幅圖像對應的像素值分別為 f 1 ( x , y ) f_{1}(x,y) f1?(x,y)和 f 2 ( x , y ) f_{2}(x,y) f2?(x,y),則它們的乘法運算可表示為
g ( x , y ) = f 1 ( x , y ) × f 2 ( x , y ) g(x,y)=f_{1}(x,y) × f_{2}(x,y) g(x,y)=f1?(x,y)×f2?(x,y)
圖像乘法運算主要應用如下
- 圖像增強:圖像乘法運算可以用來增強圖像的對比度和亮度。例如,將一個圖像和一個高亮度的常數(shù)圖像相乘,可以使圖像中較暗的區(qū)域變得更加明亮
- 圖像合成:圖像乘法運算可以用來將兩個圖像合成成一個圖像。例如,將一個圖像和一個掩模圖像相乘,可以將掩模中非零區(qū)域?qū)南袼貜脑瓐D像中摳出來,生成一個新的合成圖像
- 模糊處理:圖像乘法運算可以用來進行模糊處理。例如,將一個圖像和一個低通濾波器的頻率響應相乘,可以將圖像中高頻部分去除,從而實現(xiàn)模糊效果
- 頻譜分析:圖像乘法運算可以用來進行頻譜分析。例如,將一個圖像和一個頻率響應為單位圓的高通濾波器相乘,可以提取出圖像中高頻部分的信息,從而實現(xiàn)高通濾波效果
- 噪聲去除:圖像乘法運算可以用來去除圖像中的噪聲。例如,將一個圖像和一個頻率響應為單位圓的低通濾波器相乘,可以將圖像中高頻部分去除,從而去除噪聲
B:程序
MATLAB實現(xiàn):相關(guān)函數(shù)如下,具體解釋可看MATLAB幫助手冊
immultiply(A,B,class)
函數(shù):
-
A
和B
分別是輸入的兩幅圖像 -
class
:用于指定輸出圖像的數(shù)據(jù)類型-
uint8
:8位無符號整型 -
uint16
:16位無符號整型 -
int16
:16位有符號整型 -
single
:單精度浮點型 -
double
:雙精度浮點型
-
實現(xiàn)如下效果
Back=im2double(imread('bird.jpg'));
Templet=im2double(imread('birdtemplet.bmp'));
result = immultiply(Templet,Back);
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Templet),title('模板');
subplot(133),imshow(result),title('圖像相乘');
Python實現(xiàn):使用Python實現(xiàn)上述同樣的功能
csv2.multiply
函數(shù):對輸入的兩個數(shù)組進行逐元素相乘,然后將結(jié)果寫入輸出數(shù)組中。在相乘過程中,如果元素的結(jié)果值超出了輸出數(shù)組數(shù)據(jù)類型的表示范圍,則結(jié)果將被截斷。如果指定了縮放參數(shù)scale
,則結(jié)果將被縮放到可接受的數(shù)據(jù)類型范圍內(nèi)。如果輸出數(shù)組的數(shù)據(jù)類型未指定,則輸出數(shù)組的數(shù)據(jù)類型與輸入數(shù)組相同
-
src1
:第一個數(shù)組,必須是單通道或多通道數(shù)組,數(shù)據(jù)類型為浮點型或整型。 -
src2
:第二個數(shù)組,與第一個數(shù)組的形狀和數(shù)據(jù)類型必須相同。 -
dst
:輸出數(shù)組,形狀和數(shù)據(jù)類型與輸入數(shù)組相同。 -
scale
:可選參數(shù),用于對結(jié)果進行縮放的標量值。默認值為1,即不進行縮放。 -
dtype
:可選參數(shù),輸出數(shù)組的數(shù)據(jù)類型。如果未指定,則輸出數(shù)組的數(shù)據(jù)類型與輸入數(shù)組相同
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 讀取背景和模板圖片
Back = cv2.imread('bird.jpg').astype(np.float32) / 255.0
Templet = cv2.imread('birdtemplet.bmp').astype(np.float32) / 255.0
# 計算圖像相乘
result = cv2.multiply(Templet, Back)
# 展示結(jié)果
fig, ax = plt.subplots(1, 3, figsize=(12, 4))
ax[0].imshow(cv2.cvtColor(Back, cv2.COLOR_BGR2RGB))
ax[0].set_title('背景')
ax[1].imshow(cv2.cvtColor(Templet, cv2.COLOR_BGR2RGB))
ax[1].set_title('模板')
ax[2].imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
ax[2].set_title('圖像相乘')
plt.show()
(4)除法運算
A:概述
除法運算:是指將一個圖像的每個像素值除以另一個圖像的相應像素值,從而生成一個新的圖像。則它們的除法運算可表示為
g ( x , y ) = f 1 ( x , y ) ÷ f 2 ( x , y ) g(x,y)=f_{1}(x,y) ÷ f_{2}(x,y) g(x,y)=f1?(x,y)÷f2?(x,y)
圖像除法運算在某些應用中確實比加法、減法和乘法運算應用得少一些,但在某些特定情況下,它也是很有用。在某些圖像處理應用中,圖像除法可以用來糾正圖像的光照不均勻性或顏色失真等問題。例如,在醫(yī)學圖像處理中,可以使用背景圖像對包含目標的圖像進行除法運算,以消除照明變化或其他干擾。此外,圖像除法還可以用于圖像對比度增強。在對比度增強的應用中,圖像除法可以用來增強圖像中的高頻細節(jié),例如邊緣和紋理。通過將圖像除以其平滑版本,可以增強高頻信息,并使邊緣和紋理更加明顯
B:程序
MATLAB實現(xiàn):相關(guān)函數(shù)如下,具體解釋可看MATLAB幫助手冊
imdivide(A,B,options)
函數(shù):是MATLAB中的一個圖像處理函數(shù)
-
A
和B
是兩個輸入的圖像矩陣。需要注意的是,如果B
中某個像素的值為0,則對應的像素在輸出圖像C
中的值將為Inf
(無窮大)。此外,如果輸入矩陣包含浮點數(shù),則輸出矩陣也將是浮點數(shù),否則輸出矩陣將與輸入矩陣具有相同的數(shù)據(jù)類型 -
options
結(jié)構(gòu)體包含以下字段-
RoundingMethod
:取值可以為'floor'
(向下取整,默認值)、'ceil'
(向上取整)、'fix'
(取整數(shù)部分)、'round'
(四舍五入),指定除法運算時的舍入方式。 -
NaNBehavior
:取值可以為'omit'
(省略NaN,默認值)或'replace'
(用0代替NaN),指定如何處理B
中包含NaN的情況
-
Python實現(xiàn):使用Python實現(xiàn)上述同樣的功能。需要注意的是,c2.divide
函數(shù)不支持指定舍入方式或者NaN的處理方式。如果需要實現(xiàn)這些功能,需要手動編寫代碼實現(xiàn)
cv2.divide(src1, src2, dst=None, scale=1)
函數(shù):
-
src1
和src2
是輸入的兩個圖像 -
scale
參數(shù)是一個標量,表示除以src2
的縮放因子,默認值為1
二:圖像邏輯運算
(1)概述
邏輯運算:在數(shù)字圖像處理中,邏輯運算指的是使用邏輯運算將兩個或更多的圖像組合起來的操作。這些操作也被稱為位操作,因為它們對圖像中每個像素的各個位進行操作。數(shù)字圖像處理中常用的邏輯運算包括
- 與運算(AND):在這個操作中,兩個輸入圖像中的相應像素被比較。如果兩個像素都是非零(數(shù)值為1),輸出像素被設(shè)置為1。否則,輸出像素被設(shè)置為0(只要出現(xiàn)0結(jié)果就是0)
- 或運算(OR):在這個操作中,兩個輸入圖像中的相應像素被比較。如果其中一個像素的值為1,則輸出像素被設(shè)置為1。否則,輸出像素被設(shè)置為0(只要出現(xiàn)1結(jié)果就是1)
- 異或運算(XOR):在這個操作中,兩個輸入圖像中的相應像素被比較。如果像素有不同的值(一個像素是1,另一個是0),輸出像素被設(shè)置為1。否則,輸出像素被設(shè)置為0(0和任何數(shù)異或都是任何數(shù),任何數(shù)與自己異或都是0)
- 取反運算(NOT):在這個操作中,輸入圖像中的每個像素都被反轉(zhuǎn)。如果一個像素的值是1,它就被設(shè)置為0,反之亦然
(2)程序
MATLAB實現(xiàn):相關(guān)函數(shù)如下,具體解釋可看MATLAB幫助手冊
-
C = bitcmp(A)
:按位求反 -
C = bitand(A,B)
:按位求與 -
C = bitor(A,B)
: 按位求或 -
C = bitxor(A,B)
:按位求異或
實現(xiàn)如下效果
Back=imread('bird.jpg');
Templet=imread('birdtemplet.bmp');
result1=bitcmp(Back);
result2=bitand(Templet,Back);
result3=bitor(Templet,Back);
result4=bitxor(Templet,Back);
figure;
subplot(121),imshow(Back),title('Back');
subplot(122),imshow(Templet),title('Templet');
figure;
subplot(221),imshow(result1),title('圖像求反');
subplot(222),imshow(result2),title('圖像相與');
subplot(223),imshow(result3),title('圖像相或');
subplot(224),imshow(result4),title('圖像異或');
Python實現(xiàn):使用Python實現(xiàn)上述同樣的功能文章來源:http://www.zghlxwxcb.cn/news/detail-411539.html
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
Back = cv2.imread('bird.jpg')
Templet = cv2.imread('birdtemplet.bmp')
result1 = cv2.bitwise_not(Back)
result2 = cv2.bitwise_and(Templet, Back)
result3 = cv2.bitwise_or(Templet, Back)
result4 = cv2.bitwise_xor(Templet, Back)
plt.subplot(221), plt.imshow(result1), plt.title('圖像求反')
plt.subplot(222), plt.imshow(result2), plt.title('圖像相與')
plt.subplot(223), plt.imshow(result3), plt.title('圖像相或')
plt.subplot(224), plt.imshow(result4), plt.title('圖像異或')
plt.show()
文章來源地址http://www.zghlxwxcb.cn/news/detail-411539.html
到了這里,關(guān)于(數(shù)字圖像處理MATLAB+Python)第三章圖像基本運算-第二節(jié):圖像代數(shù)運算的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!