matlab练习程序(Harris角点检测)

合集下载

matlab中的detectharrisfeatures -回复

matlab中的detectharrisfeatures -回复

matlab中的detectharrisfeatures -回复Matlab中的detectHarrisFeatures函数是一个用于检测Harris角点的特征点的函数。

在本文中,我们将一步一步回答与这个函数相关的问题,并详细讨论其工作原理和用法,包括输入参数、输出参数以及一些示例代码。

Harris角点检测方法是由Chris Harris和Mike Stephens在1988年提出的,它是一种用于在图像中检测兴趣点的算法。

这个算法主要用于计算图像局部区域的强度变化,以及这些变化的方向,并根据这些信息确定特征点。

首先,让我们了解一下detectHarrisFeatures函数的基本用法和语法。

在Matlab中,您可以使用以下语法调用这个函数:points = detectHarrisFeatures(img)这个函数采用一个图像作为输入,并返回一个包含检测到的Harris角点的一个对象数组。

可以使用这个点数组进行进一步的处理和分析。

在这里,'img'是要进行Harris角点检测的输入图像。

这可以是一个灰度图像或一个彩色图像。

函数将自动将彩色图像转换为灰度图像进行处理。

现在,让我们深入了解detectHarrisFeatures函数的工作原理和各个参数的作用。

Harris角点检测方法是通过对图像进行局部窗口内的像素灰度值计算来实现的。

通过在每个像素位置使用一个小的窗口,该方法计算出一个称为Harris矩阵的矩阵。

Harris矩阵包含了图像局部区域中的灰度值变化情况。

根据Harris矩阵的特征值,可以确定图像中的角点。

Harris矩阵的计算基于以下公式:H = [A B; B C]其中A、B和C是通过计算图像灰度值在局部窗口内的x和y方向上的梯度的平方和的积分。

detectHarrisFeatures函数具有几个参数,这些参数可以根据需要进行设置。

以下是这些参数的详细说明:1. 'FilterSize'参数:这个参数用来指定局部窗口的大小。

Harris,Shi-Tomasi角点检测与亚像素角点检测笔记

Harris,Shi-Tomasi角点检测与亚像素角点检测笔记

Harris,Shi-Tomasi⾓点检测与亚像素⾓点检测笔记⾓点检测1. ⾓点可以是两个边缘的⾓点;2. ⾓点是邻域内具有两个主⽅向的特征点;⽬录基本思想在各个⽅向上移动窗⼝,若灰度均发⽣了较⼤的变化,那么就认为在窗⼝内遇到了⾓点。

(图3)如果窗⼝在图像各个⽅向上移动时,窗⼝内图像的灰度没有发⽣变化,那么窗⼝内就不存在⾓点。

(图1)如果窗⼝在某⼀个⽅向移动时,窗⼝内图像的灰度发⽣了较⼤的变化,⽽在另⼀些⽅向上没有发⽣变化,那么,窗⼝内的图像可能就是⼀条直线的线段。

(图2)Harris数学模型上⾯的⾃相关函数\(c(x,y;\Delta x,\Delta y)\)表⽰窗⼝W平移\((\Delta x,\Delta y)\)后产⽣的灰度变化。

若对于任何\((\Delta x,\Delta y)\),⾃相关函数c的值均较⼤,则说明该窗⼝内存在⾓点。

上⾯的M矩阵为x,y⽅向的梯度变化。

注意:此时还不能说M为梯度变化协⽅差矩阵,A,B,C不是⽅差和协⽅差。

因此需要进⾏均值化处理:将各维随机变量(这⾥为\ (I_x,I_y\)两维)减去其均值,使处理后的随机变量的均值为0。

接下来就可以进⾏主成分分析。

假设下⾯的\((I_x,I_y)\)已经进⾏过均值化处理,则此时M即为梯度分布协⽅差矩阵。

针对平坦区域,边缘区域以及⾓点区域三种情形的梯度分布\((I_x,I_y)\)进⾏分析:显然:平坦区域的\((I_x,I_y)\)分布在原点附近,相应的其⾃相关函数c在\((\Delta x,\Delta y)\)相同时较⼩。

边缘区域的\((I_x,I_y)\)在某⼀个⽅向上较为分散,按照PCA来理解应该只有⼀个主⽅向。

⾓点区域的\((I_x,I_y)\)在x,y两个⽅向上分布均较为分散。

对协⽅差矩阵M进⾏对⾓化,则特征值即为主⽅向上的⽅差,对应的特征向量即为主⽅向(详见PCA原理)。

得出结论:特征值都⽐较⼤时,即窗⼝中含有⾓点特征值⼀个较⼤,⼀个较⼩,窗⼝中含有边缘特征值都⽐较⼩,窗⼝处在平坦区域在实际判断⾓点时,⽆需计算矩阵M的特征值,使⽤下式近似计算⾓点响应值:\[R=detM - \alpha (traceM)^2 \\ detM = \lambda_1\lambda_2 = AB-C^2 \\ traceM = \lambda_1 + \lambda_2 = A+B \] \(\alpha\)为⼀常数,通常取0.04~0.06.使⽤matlab绘制响应值函数图像如下:则可以发现,该函数图像刚好满⾜协⽅差矩阵M特征值与⾓点的关系:MATLAB代码如下:x = linspace(0,10);y = linspace(0,10);[X,Y] = meshgrid(x,y);Z = X.*Y - 0.05*(X+Y).^2;contour(X,Y,Z,'ShowText','on');xlabel("\lambda_1");ylabel("\lambda_2");算法实现性质1. 参数α对⾓点检测的影响:增⼤α的值,将减⼩⾓点响应值R,减少被检测⾓点的数量;减⼩α的值,将增⼤⾓点响应值R,增加被检测⾓点的数量。

基于Harris原理的亚像素角点坐标检测Matlab程序

基于Harris原理的亚像素角点坐标检测Matlab程序

基于Harris原理的亚像素角点坐标检测Matlab程序★注意:直接运行click_calib .m文件即可获得亚像素级角点坐标,附录Ⅱ中的其它函数文件均会被click_calib .m文件调用。

