精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

怎么在python中使用opencv實現一個分水嶺算法-創新互聯

今天就跟大家聊聊有關怎么在python中使用opencv實現一個分水嶺算法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

成都創新互聯公司是創新、創意、研發型一體的綜合型網站建設公司,自成立以來公司不斷探索創新,始終堅持為客戶提供滿意周到的服務,在本地打下了良好的口碑,在過去的十余年時間我們累計服務了上千家以及全國政企客戶,如航空箱等企業單位,完善的項目管理流程,嚴格把控項目進度與質量監控加上過硬的技術實力獲得客戶的一致贊美。

目標

  1. 使用分水嶺算法對基于標記的圖像進行分割

  2. 使用函數cv2.watershed()

原理:

灰度圖像可以被看成拓撲平面,灰度值高的區域可以看出山峰,灰度值低的區域可以看成是山谷。向每一個山谷當中灌不同顏色的水。水位升高,不同山谷的水會匯合,為防止不同山谷的水匯合,小在匯合處建立起堤壩。然后繼續灌水,然后再建立堤壩,直到山峰都掩模。構建好的堤壩就是圖像的分割。

此方法通常會得到過渡分割的結果,因為圖像中的噪聲以及其他因素。為了減少此影響,opencv使用基于標記的分水嶺算法,此算法要設置哪些山谷中的匯合點,哪些不是。這是一種交互式的圖像分割算法那。我們要給已知對象打上不同表情。如果某個區域肯定是前景或對象,就使用某個顏色或灰度值標簽標記它。如果是背景那么使用其他顏色進行標記,其余不能確定的部分用0標記。然后使用分水嶺算法,每次灌水,標簽會被更新,當兩個不同顏色的標簽相遇就會構建堤壩,知道所有山峰掩模,最后得到的邊界對象值是-1。

代碼:

對挨在一起的對象進行分割。

怎么在python中使用opencv實現一個分水嶺算法

使用Otsu's 二值化后的結果為

怎么在python中使用opencv實現一個分水嶺算法

要出去圖像中的白噪聲??梢允褂眯螒B學運算,使用閉運算去除對象中的空洞。

靠近對象中心的區域是前景,離對象遠的區域是背景,不確定的區域是邊界。

首先提取硬幣區域,使用腐蝕操作去掉邊緣,剩下的就是硬幣。但硬幣沒有接觸時,此方法有效,但是由于硬幣相互接觸,就要使用另外一種有效的方法:距離變換加上合適的閾值。

之后,要尋找不確定是否是硬幣的區域。這里需要膨脹操作。膨脹操作會將對象邊界延伸到背景當中。由于邊界區域被去除,現在就能知道哪些區域是前景,哪些是背景。

余下的區域不知道如何區分,那么使用分水嶺算法。這些區域通常是前景與背景的交界處。從能否確認是否是背景的區域中減去確定是前景的區域就得到了邊界。

(前景和背景)

怎么在python中使用opencv實現一個分水嶺算法

(上面的圖是直接使用作者的代碼后生產的結果,提取到了前景,為了演示一下不確定的區域,調了一下計算前景的距離變換的參數,使得中間出現不確定的區域)

怎么在python中使用opencv實現一個分水嶺算法

這里面使用個cv2.distanceTransform函數

該函數用于計算2值圖象中所有像素離其最近的值為0像素的近似距離。

參數為

cv2.distanceTransform(src, distanceType, maskSize[, dst]) → dst

#src為輸入的二值圖像。distanceType為計算距離的方式,可以是如下值
DIST_USER = ⑴, //!< User defined distance
DIST_L1  = 1, //!< distance = |x1-x2| + |y1-y2|
DIST_L2  = 2, //!< the simple euclidean distance
DIST_C  = 3, //!< distance = max(|x1-x2|,|y1-y2|)
DIST_L12  = 4, //!< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
DIST_FAIR = 5, //!< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998
DIST_WELSCH = 6, //!< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846
DIST_HUBER = 7 //!< distance = |x|
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('21.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
# sure background area
sure_bg = cv2.dilate(opening,kernel,iterations=3)#膨脹
# Finding sure foreground area

dist_transform = cv2.distanceTransform(opening,1,5)
ret, sure_fg = cv2.threshold(dist_transform,0.2*dist_transform.max(),255,0)#參數改小了,出現不確定區域
# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)#減去前景

cv2.imshow('p',sure_fg)
cv2.waitKey(0)

現在知道了那些背景是硬幣,可以創建標簽。(與原圖像大小相同,數據類型為int32的數組)。

對于已經確定分類的區域,也就是背景和前景,使用整數標記,不確定的區域是用0標記。可以使用cv2.connectedComponents()函數來實現此功能。它會將背景標記為0,其他標記為位從1開始的正整數。

但是,如果背景標記為0,那么分水嶺算法會將其當成位置區域,所以使用不同的整數進行標記,對于不確定的區域,函數標記為0.

結果使用JET顏色地圖表示。深藍色未知區域,硬幣區域使用不同顏色。其余部分用淺藍色。

看完上述內容,你們對怎么在python中使用opencv實現一個分水嶺算法有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創新互聯行業資訊頻道,感謝大家的支持。


文章名稱:怎么在python中使用opencv實現一個分水嶺算法-創新互聯
網頁路徑:http://m.jcarcd.cn/article/eghcd.html
主站蜘蛛池模板: 日韩一级一欧美一 | 天美传媒| 国产午夜三级 | 中文字幕日韩综合网 | 91影视永久福 | 伦理电影网址 | 成人影视在线观看 | 国产女人喷 | 日本中文字幕网址 | 日韩大片免费观 | 国产精品午夜看片 | 国产日韩精品aⅴ | 成人公开在线导航网 | 国产挤奶 | 国产精品秘原创 | 日韩大片免费观看 | 日韩欧美大片精品黄 | 日韩高清电影网 | 日本熟女| 国产极品翘臀在线观 | 国产成自拍亚洲精品 | 国产视频二区 | 国产天堂2025 | 国产主播福利片在 | 国产极品翘臀在线观 | 国产精九九 | 国产精品免费精 | 国内自产一区视频 | 精品日韩一区二 | 日本不卡五区六区 | 九九九九九九伊人 | 91青青青青青爽 | 日韩免费在线电影 | 日韩在线观看不卡 | 中文字幕日韩在线 | 国产午夜视频在线 | 国产黄大 | 欧美午夜性爱剧场 | 精品国产午夜精华 | 国产精品十七区 | 国产中文一区二区 |