簡體   English   中英

使用 opencv python 進行不完整圓檢測

[英]Incomplete Circle detection with opencv python

是否可以獲得不完整圓的坐標? 我正在使用 opencv 和 python。 所以我可以找到大部分的圈子。 但我不知道如何檢測圖片中不完整的圓圈。 我正在尋找一種簡單的方法來解決它。

驗證碼

import sys
import cv2 as cv
import numpy as np

## [load]
default_file = 'captcha2.png'
# Loads an image
src = cv.imread(cv.samples.findFile(default_file), cv.IMREAD_COLOR)
## [convert_to_gray]
# Convert it to gray
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
## [convert_to_gray]

## [reduce_noise]
# Reduce the noise to avoid false circle detection
gray = cv.medianBlur(gray, 3)
## [reduce_noise]

## [houghcircles]
#rows = gray.shape[0]
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, 5,
                          param1=1, param2=35,
                          minRadius=1, maxRadius=30)
## [houghcircles]

## [draw]
if circles is not None:
    circles = np.uint16(np.around(circles))
    for i in circles[0, :]:
        center = (i[0], i[1])
        # circle center
        cv.circle(src, center, 1, (0, 100, 100), 3)
        # circle outline
        radius = i[2]
        cv.circle(src, center, radius, (255, 0, 255), 3)
## [draw]

## [display]
cv.imshow("detected circles", src)
cv.waitKey(0)
## [display]

嗨 - 還有另一張圖片。 我想要不完整圓圈的 x 和 y 線,左下方為淺藍色。

在此處輸入圖像描述

這里是原圖:

在此處輸入圖像描述

您需要刪除圖像的彩色背景並僅顯示圓圈。

一種方法是:


二進制掩碼:

在此處輸入圖像描述

使用二進制掩碼,我們將檢測圓圈:

在此處輸入圖像描述

代碼:


# Load the libraries
import cv2
import numpy as np

# Load the image
img = cv2.imread("r5lcN.png")

# Copy the input image
out = img.copy()

# Convert to the HSV color space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Get binary mask
msk = cv2.inRange(hsv, np.array([0, 0, 130]), np.array([179, 255, 255]))

# Detect circles in the image
crc = cv2.HoughCircles(msk, cv2.HOUGH_GRADIENT, 1, 10, param1=50, param2=25, minRadius=0, maxRadius=0)

# Ensure circles were found
if crc is not None:

    # Convert the coordinates and radius of the circles to integers
    crc = np.round(crc[0, :]).astype("int")

    # For each (x, y) coordinates and radius of the circles
    for (x, y, r) in crc:

        # Draw the circle
        cv2.circle(out, (x, y), r, (0, 255, 0), 4)

        # Print coordinates
        print("x:{}, y:{}".format(x, y))

    # Display
    cv2.imshow("out", np.hstack([img, out]))
    cv2.waitKey(0)

Output:

x:178, y:60
x:128, y:22
x:248, y:20
x:378, y:52
x:280, y:60
x:294, y:46
x:250, y:44
x:150, y:62

解釋

我們有三個機會找到閾值:

    1. 簡單閾值結果:
    • 在此處輸入圖像描述
    1. 自適應閾值
    • 在此處輸入圖像描述
    1. 二進制掩碼
    • 在此處輸入圖像描述

正如我們所看到的,第三個選項給了我們一個合適的結果。 當然,您可以通過其他選項獲得所需的結果,但可能需要很長時間才能找到合適的參數。 然后我們應用霍夫圓,玩弄參數值,得到了想要的結果。

更新

對於第二張上傳的圖片,可以通過減小霍夫圓的第一個和第二個參數來檢測半圓。

crc = cv2.HoughCircles(msk, cv2.HOUGH_GRADIENT, 1, 10, param1=10, param2=15, minRadius=0, maxRadius=0)

替換主代碼中的上述行將導致:

在此處輸入圖像描述

控制台結果

x:238, y:38
x:56, y:30
x:44, y:62
x:208, y:26

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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