久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

數(shù)字圖像處理:邊緣檢測

 taotao_2016 2022-11-16 發(fā)布于北京
序言
在之前的文章中,,我介紹了傅里葉變換,,這次我將介紹另一種圖像處理方法,邊緣檢測,。在openCV中,,有很多函數(shù)可以讓我們找到圖像的邊緣,在這篇文章中,,我將挑選出比較有代表性的Sobal算子Laplacian算子進行介紹,。

邊緣檢測

既然我們要檢測邊緣,首先我們需要了解邊緣是什么,。
圖片
最簡單的邊緣
以上圖為例,,我們可以看到黑白的分界線就是我們要找的邊緣,也就是像素之間的急劇變化,。

拉普拉斯算子

原則

拉普拉斯算子使用對圖像進行微分的方法來提取邊緣,。具體推導方法如下。
以與正面相似的圖片為例,,取其中一條橫線,,加以區(qū)分。
圖片
可以看出,,在邊緣的交界處,,經(jīng)過微分后,會出現(xiàn)一個明顯的峰值,。我們可以設置一個閾值,,這樣如果微分后的圖像超過這個閾值,就會判斷為邊緣,,進行后續(xù)處理,。
但是這種方法不夠嚴謹,所以也可以對圖像進行兩次微分,。而二階導數(shù)結果中的Z點,,也就是“過零”,就是我們要找的邊。
在了解了基本原理之后,,我們需要從數(shù)學上推導出 Laplacian 所需的掩碼應該是什么樣子,。從上面的介紹可以看出,最重要的部分就是對圖像進行區(qū)分,,但其實這在圖像中并不難,,只要從下一個網(wǎng)格的像素中減去上一個網(wǎng)格的像素,即可以得到斜率,,它是一階導數(shù),。
圖片
數(shù)學表達式
在知道如何推導一階微分之后,,同樣可以推導出二階微分,。在這里,我們將跳過推導過程,,直接查看結果,。
圖片
二階微分的數(shù)學公式
至此,我們得到了我們需要的拉普拉斯掩碼,。
圖片
拉普拉斯算子掩碼

實施

我們可以使用 openCV 中提供的拉普拉斯運算函數(shù):
dst = cv2.Laplacian(src, ddepth, ksize)
src :要處理的圖像,。
dst :輸出圖像。
ddepth :圖像的深度,。有許多標志可以使用,。最常用的是cv2.CV_8U和cv2.CV_16S。
ksize :掩碼的大小,。

示例程序

具體代碼可以在 github 上查看:https://github.com/jeffrey0524/AAA/tree/main/article05
import cv2

def main():
 # read image
 gray_img = cv2.imread('./lenna.jpg'0)
 cv2.imshow('img',gray_img)

# Try masks of different sizes
 for n in range(14):
  # 使用拉普拉斯算子
  kernel_size = 1+(n*2)
  gray_lap = cv2.Laplacian(gray_img, cv2.CV_16S, ksize=kernel_size)

# Convert image format to uint8
  abs_lap = cv2.convertScaleAbs(gray_lap)

# display image
  cv2.imshow(f'{1+n*2}_lap_img',abs_lap)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

# save image
  cv2.imwrite(f'./result/Laplacian/Laplacian_{1+n*2}.png',abs_lap)

if __name__ == '__main__':
 main()
圖片
結果

Sobal 算子

原則

下圖是 Sobal 算子使用的掩碼,。左邊是水平方向的邊緣檢測,右邊是垂直方向的邊緣檢測,。
圖片
然后使用這個掩碼對圖像進行卷積得到邊緣圖像,。

實施

就像拉普拉斯算子一樣,openCV 也提供了書面的 Sobal 函數(shù),。
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
src :要處理的圖像,。
dst :輸出圖像。
ddepth :圖像的深度,。有許多標志可以使用,。最常用的是cv2.CV_8U和cv2.CV_16S。
dx, dy :選擇要在水平或垂直方向進行的操作,,選擇1, 0/0, 1,。
ksize :掩碼的大小。
在Sobal操作之后,,convertScaleAbs通常會執(zhí)行一個操作,,將圖像轉換回可以正常顯示的格式。
dst = cv2.convertScaleAbs(src)

示例程序

具體代碼可以在我的 github 上查看:https://github.com/jeffrey0524/AAA/tree/main/article05
import cv2

def main():
 # read image
 gray_img = cv2.imread('./lenna.jpg'0)
 cv2.imshow('img',gray_img)

# Try masks of different sizes
 for n in range(14):
  
  # 使用 sobel 算子
  kernel_size = 1+(n*2)
  x = cv2.Sobel(gray_img, cv2.CV_16S, 10, ksize=kernel_size)
  y = cv2.Sobel(gray_img, cv2.CV_16S, 01, ksize=kernel_size)
 
 # Convert image format to uint8
  absX = cv2.convertScaleAbs(x)
  absY = cv2.convertScaleAbs(y)
 
 # Add the results from both directions to form a complete contour
  dst = cv2.addWeighted(absX, 0.5, absY,0.5,0)
  
  # display image
  cv2.imshow(f'{1+n*2}_x',absX)
  cv2.imshow(f'{1+n*2}_y',absY)
  cv2.imshow(f'{1+n*2}_x+y',dst)
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  
  # save image
  cv2.imwrite(f'./result/Sobal/Sobal_{1+n*2}_x.png',absX)
  cv2.imwrite(f'./result/Sobal/Sobal_{1+n*2}_y.png',absY)
  cv2.imwrite(f'./result/Sobal/Sobal_{1+n*2}_x+y.png',dst)
if __name__ == '__main__':
 main()
圖片
輸入
圖片
結果(內(nèi)核大小 = 3)
圖片
結果(內(nèi)核大小 = 5)
圖片
結果(內(nèi)核大小 = 7)

參考

https://en./wiki/Sobel_operator
https://www./watch?v=usBg5zbD2wU
https://www./watch?v=RSDcvDFXei4)
https://www./watch?v=yHah3EbKwOI
https:///%E9%9B%BB%E8%85%A6%E8%A6%96%E8%A6%BA/%E9%82%8A%E7%B7%A3%E5%81%B5%E6%B8%AC-%E7%B4%A2%E4%BC%AF%E7%AE%97%E5%AD%90-sobel-operator-95ca51c8d78a
https:///%E9%9B%BB%E8%85%A6%E8%A6%96%E8%A6%BA/%E9%82%8A%E7%B7%A3%E5%81%B5%E6%B8%AC-%E6%8B%89%E6%99%AE%E6%8B%89%E6%96%AF%E7%AE%97%E5%AD%90-laplacian-operator-ea877f1945a0


☆ END ☆

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多