摘要:理論任何灰度圖像都可以看作是地形表面,其中高強度表示山峰和丘陵,而低強度表示山谷用不同顏色的水標簽填充每個孤立的山谷局部最小值,隨著水的上升,明顯具有不同的顏色的水將開始融合為避免這種情況,需要在水合并的位置建立障礙,在所有的山峰都被水淹沒
Image Segmentation with Watershed Algorithm
理論任何灰度圖像都可以看作是地形表面,其中高強度表示山峰和丘陵,而低強度表示山谷.用不同顏色的水(標簽)填充每個孤立的山谷(局部最小值),隨著水的上升,明顯具有不同的顏色的水將開始融合.為避免這種情況,需要在水合并的位置建立障礙,在所有的山峰都被水淹沒之前,要繼續填滿水和建造柵欄的工作然后你創建的障礙會給你分割的結果,這就是分水嶺背后的“哲學”.
可以訪問我了解更多相關內容.
這種方法會導致由于噪聲或圖像中任何其他不正常的情況而導致的結果過于分散, 因此,OpenCV實現了一個基于標記的分水嶺算法,可以在其中指定要合并的和不合并的谷點.這是一個交互式的圖像分割,我們所做的就是給我們所知道的對象提供不同的標簽,用一種顏色(或強度)標記我們確定為前景或對象的區域,用另一種顏色標記我們確定為背景或非對象的區域,最后標記我們不確定的區域為0,然后應用分水嶺算法,我們的標記將會隨著我們所給出的標簽進行更新,對象的邊界將值為-1.
應用我們將看到一個關于如何使用距離變換和分水嶺來分割相互觸摸的物體的例子.
考慮下面的硬幣圖像,硬幣相互接觸.即使把它閾值,它也會互相接觸.
我們使用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()
現在我們需要去除圖像中的任何小的白噪聲,因此我們要使用形態學開運算,為了去除物體上的小洞,我們要使用形態學閉運算,所以,現在我們可以確定,靠近物體中心的區域是前景,遠離物體的區域是背景,只有硬幣的邊界區域是我們不確定的區域.
我們需要提取出我們確信它們是硬幣的區域,腐蝕邊界像素,不管剩下的是什么,我們都可以確定它是硬幣.如果它們不相互接觸還可以繼續,如果它們相互接觸,另一個好的選擇是找到距離變換并應用一個合適的閾值.
為此,我們對結果進行了擴張,擴張將對象邊界增加為背景,通過這種方法,我們可以確保背景中的任何區域都是真正的背景,因為邊界區域被移除.
剩下的區域是我們不知道的區域,無論是硬幣還是背景.分水嶺算法應該找到它, 這些區域通常圍繞著前景和背景相遇的硬幣邊界(甚至兩個不同的硬幣相遇),它可以從sure_bg區域中減去sure_fg區域獲得.
# 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)
現在我們可以確定哪些是硬幣的區域,哪些是背景,哪些是背景.因此,我們創建標記(它是一個與原始圖像相同大小的數組,但使用int32數據類型)并對其內部的區域進行標記.
cv2.connectedComponents()
將圖像的背景標記為0,然后其他對象從1開始標記為整數.
我們知道,如果背景是0,那么分水嶺將會被認為是未知的區域, 所以我們用不同的整數來標記它,用0表示由未知定義的未知區域.
# 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]
代碼:
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) # 形態開運算 # 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()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42053.html
摘要:十開放模式識別項目開放模式識別項目,致力于開發出一套包含圖像處理計算機視覺自然語言處理模式識別機器學習和相關領域算法的函數庫。 一、開源生物特征識別庫 OpenBROpenBR 是一個用來從照片中識別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計算機視覺庫 OpenCVOpenC...
摘要:之成為圖像處理任務的最佳選擇,是因為這一科學編程語言日益普及,并且其自身免費提供許多最先進的圖像處理工具。該庫包含基本的圖像處理功能,包括點操作使用一組內置卷積內核進行過濾以及顏色空間轉換。圖像處理系統有時被稱為圖像處理的瑞士軍刀。 showImg(https://segmentfault.com/img/remote/1460000019442221);編譯:張秋玥、小七、蔣寶尚 本...
閱讀 2577·2019-08-30 10:53
閱讀 3183·2019-08-29 16:20
閱讀 2933·2019-08-29 15:35
閱讀 1751·2019-08-29 12:24
閱讀 2865·2019-08-28 18:19
閱讀 1838·2019-08-23 18:07
閱讀 2314·2019-08-23 15:31
閱讀 1158·2019-08-23 14:05