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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv进阶学习笔记14:分水岭算法 实现图像分割

發(fā)布時間:2024/9/30 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv进阶学习笔记14:分水岭算法 实现图像分割 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基礎版學習筆記目錄:
python3+opencv學習筆記匯總目錄(適合基礎入門學習)
進階版筆記目錄鏈接:
python+opencv進階版學習筆記目錄(適合有一定基礎)

分水嶺算法原理

分水嶺算法是一種圖像區(qū)域分割法,在分割的過程中,它會把跟臨近像素間的相似性作為重要的參考依據,從而將在空間位置上相近并且灰度值相近的像素點互相連接起來構成一個封閉的輪廓,封閉性是分水嶺算法的一個重要特征。
其他圖像分割方法,如閾值,邊緣檢測等都不會考慮像素在空間關系上的相似性和封閉性這一概念,彼此像素間互相獨立,沒有統(tǒng)一性。分水嶺算法較其他分割方法更具有思想性,更符合人眼對圖像的印象。

任意的灰度圖像可以被看做是地質學表面,高亮度的地方是山峰,低亮度的地方是山谷。給每個孤立的山谷(局部最小值)不同顏色的水(標簽),當水漲起來,根據周圍的山峰(梯度),不同的山谷也就是不同的顏色會開始合并,要避免這個,你可以在水要合并的地方建立障礙,直到所有山峰都被淹沒。你所創(chuàng)建的障礙就是分割結果,這個就是分水嶺的原理,但是這個方法會分割過度,因為有噪點,或者其他圖像上的錯誤。所以OpenCV實現(xiàn)了一個基于掩模的分水嶺算法,你可以指定哪些是要合并的點,哪些不是,這是一個交互式的圖像分割,我們要做的是給不同的標簽。給我們知道是前景或者是目標用一種顏色加上標簽,給我們知道是背景或者非目標加上另一個顏色,最后不知道是什么的區(qū)域標記為0. 然后使用分水嶺算法。

距離變換

先將圖像進行距離變換使出現(xiàn)山峰和山谷

API實現(xiàn)

1圖像二值化

import cv2 as cv import numpy as npdef watershed_demo():# remove noise if anyprint(src.shape)#圖像維度(348, 500, 3)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) print("--------- Python OpenCV Tutorial ---------") src = cv.imread("coins.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) watershed_demo() cv.waitKey(0) cv.destroyAllWindows()

2形態(tài)學操作

import cv2 as cv import numpy as npdef watershed_demo():# remove noise if anyprint(src.shape)#圖像維度(348, 500, 3)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)# 形態(tài)學變換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) print("--------- Python OpenCV Tutorial ---------") src = cv.imread("coins.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) watershed_demo() cv.waitKey(0) cv.destroyAllWindows()

3對開運算結果進行距離變換
先不管膨脹結果,對開運算結果進行距離計算

def distanceTransform(src, distanceType, maskSize, dst=None, dstType=None)

src:輸入的圖像,一般為二值圖像
distanceType:所用的求解距離的類型(CV_DIST_L1, CV_DIST_L2 , CV_DIST_C)
maskSize:距離變換掩模的大小

我們需要對distanceTransform返回的結果進行歸一化處理,使用normalize

import cv2 as cv import numpy as npdef watershed_demo():# remove noise if anyprint(src.shape)#圖像維度(348, 500, 3)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)# m形態(tài)學操作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)# 對開運算結果距離變換dist = cv.distanceTransform(mb, cv.DIST_L2, 3)dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)cv.imshow("distance-t", dist_output * 50)print("--------- Python OpenCV Tutorial ---------") src = cv.imread("coins.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) watershed_demo() cv.waitKey(0)cv.destroyAllWindows()

4生成種子

import cv2 as cv import numpy as npdef watershed_demo():# remove noise if anyprint(src.shape)#圖像維度(348, 500, 3)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)# m形態(tài)學操作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)# 對開運算結果距離變換dist = cv.distanceTransform(mb, cv.DIST_L2, 3)dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)#cv.imshow("distance-t", dist_output * 50)ret, surface = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)surface_fg = np.uint8(surface)cv.imshow("surface-bin", surface_fg)#種子print("--------- Python OpenCV Tutorial ---------") src = cv.imread("coins.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) watershed_demo() cv.waitKey(0) cv.destroyAllWindows()

5生成marker和分水嶺變換

