【OpenCV】⚠️高手勿入! 半小時學會基本操作 ⚠️ 圓圈檢測
概述
OpenCV 是一個跨平臺的計算機視覺庫, 支持多語言, 功能強大. 今天小白就帶大家一起攜手走進 OpenCV 的世界.
霍夫圓變換
霍夫圓變換 (Hough Circle Transform) 的原理和霍夫直線變換類似. 對于一條直線, 我們可以用參數(shù) (r, θ) 表示, 對于圓我們需要三個參數(shù) (x, y, r), 分別代表三個參數(shù) x 圓心, y 圓心, r, 半徑.
代碼實現(xiàn)
因為霍夫圓檢測對噪聲比較敏感, 所以首先要對圖像做中值濾波.
基于效率考慮, Opencv 中實現(xiàn)的霍夫變換圓檢測是基于圖像梯度實現(xiàn), 分為兩步:
檢測變換, 發(fā)現(xiàn)可能的圓心基于第一步的基礎上從候選圓心開始計算最佳半徑大小
格式:
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
參數(shù):
image: 輸入圖像
method: 判別方法, 只有 HOUGH_GRADIENT (計算梯度) 一個方法
dp: 累計閾值
minDist: 間距, 小于間距判斷成一個圓
param1: Canny 邊緣檢測的最大閾值
param2: 在檢測階段圓心累加器閾值, 是否為圓形
例一
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 讀取圖片
image = cv2.imread("map.jpg")
image_copy = image.copy()
# 均值遷移濾波
filter = cv2.pyrMeanShiftFiltering(image, 10, 100)
# 轉換成灰度圖
filter_gray = cv2.cvtColor(filter, cv2.COLOR_BGR2GRAY)
# 霍夫曼圓圈檢測
circles = cv2.HoughCircles(filter_gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=100, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
# 遍歷
for circle in circles[0, :]:
cv2.circle(image_copy, (circle[0], circle[1]), circle[2], (0, 0, 255), 2)
cv2.circle(image_copy, (circle[0], circle[1]), 2, (255, 0, 0), 2)
# 圖片展示
f, ax = plt.subplots(2, 2, figsize=(12, 12))
# 子圖
ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
ax[0, 1].imshow(cv2.cvtColor(filter, cv2.COLOR_BGR2RGB))
ax[1, 0].imshow(filter_gray, "gray")
ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB))
# 標題
ax[0, 0].set_title("original")
ax[0, 1].set_title("image filter")
ax[1, 0].set_title("image gray")
ax[1, 1].set_title("image circle")
plt.show()
# 保存結果
cv2.imwrite("map_result.jpg", image_copy)
輸出結果:
例二
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 讀取圖片
image = cv2.imread("coin.jpg")
image_copy = image.copy()
# 均值遷移濾波
filter = cv2.pyrMeanShiftFiltering(image, 10, 40)
# 轉換成灰度圖
filter_gray = cv2.cvtColor(filter, cv2.COLOR_BGR2GRAY)
# 霍夫曼圓圈檢測
circles = cv2.HoughCircles(filter_gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=100, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
# 遍歷
for circle in circles[0, :]:
cv2.circle(image_copy, (circle[0], circle[1]), circle[2], (0, 0, 255), 2)
cv2.circle(image_copy, (circle[0], circle[1]), 2, (255, 0, 0), 2)
# 圖片展示
f, ax = plt.subplots(2, 2, figsize=(12, 12))
# 子圖
ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
ax[0, 1].imshow(cv2.cvtColor(filter, cv2.COLOR_BGR2RGB))
ax[1, 0].imshow(filter_gray, "gray")
ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB))
# 標題
ax[0, 0].set_title("original")
ax[0, 1].set_title("image filter")
ax[1, 0].set_title("image gray")
ax[1, 1].set_title("image circle")
plt.show()
# 保存結果
cv2.imwrite("coin_result.jpg", image_copy)
輸出結果:
到此這篇關于OpenCV半小時掌握基本操作之圓圈檢測的文章就介紹到這了,更多相關OpenCV圓圈檢測內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- OpenCV半小時掌握基本操作之圖像裁剪融合
- OpenCV半小時掌握基本操作之圖像處理
- opencv-python基本圖像處理詳解
- OpenCV圖像處理基本操作詳解
- Opencv圖像處理之詳解掩膜mask
- 基于python的opencv圖像處理實現(xiàn)對斑馬線的檢測示例
- Python+OpenCV圖像處理——圖像二值化的實現(xiàn)
- OpenCV半小時掌握基本操作之分水嶺算法
- OpenCV半小時掌握基本操作之傅里葉變換
- OpenCV半小時掌握基本操作之圖像輪廓
- OpenCV半小時掌握基本操作之直方圖
- OpenCV半小時掌握基本操作之模板匹配
- OpenCV半小時掌握基本操作之對象測量
- OpenCV半小時掌握基本操作之圖像基礎操作