簡體   English   中英

使用OpenCV查找圖像中的亮點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM