圖像預處理 二

目錄

1. 插值方法

1.1 最近鄰插值

1.2 雙線性插值

1.3 像素區域插值

1.4 雙三次插值

1.5 Lanczos插值

1.6 小結

2. 圖像掩膜

2.1 制作掩膜

?2.2 與運算

?2.3 顏色替換

2.3.1 制作掩膜

2.3.2 顏色替換

2.4 圖像掩膜代碼

3. 圖像添加水印

3.1?模板輸入

3.2?與運算

3.3?圖像融合(圖像位與操作)

?3.4 綜合代碼

4.圖像噪點消除

4.1 均值濾波

4.2 方框濾波

4.3 高斯濾波

4.4 中值濾波

4.5 雙邊濾波

4.6 小結


1. 插值方法

在圖像處理和計算機圖形學中,插值(Interpolation)是一種通過已知數據點之間的推斷或估計來獲取新數據點的方法。它在圖像處理中常用于處理圖像的放大、縮小、旋轉、變形等操作,以及處理圖像中的像素值。

圖像插值算法是為了解決圖像縮放或者旋轉等操作時,由于像素之間的間隔不一致而導致的信息丟失和圖像質量下降的問題。當我們對圖像進行縮放或旋轉等操作時,需要在新的像素位置上計算出對應的像素值,而插值算法的作用就是根據已知的像素值來推測未知位置的像素值。

1.1 最近鄰插值

  • CV2.INTER_NEAREST
    new_img1=cv.warpAffine(img,M,(w,h),flags=cv.INTER_NEAREST)

首先給出目標點與原圖像點之間坐標的計算公式:

  • dstX:目標圖像中某點的x坐標,

  • dstY:目標圖像中某點的y坐標,

  • srcWidth:原圖的寬度,

  • dstWidth:目標圖像的寬度;

  • srcHeight:原圖的高度,

  • dstHeight:目標圖像的高度。

  • 而srcX和srcY:目標圖像中的某點對應的原圖中的點的x和y的坐標。

通俗的講,該公式就是讓目標圖像中的每個像素值都能找到對應的原圖中的像素值,這樣才能根據不同的插值方法來獲取新的像素值。根據該公式,我們就可以得到每一個目標點所對應的原圖像的點,比如一個2*2的圖像放大到4*4,如下圖所示,其中紅色的為每個像素點的坐標,黑色的則表示該像素點的像素值。

那么根據公式我們就可以計算出放大后的圖像(0,0)點對應的原圖像中的坐標為:

也就是原圖中的(0,0)點,而最近鄰插值的原則是:目標像素點的像素值與經過該公式計算出來的對應的像素點的像素值相同,如出現小數部分需要進行取整。那么放大后圖像的(0,0)坐標處的像素值就是原圖像中(0,0)坐標處的像素值,也就是10。接下來就是計算放大后圖像(1,0)點對應的原圖像的坐標,還是帶入公式:

也就是原圖中的(0.5,0)點,因此需要對計算出來的坐標值進行取整,取整后的結果為(0,0),也就是說放大后的圖像中的(1,0)坐標處對應的像素值就是原圖中(0,0)坐標處的像素值,其他像素點計算規則與此相同。

思考:

一張圖的第一行像素點的值分別為: 10 10 20 30 40 放大一倍后 新圖像的第一行的第3個像素點的值是多少?

點坐標:(2,0)

(1,0)==>10

4x2的圖像放大到8x4,放大一

?

1.2 雙線性插值

  • CV2.INTER_LINEAR

雙線性插值是一種圖像縮放、旋轉或平移時進行像素值估計的插值方法。當需要對圖像進行變換時,特別是尺寸變化時,原始圖像的某些像素坐標可能不再是新圖像中的整數位置,這時就需要使用插值算法來確定這些非整數坐標的像素值。

雙線性插值的工作原理是這樣的:

  1. 假設要查找目標圖像上坐標為 (x', y') 的像素值,在原圖像上對應的浮點坐標為 (x, y)

  2. 在原圖像上找到四個最接近(x, y)的像素點,通常記作 P00(x0, y0), P01(x0, y1), P10(x1, y0), P11(x1, y1),它們構成一個2x2的鄰域矩陣。

  3. 分別在水平方向和垂直方向上做線性插值:

  • 水平方向:根據 xx0x1 的關系計算出 P00P10P01P11 之間的插值結果。

  • 垂直方向:將第一步的結果與 yy0y1 的關系結合,再在垂直方向上做一次線性插值。

綜合上述兩次線性插值的結果,得到最終位于 (x', y') 處的新像素的估計值。

總結: 4乘4的圖像 變成6乘6的圖像 那么目標圖像的(3,3)點的像素是原圖中(1.8333,1.8333)的像素顏色,但是坐標必須是整數 它周圍有四個像素點 該取誰呢? 按照到各自的距離比例 來分配顏色值

首先要了解線性插值,而雙線性插值本質上就是在兩個方向上做線性插值。還是給出目標點與原圖像中點的計算公式

比如我們根據上述公式計算出了新圖像中的某點所對應的原圖像的點P,其周圍的點分別為Q12、Q22、Q11、Q21, 要插值的P點不在其周圍點的連線上,這時候就需要用到雙線性插值了。首先延申P點得到P和Q11、Q21的交點R1與P和Q12、Q22的交點R2,如下圖所示:

