使用霍夫变换检测虹膜内圆的注意事项

摘要:
几天前,当使用霍夫变换检测虹膜内圈时,我发现霍夫变换对噪声非常敏感。有时当阈值设置得很小时,会画很多圆圈,这非常微妙。然后我想到了两种改进方法。然而,圆圈的大小有点不同。没有办法。霍夫变换就是这样,但精度非常好。基本上,如果没有重大问题,圆瞳孔可以被成功检测到。

前些天用霍夫变换来检测虹膜的内圆的时候发现霍夫变换对噪声非常敏感,有的时候阈值设置的小了,就会画出很多的圆,就很微妙,然后想了一下改进的方法,具体有两种。

第一种:因为霍夫变换检测圆会生成一个array类型的三维数组,这个数组里的每一对值都包含了检测出的圆的圆心横纵坐标和半径,这时我们找到图像的中心点,就是height/2和width/2的那个点,计算检测出的n个点的圆心和中心点的距离,选取距离中心点最近的那个点的坐标和半径作为最终的圆心和半径。

第二种:先大概的估计瞳孔的灰度值,即将虹膜图像进行二值化,我们知道人眼图像瞳孔部分的灰度值是最低的,预估它并不难,你可以使用opencv中的cv.imshow()函数将它显示出来,再将光标滑动到窗口上,就能查看灰度值了,然后使用canny边缘检测将瞳孔的边缘检测出来,再用霍夫变换来检测圆就比较精确了,基本上每次都能成功检测。但是圆的大小差那么一点,没办法,霍夫变换就这样,不过准度很好,基本上没大问题的话都能成功检测到圆形的瞳孔。

下面是第一种方法的代码

import cv2 as cv
import numpy as np
import math

def perfect_circles(circles,half_width,half_height):
    distances=[]
    min_=0
    for index in range(len(circles)):
        distance=math.sqrt((circles[index][0]-half_width)**2+(circles[index][1]-half_height)**2)
        distances.append(distance)
    print(distances)
    min_=distances.index(min(distances))
    return circles[min_]

def edge_demo(image):
    height=image.shape[0]
    width=image.shape[1]
    blurred=cv.medianBlur(image,3)
    gray=cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
    circles1 = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, 100, param1=110, param2=30, minRadius=50, maxRadius=110)
    circles = circles1[0, :, :]
    circles = np.uint16(np.around(circles))  # 四舍五入,取整
    half_height=int(height/2)
    half_width=int(width/2)
    circles=perfect_circles(circles,half_width,half_height)
    # print(circles[0])
    # for i in len(circles):
    #     if circles[0]>height or i[1]>
    #         continue
    #     else:
    print(circles)
    cv.circle(image, (circles[0], circles[1]), circles[2], (0, 0, 255), 1)  # 画圆
    cv.circle(image, (circles[0], circles[1]), 2, (0, 0, 255), 1)  # 画圆心
    # cv.circle(image, (236, 240), 82, (0, 0, 255), 1)  # 画圆
    # cv.circle(image, (236, 240), 2, (0, 0, 255), 2)  # 画圆心
    cv.imshow('circles',image)


img = cv.imread('/Users/wenyu/Desktop/demo/people_1/5.bmp')
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.namedWindow('iris',cv.WINDOW_AUTOSIZE)
cv.imshow('iris',gray)
edge_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()

第二种方法的代码:

import cv2 as cv
import numpy as np

img = cv.imread('/Users/wenyu/Desktop/demo/people_1/5.bmp')
height=img.shape[0]
width=img.shape[1]
image=cv.GaussianBlur(img,(3,3),0)
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
ret,thresh1=cv.threshold(gray,cv.THRESH_OTSU,255,cv.THRESH_BINARY)
edge_output=cv.Canny(thresh1,45,110)
circles1=cv.HoughCircles(edge_output,cv.HOUGH_GRADIENT,1,50,param1=110,param2=20,minRadius=50,maxRadius=130)
# print(circles1)
circles=circles1[0, :, :]
circles = np.uint16(np.around(circles))
for i in circles[:]:
    if i[0]>height or i[1]>
           continue
    else:
        print(i)
        cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 1)  # 画圆
        cv.circle(image, (i[0], i[1]), 2, (0, 0, 255), 3)  # 画圆心
    cv.imshow('circles',image)
cv.namedWindow('iris',cv.WINDOW_AUTOSIZE)
cv.imshow('iris',edge_output)
cv.waitKey(0)
cv.destroyAllWindows()

第一种方法画出来的圆的效果图使用霍夫变换检测虹膜内圆的注意事项第1张

第二种方法画出的效果图:先是边缘检测图,然后是画圆

使用霍夫变换检测虹膜内圆的注意事项第2张

两种方法各有千秋,都还可以

然后外圆的定位方法,我这几天看了一些文献,我还没有看到我比较喜欢的觉得还不错的,我挨个试试吧,要是效果好的话我会再更新,因为太难了外圆。

ps:转载注明出处哦,就酱

免责声明:文章转载自《使用霍夫变换检测虹膜内圆的注意事项》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇nc基本操作&反弹shelllinux安装samba下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

霍夫变换(一)霍夫线性变换

霍夫变换(一)线性霍夫变换 概述:霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。霍夫线变换和霍夫圆变换两种。 霍夫线变换: OpenCv中的霍夫线变换: <1>标准霍夫变换(StandardHough Transform,...

matlab 霍夫变换(hough) 检测直线

  霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、电脑视觉 (computer vision)以及数位影像处理 (digital image processing)。 霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空...

第三章 霍夫变换(Hough Transform)

主要内容: 霍夫变换的作用 霍夫变换检测直线的原理 霍夫变换检测圆的原理 OpenCV中的霍夫变换    1、霍夫变换检测直线原理       霍夫变换,英文名称Hough Transform,作用是用来检测图像中的直线或者圆等几何图形的。       一条直线的表示方法有好多种,最常见的是 y=mx+b 的形式。 假设有一幅图像,经过滤波,边缘检...