1. 程式人生 > >虹膜識別(三):Hough變換檢測內圓邊緣

虹膜識別(三):Hough變換檢測內圓邊緣

前面我們已經得到了hough變換的基礎條件,那就是有一個很好的用於檢測的二值邊緣影象如下所示:

 

至此我們才能運用hough變換。

Hough變換是一類廣泛用於檢測各種規則圖形用的,像直線、圓、橢圓等等,不同的就是檢測的規律不同。Hough變換的原理網上多得是,像http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/   我當初也是百度上查的,就不詳細說原理了(可能也說不明白),直接上程式了。。

function mean_circle = hough_circle(BW,step_r,step_angle,r_min,r_max,p)
%------------------------------演算法概述-----------------------------
% 該演算法通過a = x-r*cos(angle),b = y-r*sin(angle)將圓影象中的邊緣點
% 對映到引數空間(a,b,r)中,由於是數字影象且採取極座標,angle和r都取
% 一定的範圍和步長,這樣通過兩重迴圈(angle迴圈和r迴圈)即可將原影象
% 空間的點對映到引數空間中,再在引數空間(即一個由許多小立方體組成的
% 大立方體)中尋找圓心,然後求出半徑座標。
%-------------------------------------------------------------------
%------------------------------輸入引數-----------------------------
% BW:二值影象;
% step_r:檢測的圓半徑步長  
% step_angle:角度步長,單位為弧度   :各度計算  1° = 0.0174 
%                                              2° = 0.035  
%                                              3° = 0.0524
%                                              4° = 0.0698
%                                              5° = 0.0872
% r_min:最小圓半徑
% r_max:最大圓半徑
% p:以p*hough_space的最大值為閾值,p取0,1之間的數
%-------------------------------------------------------------------
%          --------對半徑的大小範圍規定問題--------
%         ------ 實驗中發現:外輪廓的半徑範圍在220~260之間   
%                           內輪廓的半徑範圍 60~80之間   
%    Note::  &&&&&&&&&&&當影象改變時半徑範圍需要改變&&&&&&&&&&&&
%    question: 半徑的範圍差超過50將會顯示記憶體不足,注意方案辦法
%------------------------------輸出引數-----------------------------
% hough_space:引數空間,h(a,b,r)表示圓心在(a,b)半徑為r的圓上的點數
% hough_circl:二值影象,檢測到的圓
% para:檢測到的所有圓的圓心、半徑
% mean_circle : 返回檢測到的圓的平均位置及大小
%-------------------------------------------------------------------

[m,n] = size(BW);  %取大小
size_r = round((r_max-r_min)/step_r)+1; %半徑增加,迴圈次數
size_angle = round(2*pi/step_angle);    %角度增加,迴圈次數
hough_space = zeros(m,n,size_r);       %hough空間
[rows,cols] = find(BW);%把要檢測的點存起來,只有白色(邊緣)點需要變換
ecount = size(rows);   %檢測的點的個數

tic    %%%% 計時開始位置 
% Hough變換
% 將影象空間(x,y)對應到引數空間(a,b,r)
% a = x-r*cos(angle)
% b = y-r*sin(angle)
for i=1:ecount      %點個數迴圈
    for r=1:size_r   %單個點在所有半徑空間內檢測
        for k=1:size_angle  %單個點在半徑一定的所在圓內檢測
            a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle));
            b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle));
            if(a>0&a<=m&b>0&b<=n)   %對應到某個圓上,記錄之
                hough_space(a,b,r) = hough_space(a,b,r)+1;
            end
        end
    end
end
% 搜尋超過閾值的聚集點
max_para = max(max(max(hough_space)));%找到最大值所在圓引數
index = find(hough_space>=max_para*p);%索引在一定範圍內的圓引數
length = size(index);
toc  %%%% 計時結束位置,通過計時觀察執行效率,hough變換的一大缺點就是耗時

% 將索引結果轉換為對應的行列(圓心)和半徑大小
% 理解三維矩陣在記憶體中的儲存方式可以理解公式的原理
for k=1:length
    par3 = floor(index(k)/(m*n))+1;
    par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;%轉換為圓心的y值
    par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;%轉換為圓心的x值
    par3 = r_min+(par3-1)*step_r; %轉化為圓的半徑
    %儲存在一起
    para(:,k) = [par1,par2,par3]';
