日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV+python:分水岭算法

發布時間:2023/11/27 生活经验 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV+python:分水岭算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1,概念簡介
現實中我們可以或者說可以想象有山有湖的景象,那么那一定是水繞 山,山圍水的情形。當然在需要的時候,要人工構筑分水嶺,以防集水盆之間的互相穿透。而區分高山(plateaus)與水的界線,以及湖與湖之間的間隔或 都是連通的關系,就是我們可愛的分水嶺(watershed)

分水嶺算法是在分割的過程中,它會把跟臨近像素間的相似性作為重要的參考依據,從而將在空間位置上相近并且灰度值相近(求梯度)的像素點互相連接起來構成一個封閉的輪廓。

分水嶺算法常用的操作步驟:彩色圖像灰度化,然后再求梯度圖,最后在梯度圖的基礎上進行分水嶺算法,求得分段圖像的邊緣線。

如果圖像中的目標物體是連接在一起的,則分割起來會更困難,分水嶺分割算法經常用于處理這類問題,通常會取得比較好的效果。分水嶺分割算法把圖像看成一幅“地形圖”,其中亮度比較強的區域像素值較大,而比較暗的區域像素值較小,通過尋找“匯水盆地”和“分水嶺界限”,對圖像進行分割。
2,源代碼

import cv2 as cv
import numpy as npdef watershed_demo():# print(src.shape)blurred = cv.pyrMeanShiftFiltering(src, 10, 100) #邊緣保留濾波去噪# gray\binary imagegray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY) #轉化為灰度圖ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #二值化cv.imshow("binary-image", binary)# morphology operation形態學操作kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) #構造結構mb = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2) #連續兩次開操作(去除圖像中的任何小的白噪聲);閉運算(為了去除物體上的小洞)sure_bg = cv.dilate(mb, kernel, iterations=3)  #連續三次膨脹操作cv.imshow("mor-opt", sure_bg)# distance transformdist = cv.distanceTransform(mb, cv.DIST_L2, 3)#距離變化(提取出我們確信它們是硬幣的區域)dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)#歸一化dist_output1 = np.uint8(dist_output)ret, surface = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)surface_fg = np.uint8(surface)#將float類型轉化為uintcv.imshow("surface-bin", surface_fg)unknown = cv.subtract(sure_bg, surface_fg)#除種子以外的區域(剩下的區域是我們不知道的區域,無論是硬幣還是背景.分水嶺算法應該找到它)ret, markers = cv.connectedComponents(surface_fg) #求連通區域(創建標記:它是一個與原始圖像相同大小的數組,但使用int32數據類型,并對其內部的區域進行標記.)# watershed transform 分水嶺變換markers = markers + 1 # Add one to all labels so that sure background is not 0, but 1markers[unknown==255] = 0 #  mark the region of unknown with zeromarkers = cv.watershed(src, markers=markers)src[markers==-1] = [0, 0, 255]#標記cv.imshow("result", src)src = cv.imread("F:/images/coins.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
watershed_demo()
cv.waitKey(0)cv.destroyAllWindows()

總結

以上是生活随笔為你收集整理的OpenCV+python:分水岭算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。