然后根據Q11、Q21得到R1的插值,根據Q12、Q22得到R2的插值,然后根據R1、R2得到P的插值即可,這就是雙線性插值。以下是計算過程:

首先計算R1和R2的插值:

然后根據R1和R2計算P的插值:

這樣就得到了P點的插值。注意此處如果先在y方向插值、再在x方向插值,其結果與按照上述順序雙線性插值的結果是一樣的。

雙線性插值的對應關系看似比較清晰,但還是有2個問題。首先是根據坐標系的不同,產生的結果不同,這張圖是左上角為坐標系原點的情況,我們可以發現最左邊x=0的點都會有概率直接復制到目標圖像中(至少原點肯定是這樣),而且就算不和原圖像中的點重合,也相當于進行了1次單線性插值(帶入到權重公式中會發現結果)。

下面這張圖是右上角為坐標系原點的情況,我們可以發現最右面的點都會有概率直接復制到目標圖像中(至少原點肯定是這樣),而且就算不和原圖像中的點重合,也相當于進行了1次單線性插值。那么當我們采用不同的坐標系時產生的結果是不一樣的,而且無論我們采用什么坐標系,最左側和最右側(最上側和最下側)的點是“不公平的”,這是第一個問題。

第二個問題時整體的圖像相對位置會發生變化。如下圖所示,左側是原圖像(3,3),右側是目標圖像(5,5),原圖像的幾何中心點是(1,1),目標圖像的幾何中心點是(2,2),根據對應關系,目標圖像的幾何中心點對應的原圖像的位置是(1.2,1.2),那么問題來了,目標圖像的原點(0,0)和原始圖像的原點是重合的,但是目標圖像的幾何中心點相對于原始圖像的幾何中心點偏右下,那么整體圖像的位置會發生偏移,所以參與計算的點相對都往右下偏移會產生相對的位置信息損失。這是第二個問題。

因此,在OpenCV中,為了解決這兩個問題,將公式進行了優化,如下所示:

使用該公式計算出原圖中的對應坐標后再進行插值計算,就不會出現上面的情況了。

1.3 像素區域插值

  • cv2.INTER_AREA

像素區域插值主要分兩種情況,縮小圖像和放大圖像的工作原理并不相同。

  • 當使用像素區域插值方法進行縮小圖像時,它就會變成一個均值濾波器(濾波器其實就是一個核,這里只做簡單了解,后面實驗中會介紹),其工作原理可以理解為對一個區域內的像素值取平均值。

  • 當使用像素區域插值方法進行放大圖像時

    • 如果圖像放大的比例是整數倍,那么其工作原理與最近鄰插值類似;

    • 如果放大的比例不是整數倍,那么就會調用雙線性插值進行放大。

其中目標像素點與原圖像的像素點的對應公式如下所示:

1.4 雙三次插值

  • cv2.INTER_CUBIC

與雙線性插值法相同,該方法也是通過映射,在映射點的鄰域內通過加權來得到放大圖像中的像素值。不同的是,雙三次插值法需要原圖像中近鄰的16個點來加權,也就是4x4的網格。

目標像素點與原圖像的像素點的對應公式如下所示:

下面我們舉例說明,假設原圖像A大小為m*n,縮放后的目標圖像B的大小為M*N。其中A的每一個像素點是已知的,B是未知的,我們想要求出目標圖像B中每一個像素點(X,Y)的值,必須先找出像素(X,Y)在原圖像A中對應的像素(x,y),再根據原圖像A距離像素(x,y)最近的16個像素點作為計算目標圖像B(X,Y)處像素值的參數,利用BiCubic基函數求出16個像素點的權重,圖B像素(x,y)的值就等于16個像素點的加權疊加。

BiCubic基函數也就是雙三次插值的權重函數,它決定了如何根據距離對周圍像素進行加權平均。

假如下圖中的P點就是目標圖像B在(X,Y)處根據上述公式計算出的對應于原圖像A中的位置,P的坐標位置會出現小數部分,所以我們假設P點的坐標為(x+u,y+v),其中x、y表示整數部分,u、v表示小數部分,那么我們就可以得到其周圍的最近的16個像素的位置,我們用a(i,j)(i,j=0,1,2,3)來表示,如下圖所示。

然后給出BiCubic函數:

a一般取-0.5或-0.75,用于控制插值函數的形狀。

d代表的是目標像素點與某個像素點之間的相對距離,d_h、d_w

我們要做的就是將上面的16個點相較于p點的位置距離算出來,獲取16像素所對應的權重W(d)。然而BiCubic函數是一維的,所以我們需要將像素點的行與列分開計算,比如a00這個點,我們需要將d_x帶入BiCubic函數中,計算a00點對于P點的x方向的權重,然后將d_y帶入BiCubic函數中,計算a00點對于P點的y方向的權重,其他像素點也是這樣的計算過程,最終我們就可以得到P所對應的目標圖像B在(X,Y)處的像素值為:

依此辦法我們就可以得到目標圖像中所有的像素點的像素值。

剛剛我們說拿到了目標點的坐標為 (x+u,y+v) ,其中 x、y 表示整數部分,u、v表示小數部分。那么我們取坐標的整數部分作為參考點,也就是(x,y),小數部分表示目標像素相對于參考點的偏移量。

