新聞中心
這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)Python教程:python中Sobel算子如何使用
說(shuō)明

1、Sobel算子根據(jù)像素點(diǎn)的上下、左右相鄰點(diǎn)的灰度加權(quán)差,在邊緣達(dá)到極值的現(xiàn)象來(lái)檢測(cè)邊緣。
它具有平滑的噪聲功能,并提供更準(zhǔn)確的邊緣方向信息。由于Sobel算子結(jié)合了高斯平滑度和微分求導(dǎo)(分化),因此結(jié)果會(huì)更具抗噪性,當(dāng)對(duì)精度要求不高時(shí),Sobel算子是一種常用的邊緣檢測(cè)方法。
2、Sobel算子仍然是過(guò)濾器,但它有方向。
dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
實(shí)例
# coding=utf-8
import cv2
import numpy as np
img = cv2.imread("D:/test/26.png", 0)
'''
在Sobel函數(shù)的第二個(gè)參數(shù)這里使用了cv2.CV_16S。
因?yàn)镺penCV文檔中對(duì)Sobel算子的介紹中有這么一句:
“in the case of 8-bit input images it will result in truncated derivatives”。
即Sobel函數(shù)求完導(dǎo)數(shù)后會(huì)有負(fù)值,還有會(huì)大于255的值。
而原圖像是uint8,即8位無(wú)符號(hào)數(shù),所以Sobel建立的圖像位數(shù)不夠,會(huì)有截?cái)唷?因此要使用16位有符號(hào)的數(shù)據(jù)類(lèi)型,即cv2.CV_16S。
在經(jīng)過(guò)處理后,別忘了用convertScaleAbs()函數(shù)將其轉(zhuǎn)回原來(lái)的uint8形式。
否則將無(wú)法顯示圖像,而只是一副灰色的窗口。convertScaleAbs()的原型為:
dst = cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
其中可選參數(shù)alpha是伸縮系數(shù),beta是加到結(jié)果上的一個(gè)值。結(jié)果返回uint8類(lèi)型的圖片。
由于Sobel算子是在兩個(gè)方向計(jì)算的,最后還需要用cv2.addWeighted(...)函數(shù)將其組合起來(lái)。
其函數(shù)原型為:
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
其中alpha是第一幅圖片中元素的權(quán)重,beta是第二個(gè)的權(quán)重,gamma是加到最后結(jié)果上的一個(gè)值。
'''
x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
y = cv2.Sobel(img, cv2.CV_16S, 0, 1)
absX = cv2.convertScaleAbs(x)# 轉(zhuǎn)回uint8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
cv2.imshow("orign", img)
cv2.imshow("absX", absX)
cv2.imshow("absY", absY)
cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()以上就是python中Sobel算子的使用,希望對(duì)大家有所幫助。更多Python學(xué)習(xí)指路:創(chuàng)新互聯(lián)python教程
本文教程操作環(huán)境:windows7系統(tǒng)、Python 3.9.1,DELL G3電腦。
新聞標(biāo)題:創(chuàng)新互聯(lián)Python教程:python中Sobel算子如何使用
分享網(wǎng)址:http://www.5511xx.com/article/ccopccs.html


咨詢(xún)
建站咨詢(xún)
