Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python联合斑点检测_Python_Opencv_Scipy_Computer Vision - Fatal编程技术网

Python联合斑点检测

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_

我正在尝试对花生形状的分布进行斑点检测-有关典型示例,请参见下图:

我想找到两个斑点的质心,但我不确定哪种计算机视觉方法或算法最适合应用于这个问题。理想情况下,解决方案应该是轻量级的,因为我需要处理许多这样的blob。到目前为止,我已经尝试使用
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)