Có nhiều góc trên đường viền của "đối tượng nhọn" của bạn, vì vậy một cách tiếp cận sẽ là điều chỉnh máy dò góc cho việc này.
Ví dụ, tôi đã tính toán định thức của tenxơ cấu trúc (mã Mathicala bên dưới) của một hình ảnh biến đổi khoảng cách:
Binarizing với độ trễ mang lại hình ảnh này, đó sẽ là điểm khởi đầu tốt cho thuật toán phân đoạn bạn chọn:
Mã toán học ( src
là hình ảnh nguồn bạn đã đăng)
Lúc đầu, tôi tính toán một biến đổi khoảng cách của hình ảnh đầu vào. Điều này tạo ra sự tương phản trên toàn bộ khu vực đối tượng (thay vì chỉ đường viền), vì vậy toàn bộ đối tượng có thể được phát hiện.
dist = ImageData[DistanceTransform[src]];
Tiếp theo tôi chuẩn bị các thành phần của tenor cấu trúc . Kích thước bộ lọc cho các dẫn xuất gaussian nếu 5, kích thước cửa sổ là 20.
gx = GaussianFilter[dist, 5, {1, 0}];
gy = GaussianFilter[dist, 5, {0, 1}];
gx2 = GaussianFilter[gx^2, 20];
gxy = GaussianFilter[gx*gy, 20];
gy2 = GaussianFilter[gy^2, 20];
Để tính toán bộ lọc góc ở mỗi pixel, tôi chỉ cần cắm chúng vào bộ xác định biểu tượng của tenxơ cấu trúc:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
Về cơ bản là giống như:
corners = gx2 * gy2 - gxy * gxy;
Chuyển đổi nó thành một hình ảnh và nhân rộng nó thành phạm vi 0..1 mang lại hình ảnh máy dò góc ở trên.
Cuối cùng, tạo nhị phân cho nó với ngưỡng phù hợp sẽ cho hình ảnh nhị phân cuối cùng:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]