click_calib .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 测量亚像素角点坐标的主函数var2fix = 'dX_default';fixvariable; % 调用fixvariable.m文件,修正变量var2fix = 'dY_default';fixvariable;var2fix = 'map';fixvariable;if ~exist('n_ima'),data_calib; % 调用data_calib.m文件,输入图像名和格式,%检查文件中的图像并读取标定图像信息end;check_active_images; % 调用check_active_images.m文件,检查是%否已读取到标定图像if ~exist(['I_' num2str(ind_active(1))]),ima_read_calib;if isempty(ind_read),disp('Cannot extract corners without images');return;end;end;fprintf(1,'\nExtraction of the grid corners on the images\n');if (exist('map')~=1), map = gray(256);end;if exist('dX'),dX_default = dX;end;if exist('dY'),dY_default = dY;end;if exist('n_sq_x'),n_sq_x_default = n_sq_x;end;if exist('n_sq_y'),n_sq_y_default = n_sq_y;end;if ~exist('dX_default')|~exist('dY_default');dX_default = 30;dY_default = 30; % 设靶标平面X和Y方向上方格的默认距离%为30mmend;if ~exist('n_sq_x_default')|~exist('n_sq_y_default'),n_sq_x_default = 10;n_sq_y_default = 10; % 设在靶标平面的x和y方向上提取的角点%数的默认值均为10end;if ~exist('wintx_default')|~exist('winty_default'),wintx_default = max(round(nx/128),round(ny/96));winty_default = wintx_default;clear wintx wintyend;if ~exist('wintx') | ~exist('winty'),clear_windows; % 调用clear_windows.m文件,清除窗口end;if ~exist('dont_ask'),dont_ask = 0;end;if ~dont_ask,ima_numbers = input('Number(s) of image(s) to process ([] = all images) = '); elseima_numbers = [];end;if isempty(ima_numbers),ima_proc = 1:n_ima;elseima_proc = ima_numbers;end;kk_first = ima_proc(1); % 输入('Start image number ([]=1=first): '); if exist(['wintx_' num2str(kk_first)]),eval(['wintxkk = wintx_' num2str(kk_first) ';']);if isempty(wintxkk) | isnan(wintxkk),disp('Window size for corner finder (wintx and winty):');wintx = input(['wintx ([] = ' num2str(wintx_default) ') = ']);if isempty(wintx), wintx = wintx_default; end;wintx = round(wintx);winty = input(['winty ([] = ' num2str(winty_default) ') = ']);if isempty(winty), winty = winty_default; end;winty = round(winty);fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1);end;elsedisp('Window size for corner finder (wintx and winty):');wintx = input(['wintx ([] = ' num2str(wintx_default) ') = ']);if isempty(wintx), wintx = wintx_default; end;wintx = round(wintx);winty = input(['winty ([] = ' num2str(winty_default) ') = ']);if isempty(winty), winty = winty_default; end;winty = round(winty);fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1);end;if ~dont_ask,fprintf(1,'Do you want to use the automatic square counting mechanism(0=[]=default)\n');manual_squares = input(' or do you always want to enter the number of squares manually (1,other)? ');if isempty(manual_squares),manual_squares = 0;elsemanual_squares = ~~manual_squares;end;elsemanual_squares = 0;end;for kk = ima_proc,if exist(['I_' num2str(kk)]),click_ima_calib; % 调用click_ima_calib.m文件,点击图像边%界的4个顶点,从而划出边线active_images(kk) = 1;elseeval(['dX_' num2str(kk) ' = NaN;']);eval(['dY_' num2str(kk) ' = NaN;']);eval(['wintx_' num2str(kk) ' = NaN;']);eval(['winty_' num2str(kk) ' = NaN;']);eval(['x_' num2str(kk) ' = NaN*ones(2,1);']);eval(['X_' num2str(kk) ' = NaN*ones(3,1);']);eval(['n_sq_x_' num2str(kk) ' = NaN;']);eval(['n_sq_y_' num2str(kk) ' = NaN;']);end;end;check_active_images;for kk = 1:n_ima,if ~exist(['x_' num2str(kk)]),eval(['dX_' num2str(kk) ' = NaN;']);eval(['dY_' num2str(kk) ' = NaN;']);eval(['x_' num2str(kk) ' = NaN*ones(2,1);']);eval(['X_' num2str(kk) ' = NaN*ones(3,1);']);eval(['n_sq_x_' num2str(kk) ' = NaN;']);eval(['n_sq_y_' num2str(kk) ' = NaN;']);end;if ~exist(['wintx_' num2str(kk)]) | ~exist(['winty_' num2str(kk)]),eval(['wintx_' num2str(kk) ' = NaN;']);eval(['winty_' num2str(kk) ' = NaN;']);end;end;string_save = 'save calib_data active_images ind_active wintx winty n_imatype_numbering N_slots first_num image_numbers format_image calib_name Hcal Wcal nx ny map dX_default dY_default dX dY wintx_default winty_default';for kk = 1:n_ima,string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' n_sq_x_'num2str(kk) ' n_sq_y_' num2str(kk) ' wintx_' num2str(kk) ' winty_' num2str(kk) ' dX_' num2str(kk) ' dY_' num2str(kk)];end;eval(string_save);disp('done');for lamp = 1:Nima_validdog1=['x_' num2str(lamp)];name1=['x' num2str(lamp) '.txt'];save( name1,dog1,'-ascii');dog2=['X_' num2str(lamp)];name2=['M' num2str(lamp) '.txt'];save( name2,dog2,'-ascii');endreturn; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fixvariable .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 修正变量if exist('var2fix')==1,if eval(['exist(''' var2fix ''') == 1']),if eval(['isempty(' var2fix ')']),eval(['clear ' var2fix ]);elseif eval(['~isstruct(' var2fix ')']),if eval(['~iscell(' var2fix ')']),if eval(['isnan(' var2fix '(1))']),eval(['clear ' var2fix ]);end;end;end;end;end;end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%data_calib .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 人工输入图像基名和格式,寻找、读取并显示出所有标定图像l_ras = dir('*ras');s_ras = size(l_ras,1);l_bmp = dir('*bmp');s_bmp = size(l_bmp,1);l_tif = dir('*tif');s_tif = size(l_tif,1);l_pgm = dir('*pgm');s_pgm = size(l_pgm,1);l_ppm = dir('*ppm');s_ppm = size(l_ppm,1);l_jpg = dir('*jpg');s_jpg = size(l_jpg,1);s_tot = s_ras + s_bmp + s_tif + s_pgm + s_jpg + s_ppm;if s_tot < 1,fprintf(1,'No image in this directory in either ras, bmp, tif, pgm, ppm or jpg format. Change directory and try again.\n');break;end;dir;Nima_valid = 0;while (Nima_valid==0),fprintf(1,'\n');calib_name = input('Basename camera calibration images (without number nor suffix): ','s'); % 输入图像基名format_image = '0';while format_image == '0',format_image = input('Image format: ([]=''r''=''ras'', ''b''=''bmp'', ''t''=''tif'',''p''=''pgm'', ''j''=''jpg'', ''m''=''ppm'') ','s'); % 输入图像格式if isempty(format_image),format_image = 'ras';end;if lower(format_image(1)) == 'm',format_image = 'ppm';elseif lower(format_image(1)) == 'b',format_image = 'bmp';elseif lower(format_image(1)) == 't',format_image = 'tif';elseif lower(format_image(1)) == 'p',format_image = 'pgm';elseif lower(format_image(1)) == 'j',format_image = 'jpg';elseif lower(format_image(1)) == 'r',format_image = 'ras';elsedisp('Invalid image format');format_image = '0'; % Ask for format once againend;end;end;end;end;end;end;check_directory; % 调用check_directory .m文件,按图像基名%和格式检查文件中的图像end;if (Nima_valid~=0),ima_read_calib; % 调用ima_read_calib .m文件,读取图像if ~isempty(ind_read),mosaic; % 调用mosaic .m文件,显示所有的标定图像end;end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%check_directory .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 检查文件中是否存在标定图像l = dir([calib_name '*']);% 返回含calib_name的所有文件信息的一个结构数组n*1 Nl = size(l,1); % Nl为图像的幅数Nima_valid = 0;ind_valid = [];loc_extension = [];length_name = size(calib_name,2); % calib_name的长度if Nl > 0,for pp = 1:Nl,filenamepp = l(pp).name; %第pp幅图像的名字if isempty(calib_name),iii = 1;elseiii = findstr(filenamepp,calib_name);end;loc_ext = findstr(filenamepp,format_image);string_num = filenamepp(length_name+1:loc_ext - 2);if isempty(str2num(string_num)),iii = [];end;if ~isempty(iii), %如果iii非空if (iii(1) ~= 1), %又如果iii(1) != 1,则将iii置空iii = [];end;end;if ~isempty(iii) & ~isempty(loc_ext),Nima_valid = Nima_valid + 1;ind_valid = [ind_valid pp]; %第几个文件的下标是正确的loc_extension = [loc_extension loc_ext(1)];end;end;if (Nima_valid==0),format_image = upper(format_image);for pp = 1:Nl,filenamepp = l(pp).name;if isempty(calib_name),iii = 1;elseiii = findstr(filenamepp,calib_name);end;loc_ext = findstr(filenamepp,format_image);string_num = filenamepp(length_name+1:loc_ext - 2);if isempty(str2num(string_num)),iii = [];end;if ~isempty(iii),if (iii(1) ~= 1),iii = [];end;end;if ~isempty(iii) & ~isempty(loc_ext),Nima_valid = Nima_valid + 1;ind_valid = [ind_valid pp];loc_extension = [loc_extension loc_ext(1)];end;end;if (Nima_valid==0),fprintf(1,'No image found. File format may be wrong.\n');elsestring_length = zeros(1,Nima_valid);indices = zeros(1,Nima_valid);for ppp = 1:Nima_valid,name = l(ind_valid(ppp)).name;string_num = name(length_name+1:loc_extension(ppp) - 2);string_length(ppp) = size(string_num,2);%数字的长度indices(ppp) = str2num(string_num);%数字的大小--下标的顺序end;first_num = min(indices);n_ima = max(indices) - first_num + 1;if min(string_length) == max(string_length),N_slots = min(string_length);type_numbering = 1;elseN_slots = 1;type_numbering = 0;end;image_numbers = first_num:n_ima-1+first_num;active_images = ones(1,n_ima);end;elsestring_length = zeros(1,Nima_valid);indices = zeros(1,Nima_valid);for ppp = 1:Nima_valid,name = l(ind_valid(ppp)).name;string_num = name(length_name+1:loc_extension(ppp) - 2);string_length(ppp) = size(string_num,2);indices(ppp) = str2num(string_num);end;first_num = min(indices);n_ima = max(indices) - first_num + 1;if min(string_length) == max(string_length),N_slots = min(string_length);type_numbering = 1;N_slots = 1;type_numbering = 0;end;image_numbers = first_num:n_ima-1+first_num;active_images = ones(1,n_ima);end;elsefprintf(1,'No image found. Basename may be wrong.\n');end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ima_read_calib .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 读取标定图像if ~exist('calib_name')|~exist('format_image'),data_calib;return;end;check_directory;if ~exist('n_ima'),data_calib;return;end;check_active_images; % 调用check_active_images .m文件,检查有效的标定图像images_read = active_images;if exist('image_numbers'),first_num = image_numbers(1);end;if ~exist('first_num'),first_num = image_numbers(1); %第一副图像的数字end;image_numbers = first_num:n_ima-1+first_num;no_image_file = 0;i = 1;while (i <= n_ima), % & (~no_image_file),if active_images(i),if ~type_numbering,number_ext = num2str(image_numbers(i));elsenumber_ext = sprintf(['%.' num2str(N_slots) 'd'],image_numbers(i));end;ima_name = [calib_name number_ext '.' format_image];if i == ind_active(1),fprintf(1,'Loading image ');if exist(ima_name),fprintf(1,'%d...',i);if format_image(1) == 'p',if format_image(2) == 'p',Ii = double(loadppm(ima_name));elseIi = double(loadpgm(ima_name));end;elseif format_image(1) == 'r',Ii = readras(ima_name);elseIi = double(imread(ima_name));end;end;if size(Ii,3)>1,Ii = 0.299 * Ii(:,:,1) + 0.5870 * Ii(:,:,2) + 0.114 * Ii(:,:,3);end;eval(['I_' num2str(i) ' = Ii;']);elseimages_read(i) = 0; %如果ima_name不存在,则设images_read(i)=0;end;end;i = i+1;end;ind_read = find(images_read);if isempty(ind_read),fprintf(1,'\nWARNING! No image were read\n');no_image_file = 1;elseif no_image_file,end;fprintf(1,'\n');if size(I_1,1)~=480,small_calib_image = 1;elsesmall_calib_image = 0;end;[Hcal,Wcal] = size(I_1); % size of the calibration image[ny,nx] = size(I_1); %ny为行数,nx为列数clickname = [];map = gray(256);disp('done');end;if ~(exist('map')==1), map = gray(256); end;active_images = images_read; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Mosaic .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 显示所有查找到的标定图像if ~exist('I_1'),active_images_save = active_images;ima_read_calib;active_images = active_images_save;check_active_images;end;check_active_images;if isempty(ind_read),return;end;n_col = floor(sqrt(n_ima*nx/ny));n_row = ceil(n_ima / n_col);ker2 = 1;for ii = 1:n_col,ker2 = conv(ker2,[1/4 1/2 1/4]);%与[1/4,1/2,1/4]卷积n_col次end;II = I_1(1:n_col:end,1:n_col:end);[ny2,nx2] = size(II);kk_c = 1;II_mosaic = [];for jj = 1:n_row,II_row = [];for ii = 1:n_col,if (exist(['I_' num2str(kk_c)])) & (kk_c <= n_ima),if active_images(kk_c),eval(['I = I_' num2str(kk_c) ';']);I = I(1:n_col:end,1:n_col:end);elseI = zeros(ny2,nx2);end;elseI = zeros(ny2,nx2);end;II_row = [II_row I];if ii ~= n_col,II_row = [II_row zeros(ny2,3)];end;kk_c = kk_c + 1;end;nn2 = size(II_row,2);if jj ~= n_row,II_row = [II_row; zeros(3,nn2)];end;II_mosaic = [II_mosaic ; II_row];end;figure(2);image(II_mosaic);colormap(gray(256));title('Calibration images');set(gca,'Xtick',[])set(gca,'Ytick',[])axis('image'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%check_active_image .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 检查是否存在有效的标定图像if n_ima ~= 0,if ~exist('active_images'),active_images = ones(1,n_ima);end;n_act = length(active_images);if n_act < n_ima,active_images = [active_images ones(1,n_ima-n_act)];elseif n_act > n_ima,active_images = active_images(1:n_ima);end;end;ind_active = find(active_images);if prod(double(active_images == 0)),disp('Error: There is no active image. Run Add/Suppress images to add images');breakend;if exist('center_optim'),center_optim = double(center_optim);end;if exist('est_alpha'),est_alpha = double(est_alpha);end;if exist('est_dist'),est_dist = double(est_dist);end;if exist('est_fc'),est_fc = double(est_fc);end;if exist('est_aspect_ratio'),est_aspect_ratio = double(est_aspect_ratio);end;end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear_windows .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 清除窗口for kk = 1:n_ima,eval(['clear wintx_' num2str(kk)]);eval(['clear winty_' num2str(kk)]);end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%click_ima_calib .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 用鼠标点击图像的4个边界点进而划出图像的边界线,检测角点的位置、调用ginput3函数求解像素级角点坐标并使其作为初始值再调用cornerfinder函数求解亚像素角点坐标fprintf(1,'\nProcessing image %d...\n',kk);eval(['I = I_' num2str(kk) ';']);if exist(['wintx_' num2str(kk)]),eval(['wintxkk = wintx_' num2str(kk) ';']);if ~isempty(wintxkk) & ~isnan(wintxkk),eval(['wintx = wintx_' num2str(kk) ';']);eval(['winty = winty_' num2str(kk) ';']);end;end;fprintf(1,'Using (wintx,winty)=(%d,%d) - Window size = %dx%d (Note: To reset the window size, run script clearwin)\n',wintx,winty,2*wintx+1,2*winty+1); figure(2);image(I);colormap(map);set(2,'color',[1 1 1]);title(['Click on the four extreme corners of the rectangular pattern (first corner = origin)... Image ' num2str(kk)]);disp('Click on the four extreme corners of the rectangular complete pattern (the firstclicked corner is the origin)...');x= [];y = [];figure(2); hold on;for count = 1:4,[xi,yi] = ginput3(1);[xxi] = cornerfinder([xi;yi],I,winty,wintx);xi = xxi(1);yi = xxi(2);figure(2);plot(xi,yi,'+','color',[ 1.000 0.314 0.510 ],'linewidth',2);plot(xi + [wintx+.5 -(wintx+.5) -(wintx+.5) wintx+.5 wintx+.5],yi + [winty+.5 winty+.5 -(winty+.5) -(winty+.5) winty+.5],'-','color',[ 1.000 0.3140.510 ],'linewidth',2);x = [x;xi];y = [y;yi];plot(x,y,'-','color',[ 1.000 0.314 0.510 ],'linewidth',2);drawnow;end;plot([x;x(1)],[y;y(1)],'-','color',[ 1.000 0.314 0.510 ],'linewidth',2);drawnow;hold off;[Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four cornersx = Xc(1,:)';y = Xc(2,:)';x_mean = mean(x);y_mean = mean(y);x_v = x - x_mean;y_v = y - y_mean;theta = atan2(-y_v,x_v);[junk,ind] = sort(theta);[junk,ind] = sort(mod(theta-theta(1),2*pi));ind = ind([4 3 2 1]); %-> New: the Z axis is pointing uppwardx = x(ind);y = y(ind);x1= x(1); x2 = x(2); x3 = x(3); x4 = x(4);y1= y(1); y2 = y(2); y3 = y(3); y4 = y(4);p_center = cross(cross([x1;y1;1],[x3;y3;1]),cross([x2;y2;1],[x4;y4;1]));x5 = p_center(1)/p_center(3);y5 = p_center(2)/p_center(3);x6 = (x3 + x4)/2;y6 = (y3 + y4)/2;x7 = (x1 + x4)/2;y7 = (y1 + y4)/2;vX = [x6-x5;y6-y5];vX = vX / norm(vX);vY = [x7-x5;y7-y5];vY = vY / norm(vY);vO = [x4 - x5; y4 - y5];vO = vO / norm(vO);delta = 30;figure(2);image(I);colormap(map);hold on;plot([x;x(1)],[y;y(1)],'g-');plot(x,y,'og');hx=text(x6 + delta * vX(1) ,y6 + delta*vX(2),'X');set(hx,'color','g','Fontsize',14);hy=text(x7 + delta*vY(1), y7 + delta*vY(2),'Y');set(hy,'color','g','Fontsize',14);hO=text(x4 + delta * vO(1) ,y4 + delta*vO(2),'O','color','g','Fontsize',14);hold off;if manual_squares,n_sq_x = input(['Number of squares along the X direction ([]='num2str(n_sq_x_default) ') = ']);if isempty(n_sq_x), n_sq_x = n_sq_x_default; end;n_sq_y = input(['Number of squares along the Y direction ([]='num2str(n_sq_y_default) ') = ']);if isempty(n_sq_y), n_sq_y = n_sq_y_default; end;elsen_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx);n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx);n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx);n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx);if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2),disp('Could not count the number of squares in the grid. Enter manually.');n_sq_x = input(['Number of squares along the X direction ([]='num2str(n_sq_x_default) ') = ']);if isempty(n_sq_x), n_sq_x = n_sq_x_default; end;n_sq_y = input(['Number of squares along the Y direction ([]='num2str(n_sq_y_default) ') = ']); %6if isempty(n_sq_y), n_sq_y = n_sq_y_default; end;elsen_sq_x = n_sq_x1;n_sq_y = n_sq_y1;end;end;n_sq_x_default = n_sq_x;n_sq_y_default = n_sq_y;if (exist('dX')~=1)|(exist('dY')~=1),dX = input(['Size dX of each square along the X direction ([]='num2str(dX_default) 'mm) = ']);dY = input(['Size dY of each square along the Y direction ([]='num2str(dY_default) 'mm) = ']);if isempty(dX), dX = dX_default; else dX_default = dX; end;if isempty(dY), dY = dY_default; else dY_default = dY; end;elsefprintf(1,['Size of each square along the X direction: dX=' num2str(dX) 'mm\n']);fprintf(1,['Size of each square along the Y direction: dY=' num2str(dY) 'mm (Note: To reset the size of the squares, clear the variables dX and dY)\n']);end;a00 = [x(1);y(1);1];a10 = [x(2);y(2);1];a11 = [x(3);y(3);1];a01 = [x(4);y(4);1];[Homo,Hnorm,inv_Hnorm] = compute_homography([a00 a10 a11 a01],[0 1 1 0;0 0 1 1;1 1 1 1]);x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x;y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y;pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]';XX = Homo*pts;XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:));W = n_sq_x*dX;L = n_sq_y*dY;figure(2);hold on;plot(XX(1,:),XX(2,:),'r+');title('The red crosses should be close to the image corners');hold off;disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,');disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)');quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); quest_distort = ~isempty(quest_distort);if quest_distort,c_g = [size(I,2);size(I,1)]/2 + .5;f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] -c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1);f_g = mean(f_g);script_fit_distortion;end;Np = (n_sq_x+1)*(n_sq_y+1);disp('Corner extraction...');grid_pts = cornerfinder(XX,I,winty,wintx);grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C)ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 cornersind_orig = (n_sq_x+1)*n_sq_y + 1;xorig = grid_pts(1,ind_orig);yorig = grid_pts(2,ind_orig);dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]');dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]');x_box_kk =[grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1 ,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)];y_box_kk =[grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2, :)+(winty+.5);grid_pts(2,:)-(winty+.5)];figure(3);image(I); colormap(map); hold on;plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+');plot(x_box_kk+1,y_box_kk+1,'-b');plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo');plot(xorig+1,yorig+1,'*m');h = text(xorig+delta*vO(1),yorig+delta*vO(2),'O');set(h,'Color','m','FontSize',14);h2 = text(dxpos(1)+delta*vX(1),dxpos(2)+delta*vX(2),'dX');set(h2,'Color','g','FontSize',14);h3 = text(dypos(1)+delta*vY(1),dypos(2)+delta*vY(2),'dY');set(h3,'Color','g','FontSize',14);xlabel('Xc (in camera frame)');ylabel('Yc (in camera frame)');title('Extracted corners');zoom on;drawnow;hold off;Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)';Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)';Zi = zeros(1,Np);Xgrid = [Xi;Yi;Zi];x = grid_pts;X = Xgrid;eval(['dX_' num2str(kk) ' = dX;']);eval(['dY_' num2str(kk) ' = dY;']);eval(['wintx_' num2str(kk) ' = wintx;']);eval(['winty_' num2str(kk) ' = winty;']);eval(['x_' num2str(kk) ' = x;']);eval(['X_' num2str(kk) ' = X;']);eval(['n_sq_x_' num2str(kk) ' = n_sq_x;']);eval(['n_sq_y_' num2str(kk) ' = n_sq_y;']); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ginput3 .m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %ginput3函数实现了计算划出图像的边界线,同时计算出像素级角点坐标function [out1,out2,out3] = ginput2(arg1)P = NaN*ones(16,16);P(1:15,1:15) = 2*ones(15,15);P(2:14,2:14) = ones(13,13);P(3:13,3:13) = NaN*ones(11,11);P(6:10,6:10) = 2*ones(5,5);P(7:9,7:9) = 1*ones(3,3);out1 = []; out2 = []; out3 = []; y = [];c = computer;if ~strcmp(c(1:2),'PC') & ~strcmp(c(1:2),'MA')tp = get(0,'TerminalProtocol');elsetp = 'micro';endif ~strcmp(tp,'none') & ~strcmp(tp,'x') & ~strcmp(tp,'micro'),if nargout == 1,if nargin == 1,eval('out1 = trmginput(arg1);');elseeval('out1 = trmginput;');endelseif nargout == 2 | nargout == 0,if nargin == 1,eval('[out1,out2] = trmginput(arg1);');elseeval('[out1,out2] = trmginput;');endif nargout == 0out1 = [ out1 out2 ];endelseif nargout == 3,if nargin == 1,eval('[out1,out2,out3] = trmginput(arg1);');elseeval('[out1,out2,out3] = trmginput;');endendelsefig = gcf;figure(gcf);if nargin == 0how_many = -1;b = [];elsehow_many = arg1;b = [];if isstr(how_many) ...| size(how_many,1) ~= 1 | size(how_many,2) ~= 1 ...| ~(fix(how_many) == how_many) ...| how_many < 0error('Requires a positive integer.')endif how_many == 0ptr_fig = 0;while(ptr_fig ~= fig)ptr_fig = get(0,'PointerWindow');endscrn_pt = get(0,'PointerLocation');loc = get(fig,'Position');pt = [scrn_pt(1) - loc(1), scrn_pt(2) - loc(2)];out1 = pt(1); y = pt(2);elseif how_many < 0error('Argument must be a positive integer.')endendpointer = get(gcf,'pointer');set(gcf,'Pointer','custom','PointerShapeCData',P,'PointerShapeHotSpot',[8,8]);fig_units = get(fig,'units');char = 0;while how_many ~= 0waserr = 0;eval('keydown = wfbp;', 'waserr = 1;');if(waserr == 1)if(ishandle(fig))set(fig,'pointer',pointer,'units',fig_units);error('Interrupted');elseerror('Interrupted by figure deletion');endendptr_fig = get(0,'CurrentFigure');if(ptr_fig == fig)if keydownchar = get(fig, 'CurrentCharacter');button = abs(get(fig, 'CurrentCharacter'));scrn_pt = get(0, 'PointerLocation');set(fig,'units','pixels')loc = get(fig, 'Position');pt = [scrn_pt(1) - loc(1), scrn_pt(2) - loc(2)];set(fig,'CurrentPoint',pt);elsebutton = get(fig, 'SelectionType');if strcmp(button,'open')button = 1; %b(length(b));elseif strcmp(button,'normal')button = 1;elseif strcmp(button,'extend')button = 2;elseif strcmp(button,'alt')button = 3;elseerror('Invalid mouse selection.')endendpt = get(gca, 'CurrentPoint');how_many = how_many - 1;if(char == 13) % & how_many ~= 0)break;endout1 = [out1;pt(1,1)];y = [y;pt(1,2)];b = [b;button];endendset(fig,'pointer',pointer,'units',fig_units);if nargout > 1out2 = y;if nargout > 2out3 = b;endelse。

哈里斯角检测器算法matlab

哈里斯角检测器算法matlab

哈里斯角检测器是一种在计算机视觉领域常用的算法,用于检测图像中的角点。

它能够通过一定的数学和统计方法,快速准确地找出图像中的角点,是图像处理和特征提取中的重要工具之一。

在本文中,将介绍哈里斯角检测器算法的原理、实现方法以及在MATLAB中的应用。

1. 哈里斯角检测器算法原理哈里斯角检测器算法最初由Chris Harris和Mike Stephens在1988年提出,是一种基于图像灰度变化的特征点检测方法。

其原理是利用图像的局部梯度信息来判断是否存在角点,并通过一定的数学模型对特征点进行筛选和定位。

具体来说,该算法通过计算特征点周围像素点的梯度信息和协方差矩阵,进而得出每个像素点的响应函数值,通过设置一个阈值来判断这个像素点是否为角点。

2. 哈里斯角检测器算法实现方法哈里斯角检测器算法的实现主要包括以下几个步骤:(1) 计算图像梯度:需要计算图像在水平和垂直方向上的梯度,可以使用Sobel算子等方法来实现。

(2) 计算梯度协方差矩阵:接下来,根据图像的梯度信息,计算每个像素点的梯度协方差矩阵。

(3) 计算响应函数值:利用梯度协方差矩阵,计算每个像素点的响应函数值。

(4) 阈值筛选:根据设定的阈值,对响应函数值进行筛选,得到最终的角点。

3. 哈里斯角检测器算法在MATLAB中的应用MATLAB是一种功能强大的数学软件,具有丰富的图像处理和计算机视觉工具包,非常适合进行哈里斯角检测器算法的实现和应用。

在MATLAB中,可以利用内置的函数或者自行编写代码来实现哈里斯角检测器算法,并对图像进行角点的检测和标记,从而实现对图像特征的提取和分析。

哈里斯角检测器算法是一种经典的图像特征点检测方法,在计算机视觉和图像处理领域具有广泛的应用。

通过理解其原理和实现方法,并在MATLAB中进行实际操作,可以更好地掌握该算法的特点和应用技巧,为进一步的图像处理和特征提取工作奠定基础。

接续上文,哈里斯角检测器算法在计算机视觉领域的应用非常广泛,例如在目标跟踪、图像配准、三维重建、立体视觉等领域都有重要作用。

matlab中的detectharrisfeatures -回复

matlab中的detectharrisfeatures -回复

matlab中的detectharrisfeatures -回复Matlab中的detectHarrisFeatures函数是一个用于检测图像中Harris角点的函数。

在本文中,我们将一步一步地回答与这个函数相关的问题,从函数的目的和输入参数到如何使用和优化这个函数。

第一步:了解Harris角点检测算法在解释detectHarrisFeatures函数之前,我们首先需要了解Harris角点检测算法的原理。

Harris角点检测算法是一种用于检测图像中角点的经典算法。

它基于角点的特征,即图像上曲线交叉或曲率变化显著的点。

Harris 角点检测算法使用局部窗口的二阶矩矩阵来计算Harris响应函数,根据阈值筛选出具有较高响应值的像素点作为角点。

第二步:了解detectHarrisFeatures函数的输入参数detectHarrisFeatures函数有多个输入参数,了解这些参数是使用该函数的重要前提。

下面是detectHarrisFeatures函数的常用参数列表:1. I:待检测的图像。

这是唯一一个必需的参数,它指定了我们要对哪个图像进行角点检测。

2. Name-Value参数对:可选参数,用于进一步指定检测的各种设置。

比如,'MinQuality'参数指定了检测到的角点最小质量,'FilterSize'参数指定了输入图像的响应滤波器尺寸,'ROI'参数指定了感兴趣区域等。

第三步:使用detectHarrisFeatures函数进行角点检测使用detectHarrisFeatures函数进行角点检测非常简单。

我们只需要提供待检测的图像作为输入参数,然后函数将返回一个包含检测到的角点位置信息的角点检测结果对象。

下面是一个简单的使用示例:matlabI = imread('image.jpg');corners = detectHarrisFeatures(I);在上面的示例中,我们使用imread函数读取了一张图片,然后将该图片作为输入参数传递给detectHarrisFeatures函数。

harris角点检测实验报告

harris角点检测实验报告

harris角点检测实验报告Harris 角点检测实验报告一、引言二、Harris 角点检测算法原理Harris 角点检测算法的核心思想是基于局部自相关函数。

对于图像中的每个像素点,通过计算其在一定邻域内的灰度变化情况来判断是否为角点。

具体来说,首先对图像进行灰度化处理,然后计算每个像素点的梯度。

接着,构建一个二阶矩矩阵(也称为结构张量),其元素是像素点邻域内梯度的乘积。

通过分析这个二阶矩矩阵的特征值,可以判断该像素点是否为角点。

如果两个特征值都很大,说明在两个方向上灰度变化都很显著,即为角点;如果一个特征值大一个特征值小,说明在一个方向上灰度变化明显,为边缘;如果两个特征值都很小,说明灰度变化不明显,不是角点或边缘。

三、实验环境与准备(一)实验环境本次实验使用的编程语言为Python,使用的图像处理库为OpenCV。

(二)准备工作1、安装所需的 Python 库,如 OpenCV。

2、准备实验所需的图像数据集,包括各种类型的图像,如自然风景、人物、建筑物等。

四、实验步骤(一)图像读取与灰度化使用 OpenCV 的`imread`函数读取图像,并使用`cvtColor`函数将其转换为灰度图像。

```pythonimport cv2image = cv2imread('imagejpg')gray_image = cv2cvtColor(image, cv2COLOR_BGR2GRAY)```(二)计算梯度使用 Sobel 算子计算灰度图像的水平和垂直梯度。

```pythonsobelx = cv2Sobel(gray_image, cv2CV_64F, 1, 0, ksize=3)sobely = cv2Sobel(gray_image, cv2CV_64F, 0, 1, ksize=3)```(三)构建二阶矩矩阵根据梯度计算二阶矩矩阵的元素。

```pythonIxx = sobelx 2Ixy = sobelx sobelyIyy = sobely 2```(四)应用高斯滤波对二阶矩矩阵进行高斯滤波,以减少噪声的影响。

完整版Harris角点检测算法编程步骤及示例演示

完整版Harris角点检测算法编程步骤及示例演示

Harris 角点检测算法编程步骤及示例演示也不说那么多废话了,要介绍啥背景意义之类的,角点检测,顾名思义,就是检测角点,最简单的就是两条线的交点了,还有比如下国际象棋的棋盘格子的交点之类的,反正就是检测这些点。

简单将Harris 角点检测算法的思想说下,就是拿一个小窗在图像中移动,通过考察这个小窗口内图像灰度的平均变换值来确定角点。

1)如果窗口内区域图像的灰度值恒定,那么所有不同方向的偏移几乎不发生变化;2)如果窗口跨越一条边,那么沿着这条边的偏移几乎不发生变化,但是与边垂直的偏移会发生很大的变化;3)如果窗口包含一个孤立的点或者角点,那么所有不同方向的偏移会发生很大的变化。

面给出具体数学推导:设图像窗口平移量为( u,v) ,产生的灰度变化为E(u,v),有E(u,v)二sum[w(x,y)[l(x+u,y+v)-l(x,y)F2棋中w(x,y)为窗口函数, l(x+u,y+v为平移后的灰度值,l(x,y)为平移前的灰度值。

有泰勒公式展开可得:l(x+u,y+v)=l(x,y)+lx*u+ly*v+0(uA2,v八2);lx,ly分别为偏微分,在图像中为图像的方向导数因此E(u,v)=sum[w(x,y) [lx*u+ly*v+O(u八2,v八2)]八2],可以近似得到E(u,v)=sum[w(x,y) [lx*u+ly*v]^2],即E(u,v)二[u,v][lx八2,lx*ly;lx*ly,ly八2][u,v]T令M=[lx八2,lx*ly;lx*ly,ly八2],因此最后对角点的检测成了对矩阵M的特征值的分析了,令M 其特征值为x1,x2;当x1>>x2或者x2>>x1,则检测到的是边缘部分;当x1,x2都很小,图像窗口在所有移动的方向上移动灰度级都无明显变化.当X1,X2都很大时且相当,检测到的是角点。

编程时用x1,x2不方便,因此定义角点响应函数;R二det(M)-k(trace(M))八2;其中det(M)为矩阵M的行列式,trace(M)为矩阵M的迹。

Harris及改进Harris角点检测

Harris及改进Harris角点检测

clear;I= imread('C:\Users\Dell\Documents\MATLAB\叶子.jpg '); % 读取图像N=rgb2gray(I);ori_im=N;% fx = [5 0 -5;8 0 -8;5 0 -5]; % 高斯函数一阶微分,x方向(用于改进的H arris角点提取算法)fx = [-2 -1 0 1 2]; % x方向梯度算子(用于Harris角点提取算法)Ix = filter2(fx,ori_im); % x方向滤波% fy = [5 8 5;0 0 0;-5 -8 -5]; % 高斯函数一阶微分,y方向(用于改进的H arris角点提取算法)fy = [-2;-1;0;1;2]; % y方向梯度算子(用于Harris角点提取算法)Iy = filter2(fy,ori_im); % y方向滤波Ix2 = Ix.^2;Iy2 = Iy.^2;Ixy = Ix.*Iy;clear Ix;clear Iy;h= fspecial('gaussian',[7 7],2); % 产生7*7的高斯窗函数,sigma=2Ix2 = filter2(h,Ix2);Iy2 = filter2(h,Iy2);Ixy = filter2(h,Ixy);height = size(ori_im,1);width = size(ori_im,2);result = zeros(height,width); % 纪录角点位置,角点处值为1R = zeros(height,width);Rmax = 0; % 图像中最大的R值for i = 1:heightfor j = 1:widthM = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; % auto correlation matrixR(i,j) = det(M)-0.06*(trace(M))^2; % 计算RRmax = R(i,j);end;end;end;cnt = 0;for i = 2:height-1for j = 2:width-1% 进行非极大抑制,窗口大小3*3if R(i,j) > 0.01*Rmax && R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j -1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1)result(i,j) = 1;cnt = cnt+1;end;end;end;[posc, posr] = find(result == 1);cnt % 角点个数imshow(ori_im);hold on;plot(posr,posc,'r.');HARRISS改进的clear;I= imread('C:\Users\Dell\Documents\MATLAB\叶子.jpg '); % 读取图像N=rgb2gray(I);ori_im=N;% fx = [5 0 -5;8 0 -8;5 0 -5]; % 高斯函数一阶微分,x方向(用于改进的H arris角点提取算法)fx = [-2 -1 0 1 2]; % x方向梯度算子(用于Harris角点提取算法)Ix = filter2(fx,ori_im); % x方向滤波% fy = [5 8 5;0 0 0;-5 -8 -5]; % 高斯函数一阶微分,y方向(用于改进的H arris角点提取算法)fy = [-2;-1;0;1;2]; % y方向梯度算子(用于Harris角点提取算法)Iy = filter2(fy,ori_im); % y方向滤波Ix2 = Ix.^2;Iy2 = Iy.^2;Ixy = Ix.*Iy;clear Ix;clear Iy;h= fspecial('gaussian',[7 7],2); % 产生7*7的高斯窗函数,sigma=2Ix2 = filter2(h,Ix2);Iy2 = filter2(h,Iy2);Ixy = filter2(h,Ixy);height = size(ori_im,1);width = size(ori_im,2);result = zeros(height,width); % 纪录角点位置,角点处值为1R = zeros(height,width);for i = 1:heightfor j = 1:widthM = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; % auto correlation matri xR(i,j) = det(M)-0.06*(trace(M))^2;end;end;cnt = 0;for i = 2:height-1for j = 2:width-1% 进行非极大抑制,窗口大小3*3if R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) &&R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1) result(i,j) = 1;cnt = cnt+1;end;end;end;Rsort=zeros(cnt,1);[posr, posc] = find(result == 1);for i=1:cntRsort(i)=R(posr(i),posc(i));end;[Rsort,ix]=sort(Rsort,1);Rsort=flipud(Rsort);ix=flipud(ix);ps=100;posr2=zeros(ps,1);posc2=zeros(ps,1);for i=1:psposr2(i)=posr(ix(i));posc2(i)=posc(ix(i));end;imshow(ori_im);hold on;plot(posc2,posr2,'r.');。

计算机视觉实验报告-Harris角点检测

计算机视觉实验报告-Harris角点检测

1实验目的Harris角点检测阅读代码,为代码添加备注,即大致描述每一部分代码分别实现的什么功能SIFT关键点检测及特征匹配调试代码,根据代码进一步掌握算法相关步骤2实验过程2.1Harris角点检测实验图片所用代码import cv2import numpy as npimport matplotlib.pyplot as pltif __name__ == "__main__":# 1. 读取图像文件img = cv2.imread('corner.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)gray = np.float32(gray)# 2. Harris角点检测dst = cv2.cornerHarris(gray, 5, 5, 0.04)dst = cv2.dilate(dst, None) # 膨胀,非极大值抑制thres = 0.01 * dst.max()finalImg = img.copy()finalImg[dst > thres] = [255, 0, 0]imgs = [img, finalImg]titles = ['Raw', 'Corner']for i in range(2):plt.subplot(1, 2, i + 1)plt.imshow(imgs[i], 'gray')plt.title(titles[i])plt.xticks([]), plt.yticks([])# 3. 显示结果plt.show()实验效果代码分析及现象算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

Harris角点检测(含Matlab函数的关键代码)[转载]

Harris角点检测(含Matlab函数的关键代码)[转载]

Harris⾓点检测(含Matlab函数的关键代码)[转载]在上述教程中涉及到了Harris⾓点检测的推导以及各种⾓点检测⽅法的⽐较,⾮常值得⼀看。

这⾥只是简单的整理⼀下,⽤⽩话说明⼀下Harris⾓点检测算法的步骤:1. 计算图像的⽅向导数,分别保存为两个数组Ix以及Iy,这⾥可以使⽤任何⽅法,⽐较正统的是使⽤Gaussian函数,因为在Harris⾓点检测的推导过程中默认是采⽤了Gaussian函数作为其计算图像偏导数的⽅法。

当然使⽤简单的Prewitt或者Sobel算⼦也没有关系。

2. 为每⼀个点计算局部⾃相关矩阵 u(x,y) = [Ix(x,y)^2*W Iy(x,y)Ix(x,y)*W;Ix(x,y)Iy(x,y)*W Iy(x,y)^2*W];这⾥*W代表以x,y为中⼼与⾼斯模板W做卷积,⽽这个模板的⼤⼩则需要你⾃⼰指定。

3. 如果这个u的两个特征值都很⼩,则说明这个区域是个平坦区域。

如果u的某个特征值⼀个⼤⼀个⼩,则是线,如果两个都很⼤,那么就说明这是个⾓点。

Harris提供了另⼀个公式来获取这个点是否是⾓点的⼀个评价:corness = det(u) - k*trace(u)^2;这个corness就代表了⾓点值,其中k是你⾃⼰取的⼀个固定的变量,典型的为[0.04,0.06]之间。

当然在求取了每个点的corness以后,最好再做⼀个极⼤值抑制,这样的效果⽐直接设置⼀个阀值要好。

转⾃:/prleader/archive/2009/02/23/3930571.aspx——————————————————————————————————————Matlab 中 cornermetric 函数的关键代码filter_coef = fspecial('gaussian',[1 5],1.5);w = filter_coef' * filter_coef;% compute gradientsA = imfilter(I,[-1 0 1] ,'replicate','same','conv');B = imfilter(I,[-1 0 1]','replicate','same','conv');A = A(2:end-1,2:end-1);B = B(2:end-1,2:end-1);% compute A, B, and CC = A .* B;A = A .* A;B = B .* B;% filter A, B, and CA = imfilter(A,w,'replicate','full','conv');B = imfilter(B,w,'replicate','full','conv');C = imfilter(C,w,'replicate','full','conv');% clip to image sizeremoved = (numel(filter_coef)-1) / 2 - 1;A = A(removed+1:end-removed,removed+1:end-removed);B = B(removed+1:end-removed,removed+1:end-removed);C = C(removed+1:end-removed,removed+1:end-removed); cornerness = (A .* B) - (C .^ 2) - sensitivity_factor * ( A + B ) .^ 2;。

matlab的角点识别方法

matlab的角点识别方法

matlab的角点识别方法Matlab的角点识别方法引言:角点是图像中特殊的像素点,其在局部区域内表示图像的几何形状边界。

角点识别在计算机视觉和图像处理中起到重要作用,对于图像的分析、对象跟踪和三维重建等有着广泛的应用。

Matlab提供了多种角点检测算法和函数,本文将一步一步介绍这些方法的原理和用法。

第一节: Harris角点检测算法Harris角点检测算法是一种常见的角点检测方法,其基本原理是根据图像的灰度差异计算像素点的角点得分。

在Matlab中,我们可以使用corner函数来实现该算法。

第一步,准备图像:首先我们需要准备一张待分析的图像。

以"image.jpg"为例,使用imread函数载入图像并进行预处理,可以进行归一化、灰度化等操作:I = imread('image.jpg');I = im2double(I);I_gray = rgb2gray(I);第二步,计算特征点得分:使用corner函数计算图像中的角点得分,函数的常用参数包括图像、窗口大小和角点数量的阈值等。

其中,窗口大小决定了局部区域的大小,需要根据具体应用场景进行调整。

阈值可以控制角点的质量和数量。

corner_points = corner(I_gray, 'SensitivityFactor', 0.04,'QualityLevel', 0.01);第三步,显示检测结果:我们可以使用imshow函数将原始图像和标记出的角点显示出来,以便观察检测效果。

imshow(I);hold on;plot(corner_points(:,1), corner_points(:,2), 'r*');hold off;第二节: Shi-Tomasi角点检测算法Shi-Tomasi角点检测算法是对Harris算法的改进,该算法通过优化得分函数来提高角点检测的效果。

matlab的角点识别方法 -回复

matlab的角点识别方法 -回复

matlab的角点识别方法-回复Matlab的角点识别方法摘要:角点是图像中特殊的像素点,通常位于边缘的转折处。

角点在计算机视觉和图像处理中起着重要的作用,常被用于目标跟踪、图像配准、三维重建等应用。

在本文中,我们将探讨一些常见的基于Matlab的角点识别方法。

引言:角点识别是图像处理领域中的一个重要问题,对于计算机视觉和图像处理任务具有很大的价值。

角点的识别可以帮助我们定位图像中的关键特征点,以便进行后续的图像分析和处理。

在Matlab中,有许多用于角点识别的函数和工具箱,我们将在本文中介绍其中一些常用的方法。

一、Harris角点检测算法Harris角点检测算法是由Chris Harris和Mike Stephens在1988年提出的,是一种广泛使用的角点检测算法。

该算法通过计算图像的灰度梯度和结构矩阵,来检测图像中的角点。

1. 计算图像的灰度梯度:第一步是计算图像的灰度梯度,可以使用Matlab中的函数'imgradient'来实现。

该函数可以计算图像在x和y方向上的梯度。

2. 计算结构矩阵:灰度梯度计算完成后,接下来需要计算结构矩阵,可以使用Matlab中的函数'imgradientxy'来实现。

该函数可以计算图像在x和y方向上的梯度,并通过计算梯度的乘积来获得结构矩阵。

3. 计算角点响应函数:使用上一步中计算得到的结构矩阵,可以计算每个像素处的角点响应函数。

角点响应函数可用于判断某个像素点是否为角点。

角点响应函数的计算公式如下:R = det(M) - k * trace(M)^2其中M为结构矩阵,det(M)为其行列式,trace(M)为其迹,k为常数。

4. 提取角点:最后一步是根据计算得到的角点响应函数,通过设定一个阈值,提取出图像中的角点。

可以使用Matlab中的函数'imregionalmax'来寻找局部最大值,并将它们作为图像中的角点。

matlabharris角点检测函数

matlabharris角点检测函数

matlabharris角点检测函数Matlab中的harris角点检测函数Harris角点检测算法是计算机视觉领域中非常重要的算法之一。

它能够在图像中自动检测出具有较高对比度变化和明显边缘的角点,从而在很多应用中发挥重要作用,例如图像配准、目标跟踪和三维重建等。

在Matlab 中,我们可以使用内置的harris角点检测函数来实现这一功能。

本文将详细介绍harris角点检测函数的使用方法。

Harris角点检测函数在Matlab中的函数原型如下:H = corner(I)其中,I代表输入的待检测图像,H是一个包含了检测到的角点坐标和相应响应值的二维矩阵。

下面我们一步一步来介绍如何使用这个函数进行角点检测。

第一步:导入图像并转换为灰度图像首先,我们需要导入一个待检测的图像。

假设我们要检测的图像叫做"image.jpg",我们可以使用imread函数来读取这个图像,并将其转换为灰度图像。

灰度图像对于角点检测来说更加合适,因为它只包含了亮度信息,而不包含颜色信息。

以下是导入和转换的代码:I = imread('image.jpg');Igray = rgb2gray(I);在这里,我们使用了imread函数来读取图像,并且使用rgb2gray函数将读取到的RGB图像转换为灰度图像。

转换后的图像被存储在一个名为Igray的变量中。

第二步:应用Harris角点检测函数接下来,我们需要将灰度图像输入到Harris角点检测函数中进行处理。

处理后的结果将存储在一个名为H的变量中。

以下是应用角点检测函数的代码:H = corner(Igray);在这里,我们通过调用corner函数并将灰度图像作为参数传入,来实现Harris角点检测。

第三步:可视化和分析检测结果一旦角点检测完成,我们可以通过可视化检测结果来验证算法的效果。

我们可以使用imshow函数来显示原始图像和检测到的角点。

harris角点检测

harris角点检测

课程实验报告2017 - 2018学年第一学期课程名称:计算机视觉及应用实验名称:harris角点检测班级:学生姓名: 学号:实验日期: 2017.12.6 地点:指导教师:成绩评定: 批改日期:实验步骤及方法1.Harris角点检测算法的理论推导:首先建立一个数学模型:当窗口发生移动时,滑动前与滑动后的窗口中的像素点灰度变化用以下方式描述:其中,分别表示平移前后灰度值的变化。

在上式中添加权重,则描述其变化函数为:对进行一阶泰勒展开:因为对变化贡献不大,故忽略此项不计,则上式可写为:将上式平方项展开并写成矩阵形式,即:对于变化函数,其本质为自相关函数,对其进行变换为:令A=,B=,C=,则上式可写为:M是一个实对称阵,则其必定可以相似对角化且存在:,存在一个变换矩阵P,使得,。

求出其特征值及特征向量分别为:和正交,进一步化简:()()=其中,由此看出表征一个椭圆,而矩阵表示对旋转。

画出的等高线L,即:现在我们可以通过和去衡量变化量。

此时有三种情况:①假设不考虑的前提下,只需变化很小的量便可以使得,同理,不考虑的前提下,只需变化很小的量便可以使得,此时便可以说明在某一个方向上的变化很大,也就是说此时检测到的是图像的边缘。

②假设,都很很小,那么,需很大的变化量才可以使得,此时便可以说明在任意方向上的变化不明显,也就是说此时检测到的是图像平坦区域(灰度值变化不大的区域)。

③假设,都很大,那么,只需很小的变化量就可以使得,此时便可以说明在任意方向上的变化剧烈,也就是说此时检测到的是图像角点。

为了衡量这三种变化,找出其特征值与其的对应关系,建立数学表达式:①当R<0,检测到的为图像边缘;②当|R|非常小的时候,检测到的为图像中的平坦区域;③当R>0,检测到的为图像角点。

2.使用qt+opencv编写Harris角点检测程序,具体代码见实验数据;3.使用编写的代码检测一张示例图片的角点。

实验数据OPENCV程序代码:#include <opencv2/opencv.hpp>#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hppusing namespace cv;using namespace std;Mat g_srcImage, g_srcImage1,g_grayImage;实验数据分析及处理示例图片角点检测情况:图一图二图一为示例图像,是最大阈值为160的时候harris的角点检测,其中红色小点即为检测到的角点,图二中是最大阈值为130的时候harris的角点检测,其中红色小点即为检测到的角点实验结果分析通过用示例图片对opencv编写的程序进行测试,发现用Harris角点检测算法可以较为准确的检测出图片中的角点,但图片中也有很多角点未能被识别出来。

Harris角点检测代码

Harris角点检测代码

[filename,pathname,~]=uigetfile('*.jpg','选择JPG格式图片');if ~ischar(filename)returnendstr=[pathname filename];pic=imread(str);if length(size(pic))==3img=rgb2gray(pic);end[m,n]=size(img);tmp=zeros(m+2,n+2);tmp(2:m+1,2:n+1)=img; %扩展图像边缘1个像素Ix=zeros(m+2,n+2);Iy=zeros(m+2,n+2);Ix(:,2:n+1)=tmp(:,3:n+2)-tmp(:,1:n); % x方向上的差分Iy(2:m+1,:)=tmp(3:m+2,:)-tmp(1:m,:); % y方向上的差分Ix2=Ix(2:m+1,2:n+1).^2;Iy2=Iy(2:m+1,2:n+1).^2;Ixy=Ix(2:m+1,2:n+1).*Iy(2:m+1,2:n+1);h=fspecial('gaussian',[7 7],2); %生成高斯滤波器,消弱噪声的影响Ix2=filter2(h,Ix2); %滤波Iy2=filter2(h,Iy2);Ixy=filter2(h,Ixy);R=zeros(m,n);for i=1:mfor j=1:nM=[Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; %构造Hessian矩阵R(i,j)=det(M)-0.06*(trace(M))^2; %角点判定公式endendRmax=max(max(R));loc=[]; %记录角点位置tmp(2:m+1,2:n+1)=R; %扩展图像边缘1个像素for i=2:m+1for j=2:n+1if tmp(i,j)>0.01*Rmax %要求矩阵R中的每个元素值大于0.01倍的最大值sq=tmp(i-1:i+1,j-1:j+1);sq=reshape(sq,1,9);sq=[sq(1:4),sq(6:9)];if tmp(i,j)>sq %局部非极大值抑制loc=[loc;[j-1,i-1]];endendendend%以下代码显示获取的Harris角点X=loc(:,1);Y=loc(:,2);subplot(1,2,1);imshow(pic);subplot(1,2,2);imshow(pic);hold on plot(X,Y,'*');hold off。

Harris角点检测matlab代码

Harris角点检测matlab代码

Harris角点检测代码%%%Prewitt Operator Corner Detection.m%%%时间优化--相邻像素用取差的方法%%clear;for nfigure=1:6t=input('input your figure’s name(including its extern name):','s');% t1 = tic; %测算时间FileInfo = imfinfo(t); % 保存图像的所有信息Image = imread(t); % 读取图像% 转为灰度值图像(Intensity Image)if(strcmp('truecolor',FileInfo.ColorType) == 1) %转为灰度值图像Image = im2uint8(rgb2gray(Image));enddx = [-1 0 1;-1 0 1;-1 0 1]; %dx:横向Prewitt差分模版Ix2 = filter2(dx,Image).^2;Iy2 = filter2(dx',Image).^2;Ixy = filter2(dx,Image).*filter2(dx',Image);%生成9*9高斯窗口。

窗口越大,探测到的角点越少。

h= fspecial('gaussian',9,2);A = filter2(h,Ix2); % 用高斯窗口差分Ix2得到AB = filter2(h,Iy2);C = filter2(h,Ixy);nrow = size(Image,1);ncol = size(Image,2);Corner = zeros(nrow,ncol); %矩阵Corner用来保存候选角点位置,初值全零,值为1的点是角点%真正的角点在137和138行由(row_ave,column_ave)得到%参数t:点(i,j)八邻域的“相似度”参数,只有中心点与邻域其他八个点的像素值之差在%(-t,+t)之间,才确认它们为相似点,相似点不在候选角点之列%我并没有全部检测图像每个点,而是除去了边界上boundary个像素,%因为我们感兴趣的角点并不出现在边界上boundary=8;for i=boundary:nrow-boundary+1for j=boundary:ncol-boundary+1nlike=0; %相似点个数if Image(i-1,j-1)>Image(i,j)-t && Image(i-1,j-1)<Image(i,j)+t nlike=nlike+1;endif Image(i-1,j)>Image(i,j)-t && Image(i-1,j)<Image(i,j)+tnlike=nlike+1;endif Image(i-1,j+1)>Image(i,j)-t && Image(i-1,j+1)<Image(i,j)+t nlike=nlike+1;endif Image(i,j-1)>Image(i,j)-t && Image(i,j-1)<Image(i,j)+tnlike=nlike+1;endif Image(i,j+1)>Image(i,j)-t && Image(i,j+1)<Image(i,j)+t nlike=nlike+1;endif Image(i+1,j-1)>Image(i,j)-t && Image(i+1,j-1)<Image(i,j)+t nlike=nlike+1;endif Image(i+1,j)>Image(i,j)-t && Image(i+1,j)<Image(i,j)+t nlike=nlike+1;endif Image(i+1,j+1)>Image(i,j)-t && Image(i+1,j+1)<Image(i,j)+t nlike=nlike+1;endif nlike>=2 && nlike<=6Corner(i,j)=1;%如果周围有0,1,7,8个相似与中心的(i,j)%那(i,j)就不是角点,所以,直接忽略end;end;CRF = zeros(nrow,ncol); % CRF用来保存角点响应函数值,初值全零CRFmax = 0; % 图像中角点响应函数的最大值,作阈值之用t=0.05;% 计算CRF%工程上常用CRF(i,j) =det(M)/trace(M)计算CRF,那么此时应该将下面第105行的%比例系数t设置大一些,t=0.1对采集的这几幅图像来说是一个比较合理的经验值for i = boundary:nrow-boundary+1for j = boundary:ncol-boundary+1if Corner(i,j)==1 %只关注候选点M = [A(i,j) C(i,j);C(i,j) B(i,j)];CRF(i,j) = det(M)-t*(trace(M))^2;if CRF(i,j) > CRFmaxCRFmax = CRF(i,j);end;endend;end;%CRFmaxcount = 0; % 用来记录角点的个数t=0.01;% 下面通过一个3*3的窗口来判断当前位置是否为角点for i = boundary:nrow-boundary+1for j = boundary:ncol-boundary+1if Corner(i,j)==1 %只关注候选点的八邻域if CRF(i,j) > t*CRFmax && CRF(i,j) >CRF(i-1,j-1) ......&& CRF(i,j) > CRF(i-1,j) && CRF(i,j) > CRF(i-1,j+1) ......&& CRF(i,j) > CRF(i,j-1) && CRF(i,j) > CRF(i,j+1) ......&& CRF(i,j) > CRF(i+1,j-1) && CRF(i,j) > CRF(i+1,j)......&& CRF(i,j) > CRF(i+1,j+1)count=count+1;%这个是角点,count加1else % 如果当前位置(i,j)不是角点,则在Corner(i,j)中删除对该候选角点的记录Corner(i,j) = 0;end;end;end;end;% disp('角点个数');% disp(count)figure,imshow(Image); % display Intensity Imagehold on;% toc(t1)for i=boundary:nrow-boundary+1for j=boundary:ncol-boundary+1column_ave=0;row_ave=0;k=0;if Corner(i,j)==1for x=i-3:i+3 %7*7邻域for y=j-3:j+3if Corner(x,y)==1% 用算数平均数作为角点坐标,如果改用几何平均数求点的平均坐标,对角点的提取意义不大row_ave=row_ave+x;column_ave=column_ave+y;k=k+1;endendendendif k>0 %周围不止一个角点plot( column_ave/k,row_ave/k ,'g.');endend;end;end。

matlab角点检测函数

matlab角点检测函数

matlab角点检测函数Matlab是一种常用的科学计算软件,它提供了丰富的函数库来处理各种图像处理任务。

其中,角点检测是一项重要的图像处理任务,它可以帮助我们找到图像中的角点位置,从而进行特征提取、目标跟踪等应用。

角点检测是计算机视觉领域中的一个基础问题,它的目的是从图像中找出那些具有明显变化的位置。

角点通常是图像中两条边或多条边的交点,它们具有较高的灰度变化和纹理信息。

通过检测角点,我们可以获得图像中的关键特征点,从而进行图像对齐、特征匹配、目标跟踪等任务。

在Matlab中,有多种函数可以用来实现角点检测。

其中最常用的是Harris角点检测算法。

Harris角点检测算法是由Chris Harris和Mike Stephens在1988年提出的,它通过计算图像中每个像素点的角点响应函数来判断该点是否为角点。

角点响应函数的计算公式如下:R = det(M) - k * trace(M)^2其中,M是一个2x2的矩阵,表示图像中某个像素点的局部区域。

det(M)和trace(M)分别表示M的行列式和迹,k是一个常数。

当R的值较大时,表示该点为角点的可能性较高。

在Matlab中,我们可以使用corner函数来实现Harris角点检测算法。

该函数的用法如下:C = corner(I, 'Harris', n);其中,I是输入的图像,'Harris'表示使用Harris角点检测算法,n 是需要检测的角点个数。

函数的返回值C是一个nx2的矩阵,表示检测到的角点的坐标。

除了Harris角点检测算法,Matlab还提供了其他一些角点检测函数,如FAST角点检测算法、ORB角点检测算法等。

这些算法都有各自的特点和适用场景,我们可以根据具体的需求选择合适的算法。

在实际应用中,角点检测常常作为图像处理的预处理步骤,用于提取图像中的关键特征点。

这些特征点可以用来进行图像对齐、特征匹配、目标跟踪等任务。

包含sobel检测子的harris角点检测matlab代码 -回复

包含sobel检测子的harris角点检测matlab代码 -回复

包含sobel检测子的harris角点检测matlab代码-回复如何使用Matlab实现包含Sobel检测子的Harris角点检测算法引言:Harris角点检测算法是计算机视觉领域中常用的特征点检测算法。

它可以在图像中自动检测出具有角点特征的位置,对于图像特征提取、物体识别、图像拼接等任务有广泛的应用。

在本文中,我们将介绍如何使用Matlab 实现Harris角点检测算法,并对其中涉及的Sobel检测子进行解释和实现。

一、Harris角点检测算法简介Harris角点检测算法是由Chris Harris和Mike Stephens在1988年提出的。

它通过计算图像中每个像素点的局部特征,来判断该像素点是否具有角点特征。

Harris角点检测算法的核心思想是利用图像的灰度变化,即图像中局部区域的灰度变化在不同方向上有较大的差异,而平坦区域的灰度变化在各个方向上变化较小。

二、Sobel检测子简介Sobel检测子是一种常用的边缘检测算子,用于检测图像中的边缘。

它通过比较像素点的灰度值来确定边缘的位置。

Sobel检测子是基于梯度的方法,它通过计算图像在两个方向上的灰度梯度来确定边缘的位置。

三、Matlab实现Harris角点检测算法以下是一个简单的Matlab代码示例,用于实现Harris角点检测算法并包含Sobel检测子:matlab读取图像image = imread('lena.jpg');image = rgb2gray(image); 转为灰度图像计算图像梯度dx = double(conv2(image, [1 0 -1; 2 0 -2; 1 0 -1], 'same'));dy = double(conv2(image, [1 2 1; 0 0 0; -1 -2 -1], 'same'));计算梯度矩阵中的元素dx2 = dx .^ 2;dy2 = dy .^ 2;dxdy = dx .* dy;设置窗口大小、滑动窗口步长、极小值阈值windowSize = 3;step = 1;threshold = 1e-6;初始化角点矩阵corners = zeros(size(image));遍历图像中的每个点for i = 1 + windowSize / 2 : step : size(image, 1) - windowSize / 2 for j = 1 + windowSize / 2 : step : size(image, 2) - windowSize / 2计算窗口中的梯度矩阵dx2_sum = sum(sum(dx2(i - windowSize / 2 : i + windowSize / 2, j - windowSize / 2 : j + windowSize / 2)));dy2_sum = sum(sum(dy2(i - windowSize / 2 : i + windowSize / 2, j - windowSize / 2 : j + windowSize / 2)));dxdy_sum = sum(sum(dxdy(i - windowSize / 2 : i + windowSize / 2, j - windowSize / 2 : j + windowSize / 2)));计算角点响应函数R = (dx2_sum * dy2_sum - dxdy_sum ^ 2) - 0.04 * (dx2_sum + dy2_sum) ^ 2;根据阈值判断是否是角点if R > thresholdcorners(i, j) = R;endendend显示检测结果imshow(image);hold on;[x, y] = find(corners > threshold);plot(y, x, 'r*');hold off;在以上代码中,我们首先读取一张图像,并将其转换为灰度图像。

基于MatlabGUI的Harris角点检测程序

基于MatlabGUI的Harris角点检测程序

基于MatlabGUI的Harris角点检测程序作 者: Bugzhao Mailto: bugzhao@ QQ:88576613 发表时间: 2005-2-17内容概要: 我写的一个使用matlab制作的角点检测程序图片支持格式:jpg、bmp、tif等格式的灰度、彩色图片 目前仅实现了harris检测器最终将实现四种角点检测算法包括经典的harris、基于canny边缘检测和弧度、基于多分辨率、基于SUSAN本文分三部分第一部分简要介绍图像处理理论中的角点检测第二部分介绍matlab GUI编程第三部分介绍本程序的完整实现Part(1)角点检测(corner detection/extration)经常被用于作为特征提取的第一步。

比如在制作一个全景图拼接程序中,我们可以首先检测邻接图片的角点,然后在这些角点中进行适当选择排除,最终形成两幅图片的特征点对。

接下来可以根据这些特征点对来计算邻接图片的变换矩阵(一般使用仿射变换来近似投影变换),最终经图像融合技术就可以得到全景图。

角点检测大体有两种思路,一种是直接基于灰度,另一种是先检测边缘,然后计算弧度的局部极大值得到角点。

后者对噪声有较好的抗干扰性能。

本课题中首先来实现harris角点检测算法首先来看最为经典的Moravec算法。

算法思路是计算图像灰度在任意方向上的变化,使用一个移动窗口,在像素点的4个方向进行移动,然后求最小E值的局部最大值。

在均匀灰度中,E值在各个方向都很小;在边缘处,最小值依赖于边缘的方向,可以想像E值变化有大有小;而在角点处,每个方向的E值变化都较大。

所以检测4个方向中E值变化最小的那个量,如果它仍大于某一给定阈值,即可认为此点为角点。

这就是Moravec算法的思路。

以上公式即为E值计算公式。

W为窗口,I为像素。

Moravec算法的思想可以直观的理解。

Harris在此算法的基础之上进行了改进,他利用泰勒级数展开方法将移动方向进行了扩展使之不再局限,同时引入了一种平滑因子,增强了抗干扰能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档