Сегментация водораздела твердых частиц проблема - PullRequest
1 голос
/ 24 октября 2019
  • У меня есть проблема, касающаяся того, как обнаружить границы на изображении частиц почвы и измерить площадь этих границ с помощью алгоритма сегментации водораздела, показанного ниже, и я использовал его для цветных изображений, однако обнаружил лучшее обнаружение краевАлгоритм, использующий целостное детектирование краев, которое дает лучшие результаты, чем детектирование контуров. Однако мой главный вопрос состоит в том, как я могу использовать это изображение после получения этих острых краев частиц, чтобы получить области границ в изображении напрямую, используя любую встроенную функциюв пакетах Python.

enter image description here enter image description here

import cv2
import math
import numpy as np
from skimage.feature import peak_local_max
from skimage.morphology import watershed
from scipy import ndimage
import xlwt
from xlwt import Workbook
wb = Workbook()
sheet1 = wb.add_sheet('Sheet 1')
n = 1
# Load in image, convert to gray scale, and Otsu's threshold
image = cv2.imread('gravels1_out.jpg')
# image = cv2.medianBlur(image, 7)
# kernel = np.ones((5,5),np.float32)/36
# image = cv2.filter2D(image,-1,kernel)
# cv2.imshow('img',image)
# cv2.waitKey()
# exit()
# gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
areas =[]
# Compute Euclidean distance from every binary pixel
# to the nearest zero pixel then find peaks
distance_map = ndimage.distance_transform_edt(image)
local_max = peak_local_max(distance_map, indices=False, min_distance=20, labels=image)

# Perform connected component analysis then apply Watershed
markers = ndimage.label(local_max, structure=np.ones((3, 3)))[0]
labels = watershed(-distance_map, markers, mask=image)

# Iterate through unique labels
total_area = 0
for label in np.unique(labels):
    if label == 0:
        continue

    # Create a mask
    mask = np.zeros(gray.shape, dtype="uint8")
    mask[labels == label] = 255
    # Find contours and determine contour area
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    c = max(cnts, key=cv2.contourArea)
    area = cv2.contourArea(c)
    if area > 20:
        areas.append(area)
    print('polygon number ', n , 'of area ',area)
    n+=1
    cv2.drawContours(image, [c], -1, (36,255,12), 2)
cal_list=[]
for a in areas:
    b = a/29700
    cal_list.append(b)

row = 1
col = 0
gamma = 1.7
W =[]
cum = 0
for item in cal_list:
    r = 10*((item/math.pi)**0.5)
    v = (4/3)*math.pi*r**3
    w = gamma*v
    W.append(w)
    for c in W:
        cum = cum + c
    sheet1.write(row, col, item)
    sheet1.write(row,col+1,r)
    sheet1.write(row,col+2,v)
    sheet1.write(row, col + 3, w)
    sheet1.write(row, col + 4,cum)
    row+=1

wb.save('SAMPLE A .xls')
print('MAXIMUM VALUE OF AREAS DETECTED ', max(cal_list))
print('MINUMUM VALUE OF AREAS DETECTED ', min(cal_list))
print('Total number of polygons detected = ' , n)
cv2.imshow('image', image)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...