比如說目標點的坐標為(3.7,2.4),那么我們的參考點就是(3,2)。

?

1.5 Lanczos插值

cv2.INTER_LANCZOS4

Lanczos插值方法與雙三次插值的思想是一樣的,不同的就是其需要的原圖像周圍的像素點的范圍變成了8*8,并且不再使用BiCubic函數來計算權重,而是換了一個公式計算權重。

首先還是目標像素點與原圖像的像素點的對應公式如下所示:

下面我們舉例說明,假設原圖像A大小為m*n,縮放后的目標圖像B的大小為M*N。其中A的每一個像素點是已知的,B是未知的,我們想要求出目標圖像B中每一個像素點(X,Y)的值,必須先找出像素(X,Y)在原圖像A中對應的像素(x,y),再根據原圖像A距離像素(x,y)最近的64個像素點作為計算目標圖像B(X,Y)處像素值的參數,利用權重函數求出64個像素點的權重,圖B像素(x,y)的值就等于64個像素點的加權疊加。

假如下圖中的P點就是目標圖像B在(X,Y)處根據上述公式計算出的對應于原圖像A中的位置,P的坐標位置會出現小數部分,所以我們假設P點的坐標為(x+u,y+v),其中x、y表示整數部分,u、v表示小數部分,那么我們就可以得到其周圍的最近的64個像素的位置,我們用a(i,j)(i,j=0,1,2,3,4,5,6,7)來表示,如下圖所示。

1.6 小結

最近鄰插值的計算速度最快,但是可能會導致圖像出現鋸齒狀邊緣和失真,效果較差。雙線性插值的計算速度慢一點,但效果有了大幅度的提高,適用于大多數場景。雙三次插值、Lanczos插值的計算速度都很慢,但是效果都很好。

在OpenCV中,關于插值方法默認選擇的都是雙線性插值,且一般情況下雙線性插值已經能滿足大部分需求。

綜合代碼:

import cv2 as cv#讀圖
cat=cv.imread("../images/images/cat1.png")
w=cat.shape[1]//2
h=cat.shape[0]//2# 旋轉
# 獲取旋轉矩陣
M=cv.getRotationMatrix2D((w,h),45,0.5)# 仿射變換
dst=cv.warpAffine(cat,M,(w,h))
cv.imshow("dst",dst)# 最近鄰插值 +  邊界復制
dst1=cv.warpAffine(cat,M,(w,h),cv.INTER_NEAREST)
cv.imshow("dst1",dst1)#雙線性插值   單線性插值插兩次:水平、 垂直
dst2=cv.warpAffine(cat,M,(w,h),cv.INTER_LINEAR)
cv.imshow( "dst2",dst2)# 像素區域插值  縮小:均值濾波   放大:整數  最近鄰   不是整數   雙線性  4點  2x2
dst3=cv.warpAffine(cat,M,(w,h),cv.INTER_AREA)
cv.imshow( "dst3",dst3)# 雙三次插值   16個  4x4
dst4=cv.warpAffine(cat,M,(w,h),cv.INTER_CUBIC)
cv.imshow( "dst4",dst4)# Lanczos插值   64個  8x8
dst5=cv.warpAffine(cat,M,(w,h),cv.INTER_LANCZOS4)
cv.imshow( "dst5",dst5)cv.waitKey(0)
cv.destroyAllWindows()

2. 圖像掩膜

2.1 制作掩膜

掩膜(Mask)是一種在圖像處理中常見的操作,它用于選擇性地遮擋圖像的某些部分,以實現特定任務的目標。掩膜通常是一個二值化圖像,并且與原圖像的大小相同,其中目標區域被設置為1(或白色),而其他區域被設置為0(或黑色),并且目標區域可以根據HSV的顏色范圍進行修改,如下圖就是制作紅色掩膜的過程:

通過這個掩膜,我們就可以對掩膜中的白色區域所對應的原圖中的區域進行處理與操作。

  • mask=cv.inRange(img,color_low,color_high)
    • cv2.inRange用于進行多通道圖像(尤其是彩色圖像)的閾值操作。

?2.2 與運算

我們在高中時學過邏輯運算中的“與”運算,其規則是當兩個命題都是真時,其結果才為真。而在圖像處理中,“與”運算被用來對圖像的像素值進行操作。具體來說,就是將兩個圖像中所有的對應像素值一一進行“與”運算,從而得到新的圖像。從上面的圖片我們可以看出,掩膜中有很多地方是黑色的,其像素值為0,那么在與原圖像進行“與”運算的時候,得到的新圖像的對應位置也是黑色的,如下圖所示:

?

通過掩膜與原圖的與運算,我們就可以提取出圖像中被掩膜覆蓋的區域(扣圖)。

  • cv2.bitwise_and(src1,src2[,mask])
    • src1:第一個輸入數組。通常是輸入的原始圖像。

    • src2:第二個輸入數組。它可以是另一個圖像、一個常數值或者與 src1 相同的圖像。

      • 當應用掩膜時,這個參數經常就是src1本身;即對同一個圖像進行操作。

      • 如果對兩個不同的圖像執行按位與操作(例如,將兩張圖片的某些部分組合在一起),可以分別將它們作為 src1src2 輸入到 cv2.bitwise_and() 函數中,創建復雜的圖像效果或進行圖像合成。

    • mask:掩膜(可選)。輸入數組元素只有在該掩膜非零時才被處理。是一個8位單通道的數組,尺寸必須與src1src2相同。

    • 返回值:輸出數組,應用掩膜后的圖像,與輸入數組大小和類型相同。

