0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV入門之OpenCV的基本操作3

jf_78858299 ? 來源:DL INtoOUT ? 作者:AN ? 2023-02-07 14:33 ? 次閱讀

6、圖像的縮放、翻轉(zhuǎn)、旋轉(zhuǎn)、平移、透視

7、卷積操作:均值濾波、方盒濾波、高斯濾波、中值濾波、雙邊濾波

8、算子操作:sobel算子、scharr算子、拉普拉斯算子、Canny邊緣檢測

9、形態(tài)學(xué)操作:腐蝕、膨脹、開運算、閉運算、頂帽、黑帽


6、圖像的縮放、翻轉(zhuǎn)、旋轉(zhuǎn)、平移、透視

OpenCV提供了一系列的api,cv.flip、cv.rotate、cv.resize、cv.warpAffine和cv.warpPerspective等,具體算法實現(xiàn)可查看OpenCV的源碼。原理簡單來說就是要找到像素變換前與變換后的位置坐標(biāo)對應(yīng)關(guān)系。

平移是物體位置的移動。如果知道在(x,y)方向上的位移,則將其設(shè)為(tx, ty),可以創(chuàng)建轉(zhuǎn)換矩陣M,如下所示

圖片

圖像旋轉(zhuǎn)角度為θ是通過以下形式的變換矩陣實現(xiàn)的:

圖片

注:證明如下

圖片

OpenCV提供了可縮放的旋轉(zhuǎn)以及可調(diào)整的旋轉(zhuǎn)中心,因此可以在任何位置旋轉(zhuǎn)。修改后的變換矩陣為:

圖片

其中

圖片

可以通過cv2.getRotationMatrix2D來獲得旋轉(zhuǎn)矩陣,不需要手算。

對于透視變換,需要在輸入圖像上有4個點,在輸出圖像上需要相應(yīng)的點。在這四個點中,其中三個不應(yīng)共線。然后可以通過函數(shù)cv.getPerspectiveTransform找到變換矩陣。

def AffineTrans():
    img = cv2.imread('./images/test.jpg')
    # 圖像變換尺寸
    # fx軸和fy軸的縮放比例,interpolation插值方式,cv2.INTER_LINEAR  #默認(rèn)效果
    # cv2.INTER_NEAREST,cv2.INTER_AREA,cv2.INTER_CUBIC
    img_resize = cv2.resize(img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_AREA)


    # 圖像翻轉(zhuǎn),flipCode=0:上下翻轉(zhuǎn),大于0左右翻轉(zhuǎn),小于0:上下加左右
    img_flip = cv2.flip(img,flipCode=1)
    # 圖像旋轉(zhuǎn)
    img_rotate = cv2.rotate(img,rotateCode=cv2.ROTATE_90_CLOCKWISE)


    h,w,c = img.shape
    # 圖像平移
    # cv2.warpAffine(src,變換矩陣,輸出圖像大小,)
    # 變換矩陣,向右移動100個像素,向下移動100個像素
    M = np.float32([[1,0,100],
                    [0,1,100]])
    img_warp = cv2.warpAffine(img,M,dsize=(200,500))


    # 獲得變換矩陣,(中心點,按逆時針旋轉(zhuǎn),scal:縮放比例)
    M_r = cv2.getRotationMatrix2D((300,250),15,1)
    img_rotate_ = cv2.warpAffine(img,M_r,(w,h))


    # 通過三個點確定旋轉(zhuǎn)
    # 需要原圖三個點和變換后的三個點對應(yīng)的坐標(biāo)
    src = np.float32([[100,200],[300,200],[200,400]])
    dst = np.float32([[200,300],[300,400],[300,500]])
    M1 = cv2.getAffineTransform(src,dst)
    img_r3 = cv2.warpAffine(img,M1,(w,h))


    # 透視變換
    src_p = np.float32([[100,100],[700,100],[100,300],[700,300]])
    dst_p = np.float32([[0,0],[720,0],[0,320],[720,320]])
    M_p = cv2.getPerspectiveTransform(src_p,dst_p)
    img_perspect = cv2.warpPerspective(img,M_p,(w,h))


    cv2.imshow("imshow", img_r3)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

7、卷積操作:均值濾波、方盒濾波、高斯濾波、中值濾波、雙邊濾波

圖像濾波,就是在盡量保留圖像細(xì)節(jié)特征的條件下對目標(biāo)圖像的噪聲進行抑制,可以把濾波器想象成一個包含加權(quán)系數(shù)的窗口,當(dāng)使用這個濾波器平滑處理圖像時,就把這個窗口放到圖像之上,透過這個窗口來看我們得到的圖像。