end
% 為提高準確性,求取一個大致的平均位置(而不是直接採用的最大值)
mean_circle = round(mean(para')');

匯入二值圖後,設定一定步長引數執行,例如:mean_circle = hough_circle(J,2,0.0524,60,80,0.9);

這樣就得到了內圓的引數值,執行結果如下:

執行時間:Elapsed time is 0.409292 seconds.

>> mean_circle

mean_circle =

   326
   331
    66

可以看到圓心座標和半徑引數,在座標中畫出這個圓,編寫畫圓函式如下:

function plot_circle(circle_num)
%------------------------------輸入引數-----------------------------
%給定圓的引數畫出一個圓形
%圓引數   circle_num:
%                   circle_num(1) : 圓心橫座標
%                   circle_num(2) :圓心縱座標
%                   circle_num(3) :圓的半徑
%-------------------------------------------------------------------
radius_y = circle_num(1);
radius_x = circle_num(2);
radius = circle_num(3);

alpha=0:pi/20:2*pi;%角度[0,2*pi]
R=radius;           %半徑
%規整到圖的對應位置
x=R*cos(alpha)+radius_x;   
y=R*sin(alpha)+radius_y;
hold on,plot(x,y)

最後把圓的引數和以前的那個圖畫在一起如下:

 

畫成這樣應該很準了吧,基本上貼近內圓了,再把它畫在原圖中可以看到:

 

至此內圓的檢測就完成了,當然其中有很多引數需要調整的,並且每一副圖對應的引數不太一樣,實驗還需要看效果調整。

相關推薦

虹膜識別Hough變換檢測邊緣

前面我們已經得到了hough變換的基礎條件,那就是有一個很好的用於檢測的二值邊緣影象如下所示:   至此我們才能運用hough變換。 Hough變換是一類廣泛用於檢測各種規則圖形用的,像直線、圓、橢圓等等,不同的就是檢測的規律不同。Hough變換的原理網上多得是,像http

數字影象處理筆記使用OpenCV檢測影象特徵

1 - 引言 在數字影象處理中還提供了許多檢測影象簡單特徵的方法,例如邊緣檢測、輪廓檢測、直線檢測、圓檢測等。讓我們用OpenCV實現以下這些演算法吧 2 - Canny邊緣檢測 OpenCV提供了一個非常方便的Canny函式(以演算法的發明者命名) import cv2 i

架構漫談如何做好架構之識別問題

答案 跟著 發生 做了 解決 長時間 一閃而過 開發 問題解決 按照之前架構的定義,做好架構首先需要做的就是識別出需要解決的問題。一般來說,如果把真正的問題找到,那麽問題就已經解決了80%了。這個能力基本上就決定了架構師的水平。 那麽面對問題有哪些困難呢? 我們先看一

岡薩雷斯數字影象處理章灰度變換與空間濾波1——基本灰度變換函式

一、前言 空間域指影象平面本身。這類影象處理方法直接以影象中的畫素操作為基礎。這是相對於變換域中的影象處理而言的。變換域的影象處理首先把一幅影象變換到變換域,在變換域中進行處理,然後通過反變換把處理結果返回到空間域 空間域處理主要分為灰度變換和空間濾波兩類。 灰度變換在影象的單個畫素上操

c語言數字影象處理仿射變換

1 void bilinera_interpolation(short** in_array, short height, short width, 2 short** out_array, short out_height, short out

python3.5《機器學習實戰》學習筆記k近鄰演算法scikit-learn實戰手寫體識別

轉載請註明作者和出處:http://blog.csdn.net/u013829973 系統版本:window 7 (64bit) 我的GitHub:https://github.com/weepon python版本:python 3.5 IDE:Spy

計算機視覺目標檢測識別

1 - 引言 目標檢測和識別,是計算機視覺最常見的挑戰之一。 目標檢測和識別的區別在於:目標檢測是用來確定影象的某個區域是否含有要識別的物件,而識別是程式識別物件的能力。識別通常只處理已檢測到物件的區域。 在計算機視覺中有很多目標檢測和識別的技術 梯度直方圖(Hist

Java多線程編程模式實戰指南Two-phase Termination模式

增加 row throws mgr 額外 finally join table 還需 停止線程是一個目標簡單而實現卻不那麽簡單的任務。首先,Java沒有提供直接的API用於停止線程。此外,停止線程時還有一些額外的細節需要考慮,如待停止的線程處於阻塞(等待鎖)或者等待狀態(等

SpringSpring整合Hibernate

ng- checkout wait 哪些 check driver eas package class 背景:   本文主要介紹使用spring-framework-4.3.8.RELEASE與hibernate-release-5.2.9.Final項目整合搭建

一個鹹魚的Python爬蟲之路爬取網頁圖片

you os.path odin 路徑 生成 存在 parent lose exist 學完Requests庫與Beautifulsoup庫我們今天來實戰一波,爬取網頁圖片。依照現在所學只能爬取圖片在html頁面的而不能爬取由JavaScript生成的圖。所以我找了這個網站

淺談Kotlin

ide pos 中一 androi 文件 rri object 淺談 spa 淺談Kotlin(一):簡介及Android Studio中配置 淺談Kotlin(二):基本類型、基本語法、代碼風格 前言:   已經學習了前兩篇文章,對Kotlin有了一個基本的認識,往後

elastic-job詳解Job的手動觸發功能

方法 idt image blog per tle cnblogs ack display elastic-job的任務都是使用quartz來觸發的,quartz表達式一般都是定期執行。但有時候一些周期較長的任務,比如一天一次,幾小時一次的任務,我們需要等待很久才能觸發一次

ASP.NET MVC5表單和HTML輔助方法

http get 暴露 sta 選擇 .text 響應 pos 多行文本 二進制 表單的使用 Action和Method特性   Action特性用以告知瀏覽器信息發往何處,因此,Action特性後面需要包含一個Url地址。這裏的Url地址可以是相對的,也可以是絕對的。如

《Javascript高級程序設計》閱讀記錄第五章 上

面向對象的語言 none 括號 數量 mas ie9 驗證 ive .so   這個系列以往文字地址:   《Javascript高級程序設計》閱讀記錄(一):第二、三章   《Javascript高級程序設計》閱讀記錄(二):第四章   這個系列,我會把閱讀《Jav

並發編程從AQS到CountDownLatch與ReentrantLock

splay public 繼續 for admin font 通信 html integer 一、目錄 1、AQS簡要分析 2、談CountDownLatch 3、談ReentrantLock 4、談消費者與生產者模式(not

spring boot 熱部署

pom.xml文件 添加 gin 字節 loader 信息 dev spring tool 介紹了Spring boot實現熱部署的兩種方式,這兩種方法分別是使用 Spring Loaded和使用spring-boot-devtools進行熱部署。 熱部署是什麽

TF-IDF與余弦相似性的應用自動摘要

下一步 dip target 似的 abs tps .net ebo ace 轉:http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html 有時候,很簡單的數學方法,就可以完成很復雜的任務。 這個

Bootstrap入門Less

樣式 ttr edi local 編輯 修改文件 方便 code b2c 很多時候我們需要定制Bootstrap的樣式,然後根制入門初步中,每次都定制網頁(http://v3.bootcss.com/customize/)生成我們需要的Css是一件很麻煩又不方便的事件。幸好

vue移動音樂app開發學習輪播圖組件的開發

hub out webapp width eth reat slot utc -1 本系列文章是為了記錄學習中的知識點,便於後期自己觀看。如果有需要的同學請登錄慕課網,找到Vue 2.0 高級實戰-開發移動端音樂WebApp進行觀看,傳送門。 完成後的頁面狀態以及項目結構如

Vue2+VueRouter2+webpack 構建項目實戰配置路由,運行頁面

margin not found sans product mage -a nod targe fig 制作.vue模板文件 通過前面的兩篇博文的學習,我們已經建立好了一個項目。問題是,我們還沒有開始制作頁面。下面,我們要來做頁面了。 我們還是利用 http://cno