?2.3 顏色替換

前一個實驗中,我們已經能夠識別到圖像中的某一種顏色,那么我們就可以對識別到的顏色進行一個操作,比如將其替換成別的顏色,其原理就是在得到原圖的掩膜之后,對掩膜中的白色區域所對應的原圖中的區域進行一個像素值的修改即可。

2.3.1 制作掩膜

掩膜(Mask)是一種在圖像處理中常見的操作,它用于選擇性地遮擋圖像的某些部分,以實現特定任務的目標。掩膜通常是一個二值化圖像,并且與原圖像的大小相同,其中目標區域被設置為1(或白色),而其他區域被設置為0(或黑色),并且目標區域則可以根據HSV的顏色范圍進行修改,如下圖所示,可以選擇制作不同顏色的掩膜:

?

通過這個掩膜,我們就可以對掩膜中的白色區域所對應的原圖中的區域(也就是原圖中的紅色區域)進行像素值的修改,從而完成顏色替換的功能。

2.3.2 顏色替換

由于掩膜與原圖的大小相同,并且像素位置一一對應,那么我們就可以得到掩膜中白色(也就是像素值為255)區域的坐標,并將其帶入到原圖像中,即可得到原圖中的紅色區域的坐標,然后就可以修改像素值了,這樣就完成了顏色的替換,如下圖所示:

  • mask_image_np == 255: 這一部分實際上是在生成一個布爾數組,其形狀與mask_image_np相同。

  • image_np[...] = (0, 255, 0): 這里使用了NumPy的高級索引功能。

2.4 圖像掩膜代碼

import cv2 as cv
import numpy as np#讀圖
demo=cv.imread("../images/images/demo.png")
demo=cv.resize(demo,(640,640))#轉為 hsv 顏色空間
hsv=cv.cvtColor(demo,cv.COLOR_BGR2HSV)#定義顏色范圍
low=np.array([0,43,46])
high=np.array([10,255,255])#創建掩膜 cv.inRange(img,low,high)
mask=cv.inRange(hsv,low,high)# 顏色提取cv2.bitwise_and(src1,src2[,mask])傳的是原圖
dst=cv.bitwise_and(demo,demo,mask=mask)cv.imshow("old",demo)
cv.imshow("mask",mask)
cv.imshow("dst",dst)print(demo.shape)
print(mask.shape)cv.waitKey(0)
cv.destroyAllWindows()

?運行結果:

?顏色替換:

import cv2 as cv
import numpy as np
# 讀圖
demo=cv.imread("../images/images/demo.png")
demo=cv.resize(demo,(640,640))
# 轉為hsv顏色空間
hsv=cv.cvtColor(demo,cv.COLOR_BGR2HSV)# 定義顏色范圍
low=np.array([0,43,46])
high=np.array([10,255,255])#創建掩膜cv.inRange(img,low,high)傳hsv顏色空間下的圖像
mask=cv.inRange(hsv,low,high)# 顏色替換
arr=mask==255
# print(arr)
demo[arr]=(0,255,0)
# demo[mask==255]=(0,255,0)
cv.imshow("old",demo)
cv.waitKey(0)
cv.destroyAllWindows()

?運行結果:

3. 圖像添加水印

本實驗中添加水印的概念其實可以理解為將一張圖片中的某個物體或者圖案提取出來,然后疊加到另一張圖片上。具體的操作思想是通過將原始圖片轉換成灰度圖,并進行二值化處理,去除背景部分,得到一個類似掩膜的圖像。然后將這個二值化圖像與另一張圖片中要添加水印的區域進行“與”運算,使得目標物體的形狀出現在要添加水印的區域。最后,將得到的目標物體圖像與要添加水印的區域進行相加,就完成了添加水印的操作。這樣可以實現將一個圖像中的某個物體或圖案疊加到另一個圖像上,從而實現添加水印的效果。就本實驗而言,會用到兩個新的組件,一個是模板輸入,一個是圖像融合。

3.1?模板輸入

其實,該組件起到的就是圖片輸入的功能,只不過使用模板輸入所輸入的圖片其實是作為要添加的水印,有了水印的彩色圖之后,我們需要用它來制作一個掩模,這就用到了灰度化和二值化,即先灰度化后二值化,這就得到了帶有水印圖案的掩模。

3.2?與運算

有了模板的掩膜之后(也就是二值化圖),我們就可以在要添加水印的圖像中,根據掩膜的大小切割出一個ROI區域,也就是我們要添加水印的區域,之后讓其與模板的掩膜進行與運算,我們知道,與運算的過程中,只要有黑色像素,那么得到的結果圖中的對應位置也會是黑色像素。由于模板的掩膜中目標物體的像素值為黑色,所以經過與運算后,就會在ROI區域中得到模板圖的形狀。

3.3?圖像融合(圖像位與操作)

將模板的形狀添加到水印區域之后,就可以將該圖像與原始的模板圖進行圖像融合。該組件的目的就是將圖像對應的數組中的對應元素進行相加(一定要注意這里的兩個數組是規格相同的,也就是說要么都是灰度圖,要么都是彩圖),其過程如下圖所示。

