opencv+python 分水嶺算法 (1)


參考博客:https://segmentfault.com/a/1190000015690356 

分水嶺watershed 部分:

https://blog.csdn.net/u010741471/article/details/45193521

 

曼哈頓棋盤格距離:

 

 

代碼如下:

import cv2 as cv
import numpy as np

def water_shed(image):
    #1 去噪,灰度,二值化
    blurred = cv.pyrMeanShiftFiltering(image,10,30)
    # blurred=cv.bilateralFilter(image,0,50,5)
    # cv.imshow('blurred',blurred)
    gray=cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
    ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
    # cv.imshow('binary',binary)
    #2. mophology 開操作去除噪點
    kernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
    open_binary=cv.morphologyEx(binary,cv.MORPH_OPEN,kernel,iterations=2) #mophology binary,2次開操作
    cv.imshow('1-open-op',open_binary)
    dilate_bg=cv.dilate(open_binary,kernel,iterations=3) #3次膨脹
    cv.imshow('2-dilate-op',dilate_bg)
    #3.distance transform
    # DIST_L1:曼哈頓距離,DIST_L2:歐氏距離,masksize:跟卷積一樣
    dist=cv.distanceTransform(open_binary,cv.DIST_L2,3) #??
    dist_norm=cv.normalize(dist,0,1.0,cv.NORM_MINMAX)# 0-1之間標准化
    cv.imshow('3-distance-t',dist_norm*50)

    ret,surface=cv.threshold(dist,dist.max()*0.65,255,cv.THRESH_BINARY)
    cv.imshow('4-surface',surface)

    #4計算marker
    surface_fg=np.uint8(surface) #計算前景
    unknown=cv.subtract(dilate_bg,surface_fg) #計算未知區域
    cv.imshow('5-unknown',unknown)
    ret,markers=cv.connectedComponents(surface_fg) #通過計算cc,計算markers
    print(ret)
    cv.imshow('6-markers',markers)

    #5 watershed 分水嶺變換
    markers=markers+1 #用label進行控制
    markers[unknown==255]=0
    markers=cv.watershed(image,markers) #分水嶺的地方就編程-1
    image[markers==-1]=[0,0,255]
    cv.imshow('7-result',image)

src = cv.imread("coins.jpg")
# cv.imshow("gray_img", src)
water_shed(src)
cv.waitKey(0)
cv.destroyAllWindows()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM