国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

opencv python 基于分水嶺算法的圖像分割

mikasa / 3204人閱讀

摘要:理論任何灰度圖像都可以看作是地形表面,其中高強(qiáng)度表示山峰和丘陵,而低強(qiáng)度表示山谷用不同顏色的水標(biāo)簽填充每個孤立的山谷局部最小值,隨著水的上升,明顯具有不同的顏色的水將開始融合為避免這種情況,需要在水合并的位置建立障礙,在所有的山峰都被水淹沒

Image Segmentation with Watershed Algorithm

理論

任何灰度圖像都可以看作是地形表面,其中高強(qiáng)度表示山峰和丘陵,而低強(qiáng)度表示山谷.用不同顏色的水(標(biāo)簽)填充每個孤立的山谷(局部最小值),隨著水的上升,明顯具有不同的顏色的水將開始融合.為避免這種情況,需要在水合并的位置建立障礙,在所有的山峰都被水淹沒之前,要繼續(xù)填滿水和建造柵欄的工作然后你創(chuàng)建的障礙會給你分割的結(jié)果,這就是分水嶺背后的“哲學(xué)”.

可以訪問我了解更多相關(guān)內(nèi)容.

這種方法會導(dǎo)致由于噪聲或圖像中任何其他不正常的情況而導(dǎo)致的結(jié)果過于分散, 因此,OpenCV實(shí)現(xiàn)了一個基于標(biāo)記的分水嶺算法,可以在其中指定要合并的和不合并的谷點(diǎn).這是一個交互式的圖像分割,我們所做的就是給我們所知道的對象提供不同的標(biāo)簽,用一種顏色(或強(qiáng)度)標(biāo)記我們確定為前景或?qū)ο蟮膮^(qū)域,用另一種顏色標(biāo)記我們確定為背景或非對象的區(qū)域,最后標(biāo)記我們不確定的區(qū)域?yàn)?,然后應(yīng)用分水嶺算法,我們的標(biāo)記將會隨著我們所給出的標(biāo)簽進(jìn)行更新,對象的邊界將值為-1.

應(yīng)用

我們將看到一個關(guān)于如何使用距離變換和分水嶺來分割相互觸摸的物體的例子.
考慮下面的硬幣圖像,硬幣相互接觸.即使把它閾值,它也會互相接觸.

我們使用Otsu的二值化找到硬幣的近似估計值.

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("img4.jpg")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

cv2.imshow("show",thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

現(xiàn)在我們需要去除圖像中的任何小的白噪聲,因此我們要使用形態(tài)學(xué)開運(yùn)算,為了去除物體上的小洞,我們要使用形態(tài)學(xué)閉運(yùn)算,所以,現(xiàn)在我們可以確定,靠近物體中心的區(qū)域是前景,遠(yuǎn)離物體的區(qū)域是背景,只有硬幣的邊界區(qū)域是我們不確定的區(qū)域.

我們需要提取出我們確信它們是硬幣的區(qū)域,腐蝕邊界像素,不管剩下的是什么,我們都可以確定它是硬幣.如果它們不相互接觸還可以繼續(xù),如果它們相互接觸,另一個好的選擇是找到距離變換并應(yīng)用一個合適的閾值.

為此,我們對結(jié)果進(jìn)行了擴(kuò)張,擴(kuò)張將對象邊界增加為背景,通過這種方法,我們可以確保背景中的任何區(qū)域都是真正的背景,因?yàn)檫吔鐓^(qū)域被移除.

剩下的區(qū)域是我們不知道的區(qū)域,無論是硬幣還是背景.分水嶺算法應(yīng)該找到它, 這些區(qū)域通常圍繞著前景和背景相遇的硬幣邊界(甚至兩個不同的硬幣相遇),它可以從sure_bg區(qū)域中減去sure_fg區(qū)域獲得.

# noise removal
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,cv.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(),255,0)

# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)

現(xiàn)在我們可以確定哪些是硬幣的區(qū)域,哪些是背景,哪些是背景.因此,我們創(chuàng)建標(biāo)記(它是一個與原始圖像相同大小的數(shù)組,但使用int32數(shù)據(jù)類型)并對其內(nèi)部的區(qū)域進(jìn)行標(biāo)記.

cv2.connectedComponents()
將圖像的背景標(biāo)記為0,然后其他對象從1開始標(biāo)記為整數(shù).

我們知道,如果背景是0,那么分水嶺將會被認(rèn)為是未知的區(qū)域, 所以我們用不同的整數(shù)來標(biāo)記它,用0表示由未知定義的未知區(qū)域.

# Marker labelling
ret, markers = cv2.connectedComponents(sure_fg)

# Add one to all labels so that sure background is not 0, but 1
markers = markers+1

# Now, mark the region of unknown with zero
markers[unknown==255] = 0

深藍(lán)色區(qū)域顯示未知區(qū)域,硬幣的顏色是不同的,與未知區(qū)域相比,確定背景的剩余區(qū)域以較淺的藍(lán)色顯示.

標(biāo)記已經(jīng)準(zhǔn)備好了,現(xiàn)在是最后一步的時候了,應(yīng)用分水嶺.

markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]

代碼

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread("img4.jpg")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)


# noise removal
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2) # 形態(tài)開運(yùn)算

# sure background area
sure_bg = cv2.dilate(opening,kernel,iterations=3)

# Finding sure foreground area
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)


# Marker labelling
ret, markers = cv2.connectedComponents(sure_fg)

# Add one to all labels so that sure background is not 0, but 1
markers = markers+1

# Now, mark the region of unknown with zero
markers[unknown==255] = 0

markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]


cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42053.html

相關(guān)文章

  • 機(jī)器視覺、模式識別庫匯總

    摘要:十開放模式識別項目開放模式識別項目,致力于開發(fā)出一套包含圖像處理計算機(jī)視覺自然語言處理模式識別機(jī)器學(xué)習(xí)和相關(guān)領(lǐng)域算法的函數(shù)庫。 一、開源生物特征識別庫 OpenBROpenBR 是一個用來從照片中識別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計算機(jī)視覺庫 OpenCVOpenC...

    habren 評論0 收藏0
  • Python十大圖像處理工具

    摘要:之成為圖像處理任務(wù)的最佳選擇,是因?yàn)檫@一科學(xué)編程語言日益普及,并且其自身免費(fèi)提供許多最先進(jìn)的圖像處理工具。該庫包含基本的圖像處理功能,包括點(diǎn)操作使用一組內(nèi)置卷積內(nèi)核進(jìn)行過濾以及顏色空間轉(zhuǎn)換。圖像處理系統(tǒng)有時被稱為圖像處理的瑞士軍刀。 showImg(https://segmentfault.com/img/remote/1460000019442221);編譯:張秋玥、小七、蔣寶尚 本...

    yuanxin 評論0 收藏0

發(fā)表評論

0條評論

mikasa

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<