因此就可以讓原始的模板圖與添加模板圖形狀的ROI區域進行圖像融合,得到添加水印的ROI區域。

?3.4 綜合代碼

import cv2 as cv# 讀圖
bg=cv.imread("../images/images/bg.png")
logo=cv.imread("../images/images/logohq.png")
h,w=logo.shape[0:2]
roi=bg[:h,:w]# 轉灰度
gray=cv.cvtColor(logo,cv.COLOR_BGR2GRAY)
# 二值化# 黑logo白底  與上logo
_,mask1=cv.threshold(gray,200,255,cv.THRESH_BINARY)
bg1=cv.bitwise_and(roi,roi,mask=mask1)
cv.imshow("mask1",mask1)
cv.imshow("bg1",bg1)# 白logo黑底  與上logo
_,mask2=cv.threshold(gray,200,255,cv.THRESH_BINARY_INV)
logo1=cv.bitwise_and(logo,logo,mask=mask2)
cv.imshow("mask2",mask2)
cv.imshow("logo1",logo1)# 融合
# roi[:]=cv.add(bg1,logo1)
dst=cv.add(logo1,bg1)
roi[:]=dst
cv.imshow("roi",roi)
cv.imshow("bg",bg)cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

?

4.圖像噪點消除

首先介紹一些概念:

噪聲:指圖像中的一些干擾因素,通常是由圖像采集設備、傳輸信道等因素造成的,表現為圖像中隨機的亮度,也可以理解為有那么一些點的像素值與周圍的像素值格格不入。常見的噪聲類型包括高斯噪聲和椒鹽噪聲。高斯噪聲是一種分布符合正態分布的噪聲,會使圖像變得模糊或有噪點。椒鹽噪聲則是一些黑白色的像素值分布在原圖像中。

濾波器:也可以叫做卷積核,與自適應二值化中的核一樣,本身是一個小的區域,有著特定的核值,并且工作原理也是在原圖上進行滑動并計算中心像素點的像素值。濾波器可分為線性濾波和非線性濾波,線性濾波對鄰域中的像素進行線性運算,如在核的范圍內進行加權求和,常見的線性濾波器有均值濾波、高斯濾波等。非線性濾波則是利用原始圖像與模板之間的一種邏輯關系得到結果,常見的非線性濾波器中有中值濾波器、雙邊濾波器等。

濾波與模糊聯系與區別:

  • 它們都屬于卷積,不同濾波方法之間只是卷積核不同(對線性濾波而言)

  • 低通濾波器是模糊,高通濾波器是銳化

  • 低通濾波器就是允許低頻信號通過,在圖像中邊緣和噪點都相當于高頻部分,所以低通濾波器用于去除噪點、平滑和模糊圖像。高通濾波器則反之,用來增強圖像邊緣,進行銳化處理。

注意:椒鹽噪聲可以理解為斑點,隨機出現在圖像中的黑點或白點;高斯噪聲可以理解為拍攝圖片時由于光照等原因造成的噪聲。

4.1 均值濾波

均值濾波是一種最簡單的濾波處理,它取的是卷積核區域內元素的均值,如3×3的卷積核:

在濾波算法組件中,當參數filtering_method選為均值濾波,參數component_param為ksize,代表卷積核的大小,eg:ksize=3,則代表使用3×3的卷積核。

比如有一張4*4的圖片,現在使用一個3*3的卷積核進行均值濾波時,其過程如下所示:

對于邊界的像素點,則會進行邊界填充,以確保卷積核的中心能夠對準邊界的像素點進行濾波操作。在OpenCV中,默認的是使用BORDER_REFLECT_101的方式進行填充,下面的濾波方法中除了中值濾波使用的是BORDER_REPLICATE進行填充之外,其他默認也是使用這個方式進行填充,因此下面就不再贅述。通過卷積核在原圖上從左上角滑動計算到右下角,從而得到新的4*4的圖像的像素值。

?

4.2 方框濾波

方框濾波跟均值濾波很像,如3×3的濾波核如下:

在濾波算法組件中,當參數filtering_method選為方框濾波時,參數component_param為ksize,ddepth,normalize。下面講解這3個參數的含義:

  • ksize:代表卷積核的大小,eg:ksize=3,則代表使用3×3的卷積核。

  • ddepth:輸出圖像的深度,-1代表使用原圖像的深度。

    • 圖像深度是指在數字圖像處理和計算機視覺領域中,每個像素點所使用的位數(bit depth),也就是用來表示圖像中每一個像素點的顏色信息所需的二進制位數。圖像深度決定了圖像能夠表達的顏色數量或灰度級。

  • normalize:當normalize為True的時候,方框濾波就是均值濾波,上式中的a就等于1/9;normalize為False的時候,a=1,相當于求區域內的像素和。

其濾波的過程與均值濾波一模一樣,都采用卷積核從圖像左上角開始,逐個計算對應位置的像素值,并從左至右、從上至下滑動卷積核,直至到達圖像右下角,唯一的區別就是核值可能會不同。

?

4.3 高斯濾波

  • 高斯濾波是一種常用的圖像處理技術,主要用于平滑圖像、去除噪聲。它通過使用高斯函數(正態分布)作為卷積核來對圖像進行模糊處理。

