发现在图像使用OpenCV的亮点(Finding bright spots in a image u

2019-09-30 21:09发布

我想找到上述图像中的亮点,并使用一些符号标记它们。 为此,我已经使用霍夫变换圈算法,OpenCV中已经提供了尝试。 但它给某种断言错误,当我运行的代码。 我也试过这也是在OpenCV中提供的Canny边缘检测算法,但它也给某种断言错误的。 我想知道是否有一些方法来完成这件事,或者如果我能阻止这些错误消息。

我是新来的OpenCV和任何帮助将非常感激。

PS - 我也可以在必要时使用Scikit形象。 因此,如果这可以用Scikit图像可以做到,那么请告诉我如何。

下面是我的预处理代码:

import cv2
import numpy as np



image = cv2.imread("image1.png")

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

binary_image = np.where(gray_image > np.mean(gray_image),1.0,0.0)

binary_image = cv2.Laplacian(binary_image, cv2.CV_8UC1)

Answer 1:

如果你只是简单的图像像你的榜样,你有黑色背景的工作,你可以使用相同的基本预处理/阈值,然后找到连接的部件。 使用此示例代码来绘制所有圈内圆的形象。

import cv2 
import numpy as np

image = cv2.imread("image1.png")

#  constants
BINARY_THRESHOLD = 20
CONNECTIVITY = 4
DRAW_CIRCLE_RADIUS = 4

#  convert to gray
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

#  extract edges
binary_image = cv2.Laplacian(gray_image, cv2.CV_8UC1)

#  fill in the holes between edges with dilation
dilated_image = cv2.dilate(binary_image, np.ones((5, 5)))

#  threshold the black/ non-black areas
_, thresh = cv2.threshold(dilated_image, BINARY_THRESHOLD, 255, cv2.THRESH_BINARY)

#  find connected components
components = cv2.connectedComponentsWithStats(thresh, CONNECTIVITY, cv2.CV_32S)

#  draw circles around center of components
#see connectedComponentsWithStats function for attributes of components variable
centers = components[3]
for center in centers:
    cv2.circle(thresh, (int(center[0]), int(center[1])), DRAW_CIRCLE_RADIUS, (255), thickness=-1)

cv2.imwrite("res.png", thresh)
cv2.imshow("result", thresh)
cv2.waitKey(0)

下面是得到的图像:

编辑:connectedComponentsWithStats取二进制图像作为输入,并且在该图像中返回连接像素组。 如果你想自己实现该功能,天真的办法是:
从顶部1个扫描图像像素从左上到右下,直到你遇到没有标签(标识)非零像素。
2-当遇到一个非零像素,搜索它的所有邻居递归(如果使用4连接你检查UP-LEFT-DOWN-RIGHT,8连接还检查对角线)直到完成该区域。 为每一个像素的标签。 增加您的标签计数器。
3-继续从您那里扫描。



文章来源: Finding bright spots in a image using opencv