Python联合斑点检测
我正在尝试对花生形状的分布进行斑点检测-有关典型示例,请参见下图: 我想找到两个斑点的质心,但我不确定哪种计算机视觉方法或算法最适合应用于这个问题。理想情况下,解决方案应该是轻量级的,因为我需要处理许多这样的blob。到目前为止,我已经尝试使用Python联合斑点检测,python,opencv,scipy,computer-vision,Python,Opencv,Scipy,Computer Vision,我正在尝试对花生形状的分布进行斑点检测-有关典型示例,请参见下图: 我想找到两个斑点的质心,但我不确定哪种计算机视觉方法或算法最适合应用于这个问题。理想情况下,解决方案应该是轻量级的,因为我需要处理许多这样的blob。到目前为止,我已经尝试使用skimage.feature.blob_doh来获取blob的中心和半径,并找到该blob的加权平均像素,但由于blob_doh与blob的连接性质(即仅返回一个blob)进行斗争,因此效果并不理想: blobbing代码如下所示: def get_
skimage.feature.blob_doh
来获取blob的中心和半径,并找到该blob的加权平均像素,但由于blob_doh
与blob的连接性质(即仅返回一个blob)进行斗争,因此效果并不理想:
blobbing代码如下所示:
def get_blobs(image, num_blobs):
img = image
img = cv.normalize(img, None, 0.0, 1.0, cv.NORM_MINMAX)
img = img.astype(float)
blobs = blob_doh(img)
ys = np.array([x[0] for x in blobs])
xs = np.array([x[1] for x in blobs])
rs = np.array([x[2] for x in blobs])
sort_args = np.argsort(rs)
xs, ys, rs = xs[sort_args], ys[sort_args], rs[sort_args]
if len(ys) < num_glints:
diff = num_blobs - len(ys)
ys = np.concatenate((ys, np.zeros((diff)))).astype(float)
xs = np.concatenate((xs, np.zeros((diff)))).astype(float)
rs = np.concatenate((rs, np.zeros((diff)))).astype(float)
num_blobs = len(ys)
xs, ys, rs = xs[0:num_blobs], ys[0:num_blobs], rs[0:num_blobs]
return xs, ys, rs
(换句话说,blob中的所有像素都构成质心)。
非常感谢 下面是一种使用OpenCV的方法。不过,这将对图像进行二值化,但不应有任何性能缺陷。您可以根据需要调整阈值参数,如果需要,还可以在blob大小上添加过滤
import numpy as np
import cv2
import matplotlib.pyplot as plt
rgb = cv2.imread('/your/image/path/blobs_0001.png')
gray = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)
th = cv2.adaptiveThreshold(gray,255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY_INV,11,2)
contours, _ = cv2.findContours(th,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
cv2.circle(rgb, (cx, cy), 5, (255, 0, 0), cv2.FILLED)
plt.imshow(rgb)
不确定您是否尝试过这种方法,但您可能会发现,简单地对图像应用一些形态学操作作为预处理步骤(侵蚀或打开)可能有助于分割这些斑点。
import numpy as np
import cv2
import matplotlib.pyplot as plt
rgb = cv2.imread('/your/image/path/blobs_0001.png')
gray = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)
th = cv2.adaptiveThreshold(gray,255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY_INV,11,2)
contours, _ = cv2.findContours(th,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
cv2.circle(rgb, (cx, cy), 5, (255, 0, 0), cv2.FILLED)
plt.imshow(rgb)