我有一些影像和對應的 ROI 位置,我想用這些資料生成蒙版影像,我嘗試生成一些蒙版影像,但是當只有一個 ROI 時它作業正常,但是當有兩個以上 ROI 時導致面罩連接。
有什么方法可以在不知道有多少 ROI 的情況下生成 Mask 影像?
代碼:
import numpy as np
import cv2
from skimage import morphology
def get_mask(imgshape, roi):
mask = np.zeros(imgshape, dtype=np.int32)
mask = cv2.fillConvexPoly(mask, roi, 255)
mask = morphology.binary_closing(mask)
return mask
mask_img = get_mask((200,200), roi_pos)
ROI = [[104, 94],[105, 94],[106, 93],[105, 92],[104, 91],
[103, 92],[103, 93],[ 95, 94],[ 96, 94],[ 97, 92],[ 97, 91],
[ 97, 91],[ 95, 91],[ 94, 91],[ 93, 93],[ 94, 94]]
結果:

uj5u.com熱心網友回復:
由于您在單個陣列中有許多點,因此您必須對它們進行聚類。正如 Rahul 所提到的,K-means 非常適合這項作業。
仍然存在一個問題,您如何知道存在多少個 ROI?換句話說,您將您的點分為多少個集群?
我在
必須選擇具有最高輪廓分數的聚類以提供最佳聚類結果。基于上圖的最佳聚類數為 2。
# K-Means model with 2 clusters
final_kmeans = KMeans(n_clusters = 2)
final_kmeans.fit(r)
final_kmeans.predict(r)
# points and labels to separate lists
r_list = r.tolist()
labels = final_kmeans.predict(r).tolist()
# number of unique clusters
num_clusters = np.unique(final_kmeans.predict(r)).tolist()
# sample mask for demonstration
mask = np.zeros((300, 250,1), dtype=np.uint8)
# select points by their cluster labels and draw them
for clus in num_clusters:
points = []
for i, j in zip(r_list, labels):
if j == clus:
points.append(i)
mask = cv2.fillConvexPoly(mask, np.array(points), 255)

希望這能給你一個想法。您可以進一步優化它。記住資料集可能的最大 ROI 數量。您可以嘗試其他聚類演算法,也可以尋找可以讓您獲得最佳聚類數量的方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/489337.html