而對濾波處理的要求有兩個,一是不能損壞圖像的輪廓及邊緣等重要信息;二是使圖像清晰視覺效果好。

神經(jīng)網(wǎng)絡(luò)中的話來說就是用不同的卷積核對圖像進行卷積操作,以產(chǎn)生不同的效果。不同的是神經(jīng)網(wǎng)絡(luò)中的卷積核通過訓(xùn)練得到,而圖像濾波是用已知的卷積核對圖像進行卷積。

方盒濾波、均值濾波和中值濾波都可以起到平滑圖像,濾去噪聲的功能。 均值濾波采用線性的方法,平均整個窗口范圍內(nèi)的像素值 ,均值濾波本身存在著固有的缺陷,即它不能很好地保護圖像細(xì)節(jié),在圖像去噪的同時也破壞了圖像的細(xì)節(jié)部分,從而使圖像變得模糊,不能很好地去除噪聲點。

均值濾波對高斯噪聲表現(xiàn)較好,對椒鹽噪聲表現(xiàn)較差 。中值濾波采用非線性的方法,它在平滑脈沖噪聲方面非常有效,同時它可以保護圖像尖銳的邊緣,選擇適當(dāng)?shù)狞c來替代污染點的值,所以處理效果好,對椒鹽噪聲表現(xiàn)較好,對高斯噪聲表現(xiàn)較差。

假設(shè):一個5*5的卷積核,均值濾波則為:

圖片

中值濾波是選取圖像中窗口大小范圍內(nèi)的像素點,將這些像素值排序,然后將位于中間位置的像素值作為當(dāng)前像素點的像素值,讓周圍的像素值接近真實值,從而消除孤立的噪聲點。假設(shè)3x3的串口大小,像素排序后為[1,2,5,5,6,7,8,9,11],取其中的中間值6作為卷積后的結(jié)果值。

注1:方盒濾波是OpenCV中提供的一個API

方盒濾波卷積核:

圖片

參數(shù)a的作用:normalize = true, a = 1/W * H 此時為均值濾波

normalize = false, a=1 此時不進行均值化,輸出的結(jié)果為25個元素之和。當(dāng)normalize = true時,方盒濾波 ==平均濾波,一般情況下都使用均值濾波,所以在使用時直接調(diào)用均值濾波API

注2:高斯噪聲和椒鹽噪聲

高斯噪聲,顧名思義是指服從高斯分布(正態(tài)分布)的一類噪聲,通常是因為不良照明和高溫引起的傳感器噪聲。

椒鹽噪聲,通常是由圖像傳感器,傳輸信道,解壓處理等產(chǎn)生的黑白相間的亮暗點噪聲(椒-黑,鹽-白)。

高斯濾波就是將為正態(tài)分布(“高斯分布”)的卷積核對圖像進行卷積操作。

要產(chǎn)生一個高斯濾波模板,以模板的中心位置為坐標(biāo)原點進行取樣。模板在各個位置的坐標(biāo),如下圖所示(x軸水平向右,y軸豎直向下),用數(shù)值代替上面(x, y),假定中心點的坐標(biāo)為(0, 0),那么距離它周圍的八個點的坐標(biāo)如下:

圖片

更遠的點,依次類推,為了計算權(quán)重矩陣,需要設(shè)定σ的值,假定σ=1.5,則模糊半徑為1的權(quán)重矩陣如下:

圖片

這九個點的權(quán)重綜合等于 0.4787147,如果只計算這 9 個點的加權(quán)平均,還必須讓他們的權(quán)重之和等于1,因此上面的九個值還要分別除以 0.4787147,得到最終的權(quán)重矩陣:

圖片

卷積后,中心點的值不一定最大,但是其比重是最大的,兩邊的值可能比較大,但是其比重較小。中心點的值與周圍的加權(quán)平均了所以圖像變模糊了。

雙邊濾波結(jié)合圖像的空間鄰近度和像素值相似度的一種折中處理,同時考慮空域信息和灰度相似性,可以保留邊緣,同時可以對邊緣內(nèi)的區(qū)域進行平滑處理 。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差sigma-d,它是基于空間分布的高斯濾波函數(shù),所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的保存。但是由于保存了過多的高頻信息,對于彩色圖像里的高頻噪聲,雙邊濾波器不能夠干凈的濾掉,只能夠?qū)τ诘皖l信息進行較好的濾波。

公式中可以看到,因為邊緣附近的灰度值差比較大,所以如果遇到邊緣附近,灰度信息的權(quán)重比較大,所以中心點權(quán)重比較大,保留了邊緣信息。

