圆检测(15)

一 函数介绍

1 pyrMeanShiftFiltering (去燥)
pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None)
.   @param src The source 8-bit, 3-channel image.(源8位,3通道图像)

. @param dst The destination image of the same format and the same size as the source.
         与源相同格式和大小的目标图像。
. @param sp The spatial window radius.
         定义的漂移物理空间半径大小;
. @param sr The color window radius.
     定义的漂移色彩空间半径大小;
. @param maxLevel Maximum level of the pyramid for the segmentation.
分段的最大金字塔等级。
. @param termcrit Termination criteria: when to stop meanshift iterations.
定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合;

 

  这个函数严格来说并不是图像的分割,而是图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域.

 

1. 迭代空间构建:

  以输入图像上src上任一点P0为圆心,建立物理空间上半径为sp,色彩空间上半径为sr的球形空间,物理空间上坐标2个—x、y,色彩空间上坐标3个—R、G、B(或HSV),构成一个5维的空间球体。

  其中物理空间的范围x和y是图像的长和宽,色彩空间的范围R、G、B分别是0~255。

2. 求取迭代空间的向量并移动迭代空间球体后重新计算向量,直至收敛:

  在1中构建的球形空间中,求得所有点相对于中心点的色彩向量之和后,移动迭代空间的中心点到该向量的终点,并再次计算该球形空间中所有点的向量之和,如此迭代,直到在最后一个空间球体中所求得的向量和的终点就是该空间球体的中心点Pn,迭代结束。

3. 更新输出图像dst上对应的初始原点P0的色彩值为本轮迭代的终点Pn的色彩值,如此完成一个点的色彩均值漂移。

4. 对输入图像src上其他点,依次执行步骤1,、2、3,遍历完所有点位后,整个均值偏移色彩滤波完成,这里忽略对金字塔的讨论。

 

 

参考

Opencv均值漂移pyrMeanShiftFiltering彩色图像分割流程剖析

原文:https://blog.csdn.net/dcrmg/article/details/52705087

 

 

2 HoughCircles

(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)

参数解说

  1. image   不用多说,输入矩阵
  2. method   cv2.HOUGH_GRADIENT 也就是霍夫圆检测,梯度法
  3. dp   计数器的分辨率图像像素分辨率与参数空间分辨率的比值(官方文档上写的是图像分辨率与累加器分辨率的比值,它把参数空间认为是一个累加器,毕竟里面存储的都是经过的像素点的数量),dp=1,则参数空间与图像像素空间(分辨率)一样大,dp=2,参数空间的分辨率只有像素空间的一半大
  4. minDist 圆心之间最小距离,如果距离太小,会产生很多相交的圆,如果距离太大,则会漏掉正确的圆
  5. param1         canny检测的双阈值中的高阈值,低阈值是它的一半
  6. param2         最小投票数(基于圆心的投票数)
  7. minRadius     需要检测院的最小半径
  8. maxRadius    需要检测院的最大半径如果<= 0,则使用最大图像尺寸。如果<0,则返回。没有找到半径的中心.

  

课程图片

 

 

 

 

 

代码

import cv2 as cv
import numpy as np

# 圆检测
def circles_image(image):
    #去除噪声

    dst = cv.pyrMeanShiftFiltering(image, 20, 500)
    cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    '''
    参数说明:
    图像cimage, 基于霍夫圆检测 cv.HOUGH_GRADIENT,dp=1说明参数空间与像素空间一样大,圆心最小距离160px,
    param1:canny检测双阈值的高阈值,param2=36:最小投票数(基于圆心投票),minRadius:检测最小圆半径,
    maxRadius:检测最大圆半径,如果<= 0,则使用最大图像尺寸。如果<0,则返回。没有找到半径的中心。
    '''
    circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 160, param1=40, param2=36, minRadius=0, maxRadius=0)
    circles = np.uint16(np.around(circles))
    for i in circles[0, :]:
        #原图画圆
        '圆心:(i[0], i[1]),半径:i[2],颜色:(0, 0, 255),像素:2'
        cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)
        cv.circle(image, (i[0], i[1]), 2, (255, 0, 255), 2)
    cv.imshow("circle", image)


src = cv.imread("yingbi.jpg")
cv.imshow("before", src)
circles_image(src)
cv.waitKey(0)
cv.destroyAllWindows()

 

 

检测效果

 

 

posted @ 2019-07-15 10:33  柳帅  阅读(217)  评论(0编辑  收藏  举报
//替换成自己路径的js文件