人眼中亮斑的检测、定位和去除(2)
生活随笔
收集整理的這篇文章主要介紹了
人眼中亮斑的检测、定位和去除(2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一章中,運用matlab得到的亮斑半徑只是一個大概的值,
這里介紹一種可以精確得到亮斑半徑的方法,,,,高斯方法:
在這里我們假設亮斑的強度平面是服從symmetric bivariate Gaussian distribution(對稱二元高斯分布),如果我們找到一個半徑,在這個半徑時,這時亮斑的強度下降的最大,我們這時認為這個半徑時亮斑的半徑,,問題怎么求這個半徑???
這里我們可以想象,因為亮斑近似與圓,我們這里主要是要這個圓的半徑,我們這樣假設。如果在跟以半徑為r+!的圓上的像素值總和,而半徑為r-1(以像素為單位的)的圓上的像素值總和,如果這兩個值得比率大于98%,我們認為不是亮斑的半徑,如果r變化到這個比率的值小于98%,我們取這個r為亮斑的半徑。
這就是這個函數,,目的取合適的半徑使這個函數小于98%,
這樣就可以得到亮斑的半徑。。
目的就是找到這個函數的最小值:
具體代碼:
% Input: % I = input image % [crx, cry] = location of the corneal reflection center % crar = approximate radius of the corneal reflection % angle_delta = angle step size % % Output: % r = optimized corneal reflection radiusr=[];if crx==0 | cry==0 | crar==0return; endr = fminsearch(@(r) circular_error(r, I, angle_delta, crx, cry), crar);if r <= 0fprintf(1, 'Error! the radius of corneal reflection is 0\n');return; endfunction f = circular_error(r, I, angle_delta, crx, cry) [height width] = size(I); r_delta = 1; f = 0; Isum = 0; Isum2 = 0.000001; m = [0:angle_delta:(2*pi)]; cos_m = cos(m); sin_m = sin(m); for i = 1:size(m,2),x = crx + (r+r_delta) * cos_m(i); %r+1半徑上的X的坐標值y = cry + (r+r_delta) * sin_m(i); %r+1半徑上的Y的坐標值x2 = crx + (r-r_delta) * cos_m(i); %r-1半徑上的X的坐標值y2 = cry + (r-r_delta) * sin_m(i); %r-1半徑上的X的坐標值if (x > 0 & y > 0 & x < width & y < height) & (x2 > 0 & y2 > 0 & x2 < width & y2 < height)Isum = Isum + double(I(ceil(y),ceil(x))); %在r+1半徑上的像素值總和Isum2 = Isum2 + double(I(ceil(y2),ceil(x2))); %在r-1半徑上的像素值總和end end f = (Isum / Isum2); %兩個半徑的比率
總結
以上是生活随笔為你收集整理的人眼中亮斑的检测、定位和去除(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB-fminsearch函数的
- 下一篇: cart2pol函数