前面兩種濾波方式,卷積核內的每個值都一樣,也就是說圖像區域中每個像素的權重也就一樣。高斯濾波的卷積核權重并不相同:中間像素點權重最高,越遠離中心的像素權重越小。還記得我們在自適應二值化里是怎么生成高斯核的嗎?這里跟自適應二值化里生成高斯核的步驟是一樣的,都是以核的中心位置為坐標原點,然后計算周圍點的坐標,然后帶入下面的高斯公式中。

其中,x和 y 是相對于中心點的坐標偏移量,σ 是標準差,控制著高斯函數的寬度和高度。較大的 σ 值會導致更廣泛的平滑效果。

卷積核通常是一個方形矩陣,其元素值根據高斯函數計算得出,并且這些值加起來等于1,近似于正態分布,以確保輸出圖像的亮度保持不變。

其中的值也是與自適應二值化里的一樣,當時會取固定的系數,當kernel大于7并且沒有設置時,會使用固定的公式進行計算\sigma的值:

我們還是以3*3的卷積核為例,其核值如下所示:

得到了卷積核的核值之后,其濾波過程與上面兩種濾波方式的濾波過程一樣,都是用卷積核從圖像左上角開始,逐個計算對應位置的像素值,并從左至右、從上至下滑動卷積核,直至到達圖像右下角,唯一的區別就是核值不同。

在濾波算法組件中,當參數filtering_method選為高斯濾波,參數component_param為ksize,sigmaX。下面講解這2個參數的含義:

ksize:代表卷積核的大小,eg:ksize=3,則代表使用3×3的卷積核。

sigmaX:就是高斯函數里的值,σx值越大,模糊效果越明顯。高斯濾波相比均值濾波效率要慢,但可以有效消除高斯噪聲,能保留更多的圖像細節,所以經常被稱為最有用的濾波器。均值濾波與高斯濾波的對比結果如下(均值濾波丟失的細節更多):

 

4.4 中值濾波

中值又叫中位數,是所有數排序后取中間的值。中值濾波沒有核值,而是在原圖中從左上角開始,將卷積核區域內的像素值進行排序,并選取中值作為卷積核的中點的像素值,其過程如下所示:

中值濾波就是用區域內的中值來代替本像素值,所以那種孤立的斑點,如0或255很容易消除掉,適用于去除椒鹽噪聲和斑點噪聲。中值是一種非線性操作,效率相比前面幾種線性濾波要慢。

比如下面這張斑點噪聲圖,用中值濾波顯然更好:

在濾波算法組件中,當參數filtering_method選為中值濾波,參數component_param為ksize,代表卷積核的大小,eg:ksize=3,則代表使用3×3的卷積核。

?

4.5 雙邊濾波

模糊操作基本都會損失掉圖像細節信息,尤其前面介紹的線性濾波器,圖像的邊緣信息很難保留下來。然而,邊緣(edge)信息是圖像中很重要的一個特征,所以這才有了雙邊濾波。

可以看到,雙邊濾波明顯保留了更多邊緣信息,下面來介紹一下雙邊濾波。

雙邊濾波的基本思路是同時考慮將要被濾波的像素點的空域信息(周圍像素點的位置的權重)和值域信息(周圍像素點的像素值的權重)。為什么要添加值域信息呢?是因為假設圖像在空間中是緩慢變化的話,那么臨近的像素點會更相近,但是這個假設在圖像的邊緣處會不成立,因為圖像的邊緣處的像素點必不會相近。因此在邊緣處如果只是使用空域信息來進行濾波的話,得到的結果必然是邊緣被模糊了,這樣我們就丟掉了邊緣信息,因此添加了值域信息。

雙邊濾波采用了兩個高斯濾波的結合,一個負責計算空間鄰近度的權值(也就是空域信息),也就是上面的高斯濾波器,另一個負責計算像素值相似度的權值(也就是值域信息),也是一個高斯濾波器。其公式如下所示:

其中,

  • S(i,j):指以(i,j)為中心的鄰域的范圍

  • f(k,l):輸入的點的像素值,也就是在原始圖像中位置 (k,l)的像素值。

  • ω(i,j,k,l):這是權重函數,它決定了位置 (k,l)的像素值f(k,l)對位置(i,j)的貢獻程度。

  • g(i,j):表示中心點(i,j)的像素值,也就是經過雙邊濾波處理后,在位置(i,j)的像素值。

  • 分子:∑(k,l)∈S(i,j)f(k,l)ω(i,j,k,l)

    • 這是對鄰域內所有像素值 f(k,l)與其對應的權重 ω(i,j,k,l)的乘積求和。這一步計算了加權后的像素值總和。

  • 分母:∑(k,l)∈S(i,j)ω(i,j,k,l)

    • 這是對鄰域內所有像素的權重 ω(i,j,k,l) 求和。這一步計算了權重的總和。

  • 計算過程:

    1. 確定鄰域:選擇一個以 (i,j)為中心的鄰域 S(i,j)。

    2. 計算權重:對于鄰域內的每個像素 (k,l),計算其權重 ω(i,j,k,l)。

    3. 加權求和:將鄰域內每個像素值 f(k,l) 與其權重 ω(i,j,k,l)相乘,并對所有乘積求和。

    4. 歸一化:將加權求和的結果除以權重總和,得到最終的像素值 g(i,j)。