def Convolution():
    img = cv2.imread('./images/test.jpg')
    # 卷積核測試
    kernel_blur = np.ones([3,3],np.float32)/9
    kernel1 = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
    kernel2 = np.array([[-2,1,0],[-1,1,1],[0,1,2]])
    kernel3 = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])
    new_img = cv2.filter2D(img,-1,kernel3)
    # 方盒濾波、均值濾波
    img_box = cv2.boxFilter(img,-1,(5,5),normalize=True)
    img_blur = cv2.blur(img,(5,5))


    # 高斯濾波 sigma越大越模糊標(biāo)準(zhǔn)差越大,ksize越大越模糊,適合雪花點
    img_gauss = cv2.GaussianBlur(img,ksize=(3,3),sigmaX=5)


    # 中值濾波,適合椒鹽噪聲
    img_median = cv2.medianBlur(img,ksize=3)


    # 雙邊濾波,灰度值兩邊進行高斯模糊嗎,即保留邊緣信息進行局部優(yōu)化
    # sigmaColor:計算像素信息的sigma,sigmaSpace計算空間信息的sigma
    img_bilateral = cv2.bilateralFilter(img,d=7,sigmaColor=10,sigmaSpace=20)


    cv2.imshow("imshow", img_bilateral)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像處理
    +關(guān)注

    關(guān)注

    27

    文章

    1279

    瀏覽量

    56587
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3229

    瀏覽量

    42343
  • 計算機視覺
    +關(guān)注

    關(guān)注

    8

    文章

    1695

    瀏覽量

    45905
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    625

    瀏覽量

    41218
收藏 人收藏

    評論

    相關(guān)推薦

    基本閾值操作_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:基本閾值操作
    發(fā)表于 06-06 15:39 ?8次下載

    基本鼠標(biāo)操作_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:基本鼠標(biāo)操作
    發(fā)表于 06-06 15:39 ?5次下載

    OpenCV進行基本繪圖_《OpenCV3編程入門》書本配套源

    OpenCV3編程入門》書本配套源代碼:用OpenCV進行基本繪圖
    發(fā)表于 05-11 16:46 ?36次下載

    支持向量機SVM引導(dǎo)_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:支持向量機SVM引導(dǎo)
    發(fā)表于 06-06 15:52 ?2次下載

    OpenCV3編程入門-源碼例程全集-OpenCV開發(fā)環(huán)境的配置

    OpenCV3編程入門-源碼例程全集-OpenCV開發(fā)環(huán)境的配置,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 16:27 ?20次下載

    OpenCV3編程入門-源碼例程全集-點追蹤

    OpenCV3編程入門-源碼例程全集-點追蹤
    發(fā)表于 09-18 16:38 ?0次下載

    OpenCV3編程入門-源碼例程全集-播放視頻

    OpenCV3編程入門-源碼例程全集-播放視頻
    發(fā)表于 09-17 22:54 ?18次下載

    OpenCV3編程入門-源碼例程全集-人臉識別

    OpenCV3編程入門-源碼例程全集-人臉識別
    發(fā)表于 09-17 22:55 ?2次下載

    OpenCV3編程入門-源碼例程全集-模板匹配

    OpenCV3編程入門-源碼例程全集-模板匹配
    發(fā)表于 09-17 22:55 ?4次下載

    OpenCV3編程入門-源碼例程全集-基本閾值操作

    OpenCV3編程入門-源碼例程全集-基本閾值操作,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 16:55 ?0次下載

    OpenCV3編程入門-源碼例程全集-基本鼠標(biāo)操作

    OpenCV3編程入門-源碼例程全集-基本鼠標(biāo)操作,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 16:55 ?0次下載

    支持向量機SVM引導(dǎo)_OpenCV3編程入門-源碼例程

    OpenCV3編程入門-源碼例程全集-支持向量機SVM引導(dǎo),感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 17:02 ?1次下載

    OpenCV進行基本繪圖_OpenCV3編程入門-源碼例程

    OpenCV3編程入門-源碼例程全集-用OpenCV進行基本繪圖,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 17:02 ?3次下載

    OpenCV入門OpenCV的基本操作2

    OpenCV是一個基于Apache2.0許可(開源)發(fā)行的跨平臺計算機視覺和機器學(xué)習(xí)軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它輕量級而且高效——由一系列
    的頭像 發(fā)表于 02-07 14:19 ?796次閱讀
    <b class='flag-5'>OpenCV</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>OpenCV</b>的基本<b class='flag-5'>操作</b>2

    OpenCV入門OpenCV的基本操作實戰(zhàn)代碼

    OpenCV是一個基于Apache2.0許可(開源)發(fā)行的跨平臺計算機視覺和機器學(xué)習(xí)軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它輕量級而且高效——由一系列
    的頭像 發(fā)表于 02-07 14:24 ?745次閱讀