摘要:理論任何灰度圖像都可以看作是地形表面,其中高強(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
摘要:十開放模式識別項目開放模式識別項目,致力于開發(fā)出一套包含圖像處理計算機(jī)視覺自然語言處理模式識別機(jī)器學(xué)習(xí)和相關(guān)領(lǐng)域算法的函數(shù)庫。 一、開源生物特征識別庫 OpenBROpenBR 是一個用來從照片中識別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計算機(jī)視覺庫 OpenCVOpenC...
摘要:之成為圖像處理任務(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);編譯:張秋玥、小七、蔣寶尚 本...
閱讀 2585·2019-08-30 10:53
閱讀 3189·2019-08-29 16:20
閱讀 2942·2019-08-29 15:35
閱讀 1765·2019-08-29 12:24
閱讀 2871·2019-08-28 18:19
閱讀 1848·2019-08-23 18:07
閱讀 2327·2019-08-23 15:31
閱讀 1166·2019-08-23 14:05