import cv2 as cv import numpy as npdef watershed_demo():# remove noise if anyprint(src.shape)#圖像維度(348, 500, 3)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)# m形態(tài)學操作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)# 對開運算結果距離變換dist = cv.distanceTransform(mb, cv.DIST_L2, 3)dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)#cv.imshow("distance-t", dist_output * 50)ret, surface = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)surface_fg = np.uint8(surface)#cv.imshow("surface-bin", surface_fg)#種子unknown = cv.subtract(sure_bg, surface_fg)#種子區(qū)域除外的區(qū)域=膨脹結果-種子ret, markers = cv.connectedComponents(surface_fg)#聯(lián)通區(qū)域# 分水嶺變換markers = markers + 1markers[unknown == 255] = 0markers = cv.watershed(src, markers=markers)src[markers == -1] = [0, 0, 255]cv.imshow("result", src) print("--------- Python OpenCV Tutorial ---------") src = cv.imread("coins.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) watershed_demo() cv.waitKey(0) cv.destroyAllWindows()

最后結果

電氣專業(yè)的計算機萌新,寫博文不容易。如果你覺得本文對你有用,請點個贊支持下,謝謝。

總結

以上是生活随笔為你收集整理的opencv进阶学习笔记14:分水岭算法 实现图像分割的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 澳门久久| 女生的胸无遮挡 | 少妇被又大又粗又爽毛片久久黑人 | 秋霞视频在线观看 | 亚洲精品国产一区二 | 国产不卡精品视频 | 天天插天天| 偷拍精品一区二区三区 | 理论片在线观看理伦片 | 成人激情开心网 | 精品国产一二三 | 高h全肉污文play带道具 | 狠狠操在线视频 | 日韩福利视频导航 | 国产免费一区二区 | 老妇free性videosxx| 在线观看视频99 | 2019国产在线| 日韩成人免费在线视频 | 国产在线观看免费视频软件 | 麻豆最新 | 欧美一级黄色片在线观看 | 能在线看的av | 中文字幕乱码亚洲精品一区 | 国产午夜成人久久无码一区二区 | 一区二区三区免费毛片 | 男女啪啪资源 | 亚洲日本韩国在线 | 四虎影视成人永久免费观看亚洲欧美 | 黄色私人影院 | 午夜精品久久久久久久久久久久 | 哪里看毛片 | 免费观看污网站 | 精品久久一区二区三区 | 手机av免费在线观看 | 波多野结衣视频免费看 | 视色影视| 婷婷丁香一区二区三区 | 国产人妻大战黑人20p | 国产精品亚洲αv天堂无码 伊人性视频 | 亚洲在线观看免费 | 91精品在线观看视频 | 91亚洲国产成人久久精品网站 | 女十八毛片 | 手机av片 | 黄页在线观看 | 你懂的在线免费观看 | 国产精品s色 | 福利电影在线播放 | 亚洲爽妇网 | 国产精品久久伊人 | 色播一区二区 | 国产a网| 大粗鳮巴久久久久久久久 | av看片| av福利在线播放 | 日韩高清在线播放 | 黄色一级视频在线观看 | 99热久久这里只有精品 | 岛国中文字幕 | 少妇激情一区二区三区 | 国产美女免费看 | 香蕉综合网 | 久久久久久久穴 | 美女黄免费 | 天天躁狠狠躁狠狠躁夜夜躁68 | 亚洲色图欧美日韩 | 天天夜夜啦啦啦 | 欧美大黄视频 | 久热中文| 久久久久国产精品国产 | 久久久久激情 | 99视频+国产日韩欧美 | 四虎影城库| 亚洲天堂99 | a级在线观看视频 | 伊人五月综合 | 熟女人妇 成熟妇女系列视频 | 成年人的毛片 | 欧美色精品在线 | 国产让女高潮的av毛片 | www.九九九 | 影音先锋在线国产 | 69视频在线观看免费 | 在线免费黄色 | 国产三级三级三级三级三级 | 亚洲无码精品一区二区三区 | 精品女同一区二区三区 | 欧美激情视频网站 | 国产精品无码乱伦 | 午夜一区二区三区四区 | 九色福利视频 | 国产精品人成在线观看免费 | 欧美最猛性xxxxx(亚洲精品) | 亚洲激情自拍偷拍 | 人体内射精一区二区三区 | 琪琪伦伦影院理论片 | wwwwww日本| 性感美女一区二区三区 |