人眼中亮斑的检测、定位和去除
生活随笔
收集整理的這篇文章主要介紹了
人眼中亮斑的检测、定位和去除
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在紅外線照射人眼時,會產生亮斑,亮斑的像素比其他的像素要高,因此我們選擇一個好的閾值對圖像進行分割,
但是怎么選擇合適的閾值?
這里我們可以用迭代閾值的辦法對圖像進行分割,但是到合適的閾值時,怎么評價閾值的好壞,
需要一個合適的評價的條件,確定閾值。。
這個評價的條件的確定:
首先我們假設閾值像素值是圖像最大的灰度值,因為亮斑區域的像素很高,一般情況下,亮斑中像素高的部分可以被分割,但是這時分割的區域很小,不是很合適,閾值像素降低進行分割,這樣亮斑區域的面積增加,于此同時,人眼圖像中的其他有高像素的區域可能也被分割進去,
這里我們定義評價條件:R(比率)=亮斑面積/(分割的全部面積--亮斑面積),,因為當閾值降低時,亮斑區域的面積增加,根據常識我們可以知道,亮斑的像素值是從中心到邊界是遞減的過程,假設在取一閾值時,亮斑的像素達到最大,閾值在繼續減小時,不是亮斑的區域面積會增加,這時評價條件比率這時會降低,這時我們取比率最大時的像素值為圖像的分割閾值,,,
在實際的圖像中,因為亮斑的區域一般在人眼角膜附近,為了減小搜索時間,我們可以對圖像進行剪切,只處理我們想要的區域,這樣處理會快些。
至于亮斑的面積,我們可以使用matlab中的輪廓函數產生。
相應的代碼:
% This function locates the corneal reflection within a window using an % adaptive thresholding technique.% Input: % I = input image % [cx cy] = window center % window_width = width of window (must be odd) % % Output: % [x,y] = corneal reflection coordinate % ar = approximate radius of the corneal reflectionif (mod(window_width,2)~=1)fprintf(1,'Window_width is not odd! It is set at %d!',window_width); end;[height width] = size(I); i = 2; score(1) = 0; x = []; y = []; ar = [];r = floor((window_width-1)/2); sx = max(round(cx-r),1); ex = min(round(cx+r),width); sy = max(round(cy-r),1); ey = min(round(cy+r),height); Iw = I(sy:ey, sx:ex);for threshold=max(max(I)):-1:1Iwt = Iw>=threshold;[labeled,numObjects] = bwlabel(Iwt,8);if numObjects < 2continue;endprops = regionprops(labeled,'Area','Centroid','EquivDiameter');areas = [props.Area];max_area_index = find(areas == max(max(areas)));score(i) = areas(max_area_index(1))/(sum(areas)-areas(max_area_index(1)));if score(i) - score(i-1) < 0x = props(max_area_index(1)).Centroid(1);y = props(max_area_index(1)).Centroid(2);ar = props(max_area_index(1)).EquivDiameter / 2;break;endi = i+1; endif isempty(x)fprintf(1,'Sorry, no corneal reflection was found in this frame.\n');x = 0;y = 0;ar = 0;return; endx = x+sx-1; y = y+sy-1;
總結
以上是生活随笔為你收集整理的人眼中亮斑的检测、定位和去除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么求人眼图像中的噪声
- 下一篇: matlab读取/播放视频的函数(1)