[英]OpenCV / Image Processing techniques to find the centers of bright spots in an image
[英]Finding bright spots in a image using opencv
我想在上圖中找到亮點,並用一些符號標記它們。 為此,我嘗試使用OpenCV已經提供的霍夫圓變換算法。 但是當我運行代碼時,它給出了某種斷言錯誤。 我還嘗試了OpenCV中也提供的Canny邊緣檢測算法,但它也給出了某種斷言錯誤。 我想知道是否有某種方法可以完成此操作,或者是否可以防止出現這些錯誤消息。
我是OpenCV的新手,我們將不勝感激。
PS-如果需要,我也可以使用Scikit映像。 因此,如果可以使用Scikit-image完成此操作,請告訴我如何操作。
下面是我的預處理代碼:
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)
如果您只是要處理簡單的圖像(例如,您的示例中背景為黑色),則可以使用相同的基本預處理/閾值,然后找到連接的組件。 使用此示例代碼在圖像的所有圓內繪制一個圓。
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-從左上到右下掃描圖像像素,直到遇到沒有標簽(id)的非零像素。
2-當遇到非零像素時,遞歸搜索所有相鄰像素(如果使用4連接,則檢查UP-LEFT-DOWN-RIGHT,使用8連接,還檢查對角線),直到完成該區域。 為每個像素分配標簽。 增加標簽計數器。
3-從您繼續的位置繼續掃描。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.