在本實驗中的濾波算法組件中,當參數filtering_method選為雙邊濾波,參數component_param為ksize,d,sigmaColor,sigmaSpace,下面講解這4個參數的含義:

  • ksize:卷積核的大小

  • d:過濾時周圍每個像素領域的直徑,這里已經設置了核大小。d=9===>9x9

  • sigmaColor:在color space(色彩空間)中過濾sigma。參數越大,那些顏色足夠相近的的顏色的影響越大。較大的sigmaColor值意味著更大的顏色差異將被允許參與到加權平均中,從而使得顏色相近但不完全相同的像素也能夠相互影響。

  • sigmaSpace:在coordinate space(坐標空間)中過濾sigma。這個參數是坐標空間中的標準差,決定了像素位置對濾波結果的影響程度。它定義了在圖像的空間域中,一個像素可以影響周圍像素的最大距離。換句話說,它控制著濾波器作用的范圍大小。

關于2個sigma參數:

簡單起見,可以令2個sigma的值相等;

如果他們很小(小于10),那么濾波器幾乎沒有什么效果;

如果他們很大(大于150),那么濾波器的效果會很強,使圖像顯得非常卡通化。

關于參數d:

過大的濾波器(d>5)執行效率低。

對于實時應用,建議取d=5;

對于需要過濾嚴重噪聲的離線應用,可取d=9;

4.6 小結

  1. 在不知道用什么濾波器好的時候,優先高斯濾波,然后均值濾波。
  2. 斑點和椒鹽噪聲優先使用中值濾波。
  3. 要去除噪點的同時盡可能保留更多的邊緣信息,使用雙邊濾波。
  4. 線性濾波方式:均值濾波、方框濾波、高斯濾波(速度相對快)。
  5. 非線性濾波方式:中值濾波、雙邊濾波(速度相對慢)。

代碼:

?

import cv2 as cv
#讀圖
lvbo2=cv.imread("../images/images/lvbo.png")
cv.imshow("old",lvbo2)
lvbo3=cv.imread("../images/images/lvbo3.png")# 均值濾波
dst1=cv.blur(lvbo2,(3,3))
cv.imshow("dst1",dst1)# 方框濾波
dst2=cv.boxFilter(lvbo2,-1,(3,3),normalize=False)
cv.imshow("dst2",dst2)#高斯濾波
dst3=cv.GaussianBlur(lvbo2,(3,3),1)
cv.imshow("dst3",dst3)#中值濾波
dst4=cv.medianBlur(lvbo3,5)
cv.imshow("dst4",dst4)#雙邊濾波
dst5=cv.bilateralFilter(lvbo2,7,75,75)
cv.imshow("dst5",dst5)cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916383.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1.Java發展簡史與設計哲學

目錄引言一、生活里到處都是 Java1.1 Java 在生活中的小例子1.2 Java 的核心應用場景二、Java 是咋誕生的,又有啥核心設計思想2.1 Java 的發展歷程2.2 Java 的三大設計哲學2.3 Java 哲學給行業帶來的變革三、為啥大家都選 Java 呢3.1 和其他主流編程語言對比的優勢3…

基于粒子群算法優化高斯過程回歸(PSO-GPR)的多輸出回歸

基于粒子群算法優化高斯過程回歸(PSO-GPR)的多輸出回歸 使用粒子群優化算法(PSO)優化高斯過程回歸(GPR)模型,解決多輸入多輸出(MIMO)回歸問題。該模型能夠同時預測多個相關輸出變量。 %% 基于粒子群算法優化高斯過程回歸(PSO-GPR)的多輸出回歸 % 作者: MATLAB技術助手 % 日期…

學Simulink——AC-DC整流器場景:基于PWM整流器拓撲結構的建模:三相電壓型PWM整流器(SR)單位功率因數控制仿真

目錄 手把手教你學Simulink——AC-DC整流器場景:基于PWM整流器拓撲結構的建模:三相電壓型PWM整流器(SR)單位功率因數控制仿真 一、背景介紹 二、系統結構設計 三、建模過程詳解 第一步:創建新Simulink項目 第二步:添加主要模塊 1. 三相交流電源 2. PWM整流器電路 …

深度解析 noisereduce:開源音頻降噪庫實踐

項目簡介 noisereduce 是一個基于 Python 的開源音頻降噪庫,專注于為科研、工程和日常應用提供簡單高效的噪聲抑制工具。該項目由 Tim Sainburg 維護,核心算法基于頻譜減法(Spectral Gating),無需深度學習或復雜訓練,適合快速集成到音頻處理、語音識別、播客后期、科學實…

lottie 動畫使用

lottie 官網: https://app.lottiefiles.comhttps://app.lottiefiles.com 選擇動畫 未下載過 已下載過 點擊download 保存到自己的工作空間后,可獲取lottie文件 使用vue 點擊后獲取代碼 第一步,項目中加載模塊 npm install lottiefiles/do…

Java,八股,cv,算法——雙非研0四修之路day16

目錄 昨日總結 今日計劃 算法——兩個數組的交集 算法——兩數之和 緩存穿透 常見解決方案 緩存雪崩 常見解決方案 緩存擊穿 常見解決方案 棧溢出 堆溢出 功能接口式參數&泛型函數 ?編輯 昨日總結 緩存問題完結(緩存穿透、雪崩、擊穿)…

