問題描述
我正在尋找一種替代方法來分割以下土壤顆粒圖像中的顆粒,而不是 python 中的分水嶺分割,因為它可能會誤導對顆粒的正確檢測此外,我正在研究邊緣檢測圖像(使用 HED算法)如附件..我希望找到一種更好的方法來分割顆粒以進行進一步處理,因為我想在我的項目中獲得圖像中每個多邊形的面積..提前致謝我也在詢問隨機游走器分割或任何其他可用方法.
您可以嘗試使用已實現為 Stats 的 Connected Components
每個對象的質心可以在centroid
參數中找到,面積等其他信息可以在cv2.connectedComponentsWithStats返回的
status
變量中找到/代碼>.這是標有每個多邊形面積的圖像.您可以使用最小閾值區域進行過濾以僅保留較大的多邊形
代碼
導入 cv2將 numpy 導入為 np# 加載圖片,高斯模糊,灰度,Otsu的閾值圖像 = cv2.imread('2.jpg')模糊 = cv2.GaussianBlur(圖像, (3,3), 0)灰色 = cv2.cvtColor(模糊,cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(灰色, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]# 執行連通分量標注n_labels,標簽,統計,質心 = cv2.connectedComponentsWithStats(閾值,連接 = 4)# 創建假彩色圖像和背景顏色為黑色顏色 = np.random.randint(0, 255, size=(n_labels, 3), dtype=np.uint8)colors[0] = [0, 0, 0] # 出于美觀的原因,我們希望背景為黑色false_colors = 顏色[標簽]# 每個多邊形的標注區域false_colors_area = false_colors.copy()對于 i,枚舉中的質心(質心 [1:],開始 = 1):面積 = 統計[i, 4]cv2.putText(false_colors_area, str(area), (int(centroid[0]), int(centroid[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)cv2.imshow('thresh', thresh)cv2.imshow('false_colors', false_colors)cv2.imshow('false_colors_area', false_colors_area)cv2.waitKey()
I am searching for an alternative way for segmenting the grains in the following image of soil grains other than watershed segmentation in python as it may mislead the right detection for the grains furthermore , I am working on the edge detection image ( using HED algorithm ) as attached .. I hope to find a better way to segment the grains for further processing as I would like to get the area of each polygon in the image in my project .. Thanks in advance I am asking also about random walker segmentation or any other available method.
You could try using Connected Components with Stats already implemented as cv2.connectedComponentsWithStats
to perform component labeling. Using your binary image as input, here's the false-color image:
The centroid of each object can be found in centroid
parameter and other information such as area can be found in the status
variable returned from cv2.connectedComponentsWithStats
. Here's the image labeled with the area of each polygon. You could filter using a minimum threshold area to only keep larger polygons
Code
import cv2
import numpy as np
# Load image, Gaussian blur, grayscale, Otsu's threshold
image = cv2.imread('2.jpg')
blur = cv2.GaussianBlur(image, (3,3), 0)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Perform connected component labeling
n_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh, connectivity=4)
# Create false color image and color background black
colors = np.random.randint(0, 255, size=(n_labels, 3), dtype=np.uint8)
colors[0] = [0, 0, 0] # for cosmetic reason we want the background black
false_colors = colors[labels]
# Label area of each polygon
false_colors_area = false_colors.copy()
for i, centroid in enumerate(centroids[1:], start=1):
area = stats[i, 4]
cv2.putText(false_colors_area, str(area), (int(centroid[0]), int(centroid[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)
cv2.imshow('thresh', thresh)
cv2.imshow('false_colors', false_colors)
cv2.imshow('false_colors_area', false_colors_area)
cv2.waitKey()
這篇關于圖像中土壤顆粒分水嶺以外的替代分割技術的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!