基于python的微博評論和博文文本分析,包括LDA+聚類+詞頻分析+lstm熱度預測,數據量10000條

思路步驟:本文實現了從文本評論數據中提取有用信息,分析其情感分布、主題分布,并通過可視化展示。以下是具體步驟和思路:1、數據準備與預處理加載數據:通過 pandas 讀取文本和評論數據,并進行合并處理。文本…

【CNN】模型評估標準

1.分類模型評價指標在模型評估中,有多個標準用于衡量模型的性能,這些標準包括準確率(Accuracy)、精確率(Precision)、召回率(Recall)、F1 分數(F1-Score)等。…

Python爬蟲實戰:詩詞名句網《三國演義》全集

Beautiful Soup實戰案例:爬取"詩詞名句網" 目標 爬取"詩詞名句網"上的古典文學作品內容,包括書籍目錄和章節內容,并將每章內容獨立保存為文本文件。 目標網址: 《三國演義》全集在線閱讀_史書典籍_詩詞名句網 要求 書…

AWS CAF:企業云轉型的戰略指南

在數字化轉型的大潮中,企業正面臨前所未有的變革壓力。如何利用云計算驅動業務創新、提升IT敏捷性、優化成本結構,已成為眾多企業迫切需要解決的關鍵課題。然而,云遷移并不是簡單地將本地應用“復制”到云上,它是一項牽涉企業組織…

【Redis】Linux 配置Redis

一、Redis介紹 Redis(Remote Dictionary Server)是一款開源的、高性能的鍵值對(Key-Value)存儲數據庫,由 Salvatore Sanfilippo 于 2009 年開發,采用 ANSI C 語言編寫。它以內存存儲為核心,支持…

MongoDB數據庫高并發商業實踐優化·運行優化之不可使用root賬戶進行MongoDB運行-優雅草卓伊凡

MongoDB數據庫高并發商業實踐優化運行優化之不可使用root賬戶進行MongoDB運行-優雅草卓伊凡 引言 關于最近優雅草卓伊凡發布關于MongoDB的內容是由于我們的甲方上線了一個很老的產品,但是他的用戶量極大,并且還有各種人搞事情,不斷的來GJ&a…

戴爾電腦 Linux 安裝與配置指南_導入mysql共享文件夾

本指南將詳細介紹在戴爾電腦上安裝 Linux 操作系統的步驟,以及后續的重要配置,包括系統選擇、安裝流程、MySQL 數據恢復、網絡配置、文件共享和遠程維護等。步驟清晰且配有命令行示例和配置文件示例,適合初中級用戶參考。1、Linux 系統選擇與…

昇思學習營-DeepSeek-R1-Distill-Qwen-1.5B 模型LoRA微調學習心得

LoRA微調:加入參數式微調凍結原始網絡參數,對Attention層中QKV等添加旁支,包含兩個低維度的矩陣A和矩陣B,微調過程中僅更新A、B 矩陣效果:訓練參數被大幅降低,資源消耗較低。對attention的參數加入如下圖所…

彩色轉灰度的核心邏輯:三種經典方法及原理對比

灰度實驗將彩色圖像轉換為灰度圖像的過程稱為灰度化,這種做法在圖像處理和計算機視覺領域非常常見。灰度圖與彩色圖最大的不同就是:彩色圖是由R、G、B三個通道組成,而灰度圖只有一個通道,也稱為單通道圖像,所以彩色圖轉…

Spring Boot 項目啟動自動執行邏輯的最佳實踐:掌握 CommandLineRunner

前言 Spring Boot 啟動階段,總有些操作迫不及待沖在前線:配置要加載,數據要準備,日志要搶首發,仿佛個個爭當“啟動 MVP”。如果你也想讓項目一啟動就自動開工,少寫點手動觸發的“苦力邏輯”,那 CommandLineRunner 就是你的得力助手。它像那個永遠第一個打卡的同事,不喝…

高可用集群KEEPALIVED的詳細部署

一.高可用集群 1.1 集群類型 LB:Load Balance 負載均衡 LVS/HAProxy/nginx(http/upstream, stream/upstream) HA:High Availability 高可用集群 數據庫、Redis SPoF: Single Point of Failure,解決單點故障 HPC&#x…

[論文閱讀] 人工智能 + 軟件工程 | NoCode-bench:評估LLM無代碼功能添加能力的新基準

NoCode-bench:評估LLM無代碼功能添加能力的新基準 論文:NoCode-bench: A Benchmark for Evaluating Natural Language-Driven Feature Addition 研究背景:當AI嘗試給軟件"加新功能",我們需要一張靠譜的"考卷"…

【Git知識】Git 常用知識集合之基礎--分支系統與 Tag 標簽機制

🧰 Git 常用知識集合Git 是程序員的“時間機器”。這份手冊幫你從入門到精通,把 Git 玩明白。1?? Git 基礎操作流程 📌 三步走流程:添加 → 提交 → 推送 git add . # 把所有修改加入暫存區 git commit -m …

深入解析 Spark:關鍵問題與答案匯總

在大數據處理領域,Spark 憑借其高效的計算能力和豐富的功能,成為了眾多開發者和企業的首選框架。然而,在使用 Spark 的過程中,我們會遇到各種各樣的問題,從性能優化到算子使用等。本文將圍繞 Spark 的一些核心問題進行…