尺度不变的额特征提取代码

尺度不变的额特征提取代码
尺度不变的额特征提取代码

function [ pos, scale, orient, desc ] = SIFT( im, octaves, intervals, object_mask, contrast_threshold, curvature_threshold, interactive )

% 功能:提取灰度图像的尺度不变特征(SIFT特征)

% 输入:

% im - 灰度图像,该图像的灰度值在0到1之间(注意:应首先对输入图像的灰度值进行归一化处理)

% octaves - 金字塔的组数:octaves (默认值为4).

% intervals - 该输入参数决定每组金字塔的层数(默认值为2).

% object_mask - 确定图像中尺度不变特征点的搜索区域,如果没有特别指出,则算法将搜索整个图像

% contrast_threshold - 对比度阈值(默认值为0.03).

% curvature_threshold - 曲率阈值(默认值为10.0).

% interactive - 函数运行显示标志,将其设定为1,则显示算法运行时间和过程的相关信息;% 如果将其设定为2,则仅显示最终运行记过(default = 1).

% 输出:

% pos - Nx2 矩阵,每一行包括尺度不变特征点的坐标(x,y)

% scale - Nx3 矩阵,每一行包括尺度不变特征点的尺度信息(第一列是尺度不变特征点所在的组,

% 第二列是其所在的层, 第三列是尺度不变特征点的sigma).

% orient - Nx1 向量,每个元素是特征点的主方向,其范围在[-pi,pi)之间.

% desc - Nx128 矩阵,每一行包含特征点的特征向量.

% 参考文献:

% [1] David G. Lowe, "Distinctive Image Features from Sacle-Invariant Keypoints",

% accepted for publicatoin in the International Journal of Computer

% Vision, 2004.

% [2] David G. Lowe, "Object Recognition from Local Scale-Invariant Features",

% Proc. of the International Conference on Computer Vision, Corfu,

% September 1999.

%

% Xiaochuan ZHAO;zhaoxch@https://www.360docs.net/doc/9012616438.html,

% 设定输入量的默认值

if ~exist('octaves')

octaves = 4;

end

if ~exist('intervals')

intervals = 2;

end

if ~exist('object_mask')

object_mask = ones(size(im));

end

if size(object_mask) ~= size(im)

object_mask = ones(size(im));

end

if ~exist('contrast_threshold')

contrast_threshold = 0.02; %0.03吧

end

if ~exist('curvature_threshold')

curvature_threshold = 10.0;

end

if ~exist('interactive')

interactive = 1;

end

% 检验输入灰度图像的像素灰度值是否已归一化到[0,1]

if( (min(im(:)) < 0) | (max(im(:)) > 1) )

fprintf( 2, 'Warning: image not normalized to [0,1].\n' );

end

% 将输入图像经过高斯平滑处理,采用双线性差值将其扩大一倍.

if interactive >= 1

fprintf( 2, 'Doubling image size for first octave...\n' );

end

tic;

antialias_sigma = 0.5;

if antialias_sigma == 0

signal = im;

else

g = gaussian_filter( antialias_sigma );

if exist('corrsep') == 3

signal = corrsep( g, g, im );

else

signal = conv2( g, g, im, 'same' );

end

end

signal = im;

[X Y] = meshgrid( 1:0.5:size(signal,2), 1:0.5:size(signal,1) );

signal = interp2( signal, X, Y, '*linear' );

subsample = [0.5]; % 降采样率;

%下一步是生成高斯和差分高斯(DOG)金字塔,这两个金字塔的数据分别存储在名为gauss_pyr{orient,interval}

% 和DOG_pyr{orient,interval}的元胞数字中。高斯金字塔含有s+3层,差分高斯金字塔含

有s+2层。

if interactive >= 1

fprintf( 2, 'Prebluring image...\n' );

end

preblur_sigma = sqrt(sqrt(2)^2 - (2*antialias_sigma)^2);

if preblur_sigma == 0

gauss_pyr{1,1} = signal;

else

g = gaussian_filter( preblur_sigma );

if exist('corrsep') == 3

gauss_pyr{1,1} = corrsep( g, g, signal );

else

gauss_pyr{1,1} = conv2( g, g, signal, 'same' );

end

end

clear signal

pre_time = toc;

if interactive >= 1

fprintf( 2, 'Preprocessing time %.2f seconds.\n', pre_time );

end

% 第一组第一层的sigma

initial_sigma = sqrt( (2*antialias_sigma)^2 + preblur_sigma^2 );

% 记录每一层和每一个尺度的sigma

absolute_sigma = zeros(octaves,intervals+3);

absolute_sigma(1,1) = initial_sigma * subsample(1);

% 记录产生金字塔的滤波器的尺寸和标准差

filter_size = zeros(octaves,intervals+3);

filter_sigma = zeros(octaves,intervals+3);

% 生成高斯和差分高斯金字塔

if interactive >= 1

fprintf( 2, 'Expanding the Gaussian and DOG pyramids...\n' );

end

tic;

for octave = 1:octaves

if interactive >= 1

fprintf( 2, '\tProcessing octave %d: image size %d x %d subsample %.1f\n', octave,

size(gauss_pyr{octave,1},2), size(gauss_pyr{octave,1},1), subsample(octave) );

fprintf( 2, '\t\tInterval 1 sigma %f\n', absolute_sigma(octave,1) );

end

sigma = initial_sigma;

g = gaussian_filter( sigma );

filter_size( octave, 1 ) = length(g);

filter_sigma( octave, 1 ) = sigma;

DOG_pyr{octave} = zeros(size(gauss_pyr{octave,1},1),size(gauss_pyr{octave,1},2),intervals+2);

for interval = 2:(intervals+3)

% 计算生成下一层几何采样金字塔的标准差

% 其中,sigma_i+1 = k*sigma.

% sigma_i+1^2 = sigma_f,i^2 + sigma_i^2

% (k*sigma_i)^2 = sigma_f,i^2 + sigma_i^2

% 因此:

% sigma_f,i = sqrt(k^2 - 1)sigma_i

% 对于扩展的组(span the octave),k = 2^(1/intervals)

% 所以

% sigma_f,i = sqrt(2^(2/intervals) - 1)sigma_i

sigma_f = sqrt(2^(2/intervals) - 1)*sigma;

g = gaussian_filter( sigma_f );

sigma = (2^(1/intervals))*sigma;

% 记录sigma的值

absolute_sigma(octave,interval) = sigma * subsample(octave);

% 记录滤波器的尺寸和标准差

filter_size(octave,interval) = length(g);

filter_sigma(octave,interval) = sigma;

if exist('corrsep') == 3

gauss_pyr{octave,interval} = corrsep( g, g, gauss_pyr{octave,interval-1} );

else

gauss_pyr{octave,interval} = conv2( g, g, gauss_pyr{octave,interval-1}, 'same' );

end

DOG_pyr{octave}(:,:,interval-1) = gauss_pyr{octave,interval} - gauss_pyr{octave,interval-1};

if interactive >= 1

fprintf( 2, '\t\tInterval %d sigma %f\n', interval, absolute_sigma(octave,interval) );

end

end

if octave < octaves

sz = size(gauss_pyr{octave,intervals+1});

[X Y] = meshgrid( 1:2:sz(2), 1:2:sz(1) );

gauss_pyr{octave+1,1} = interp2(gauss_pyr{octave,intervals+1},X,Y,'*nearest');

absolute_sigma(octave+1,1) = absolute_sigma(octave,intervals+1);

subsample = [subsample subsample(end)*2];

end

end

pyr_time = toc;

if interactive >= 1

fprintf( 2, 'Pryamid processing time %.2f seconds.\n', pyr_time );

end

% 在交互模式下显示高斯金字塔

if interactive >= 2

sz = zeros(1,2);

sz(2) = (intervals+3)*size(gauss_pyr{1,1},2);

for octave = 1:octaves

sz(1) = sz(1) + size(gauss_pyr{octave,1},1);

end

pic = zeros(sz);

y = 1;

for octave = 1:octaves

x = 1;

sz = size(gauss_pyr{octave,1});

for interval = 1:(intervals + 3)

pic(y:(y+sz(1)-1),x:(x+sz(2)-1)) = gauss_pyr{octave,interval};

x = x + sz(2);

end

y = y + sz(1);

end

fig = figure;

clf;

imshow(pic);

resizeImageFig( fig, size(pic), 0.25 );

fprintf( 2, 'The gaussian pyramid (0.25 scale).\nPress any key to continue.\n' );

pause;

close(fig)

end

% 在交互模式下显示差分高斯金字塔

if interactive >= 2

sz = zeros(1,2);

sz(2) = (intervals+2)*size(DOG_pyr{1}(:,:,1),2);

for octave = 1:octaves

sz(1) = sz(1) + size(DOG_pyr{octave}(:,:,1),1);

end

pic = zeros(sz);

y = 1;

for octave = 1:octaves

x = 1;

sz = size(DOG_pyr{octave}(:,:,1));

for interval = 1:(intervals + 2)

pic(y:(y+sz(1)-1),x:(x+sz(2)-1)) = DOG_pyr{octave}(:,:,interval);

x = x + sz(2);

end

y = y + sz(1);

end

fig = figure;

clf;

imagesc(pic);

resizeImageFig( fig, size(pic), 0.25 );

fprintf( 2, 'The DOG pyramid (0.25 scale).\nPress any key to continue.\n' );

pause;

close(fig)

end

% 下一步是查找差分高斯金字塔中的局部极值,并通过曲率和照度进行检验curvature_threshold = ((curvature_threshold + 1)^2)/curvature_threshold;

% 二阶微分核

xx = [ 1 -2 1 ];

yy = xx';

xy = [ 1 0 -1; 0 0 0; -1 0 1 ]/4;

raw_keypoints = [];

contrast_keypoints = [];

curve_keypoints = [];

% 在高斯金字塔中查找局部极值

if interactive >= 1

fprintf( 2, 'Locating keypoints...\n' );

end

tic;

loc = cell(size(DOG_pyr));

for octave = 1:octaves

if interactive >= 1

fprintf( 2, '\tProcessing octave %d\n', octave );

end

for interval = 2:(intervals+1)

keypoint_count = 0;

contrast_mask = abs(DOG_pyr{octave}(:,:,interval)) >= contrast_threshold;

loc{octave,interval} = zeros(size(DOG_pyr{octave}(:,:,interval)));

if exist('corrsep') == 3

edge = 1;

else

edge = ceil(filter_size(octave,interval)/2);

end

for y=(1+edge):(size(DOG_pyr{octave}(:,:,interval),1)-edge)

for x=(1+edge):(size(DOG_pyr{octave}(:,:,interval),2)-edge)

if object_mask(round(y*subsample(octave)),round(x*subsample(octave))) == 1 if( (interactive >= 2) | (contrast_mask(y,x) == 1) )

% 通过空间核尺度检测最大值和最小值

tmp = DOG_pyr{octave}((y-1):(y+1),(x-1):(x+1),(interval-1):(interval+1));

pt_val = tmp(2,2,2);

if( (pt_val == min(tmp(:))) | (pt_val == max(tmp(:))) )

% 存储对灰度大于对比度阈值的点的坐标

raw_keypoints = [raw_keypoints; x*subsample(octave) y*subsample(octave)];

if abs(DOG_pyr{octave}(y,x,interval)) >= contrast_threshold

contrast_keypoints = [contrast_keypoints; raw_keypoints(end,:)];

% 计算局部极值的Hessian矩阵

Dxx = sum(DOG_pyr{octave}(y,x-1:x+1,interval) .* xx);

Dyy = sum(DOG_pyr{octave}(y-1:y+1,x,interval) .* yy);

Dxy = sum(sum(DOG_pyr{octave}(y-1:y+1,x-1:x+1,interval) .* xy));

% 计算Hessian矩阵的直迹和行列式.

Tr_H = Dxx + Dyy;

Det_H = Dxx*Dyy - Dxy^2;

% 计算主曲率.

curvature_ratio = (Tr_H^2)/Det_H;

if ((Det_H >= 0) & (curvature_ratio < curvature_threshold))

% 存储主曲率小于阈值的的极值点的坐标(非边缘点)

curve_keypoints = [curve_keypoints; raw_keypoints(end,:)];

% 将该点的位置的坐标设为1,并计算点的数量.

loc{octave,interval}(y,x) = 1;

keypoint_count = keypoint_count + 1;

end

end

end

end

end

end

end

if interactive >= 1

fprintf( 2, '\t\t%d keypoints found on interval %d\n', keypoint_count, interval );

end

end

end

keypoint_time = toc;

if interactive >= 1

fprintf( 2, 'Keypoint location time %.2f seconds.\n', keypoint_time );

end

% 在交互模式下显示特征点检测的结果.

if interactive >= 2

fig = figure;

clf;

imshow(im);

hold on;

plot(raw_keypoints(:,1),raw_keypoints(:,2),'y+');

resizeImageFig( fig, size(im), 2 );

fprintf( 2, 'DOG extrema (2x scale).\nPress any key to continue.\n' );

pause;

close(fig);

fig = figure;

clf;

imshow(im);

hold on;

plot(contrast_keypoints(:,1),contrast_keypoints(:,2),'y+');

resizeImageFig( fig, size(im), 2 );

fprintf( 2, 'Keypoints after removing low contrast extrema (2x scale).\nPress any key to continue.\n' );

pause;

close(fig);

fig = figure;

clf;

imshow(im);

hold on;

plot(curve_keypoints(:,1),curve_keypoints(:,2),'y+');

resizeImageFig( fig, size(im), 2 );

fprintf( 2, 'Keypoints after removing edge points using principal curvature filtering (2x scale).\nPress any key to continue.\n' );

pause;

close(fig);

end

clear raw_keypoints contrast_keypoints curve_keypoints

% 下一步是计算特征点的主方向.

% 在特征点的一个区域内计算其梯度直方图

g = gaussian_filter( 1.5 * absolute_sigma(1,intervals+3) / subsample(1) );

zero_pad = ceil( length(g) / 2 );

% 计算高斯金字塔图像的梯度方向和幅值

if interactive >= 1

fprintf( 2, 'Computing gradient magnitude and orientation...\n' );

end

tic;

mag_thresh = zeros(size(gauss_pyr));

mag_pyr = cell(size(gauss_pyr));

grad_pyr = cell(size(gauss_pyr));

for octave = 1:octaves

for interval = 2:(intervals+1)

% 计算x,y的差分

diff_x = 0.5*(gauss_pyr{octave,interval}(2:(end-1),3:(end))-gauss_pyr{octave,interval}(2:(end-1),1:(end-2 )));

diff_y = 0.5*(gauss_pyr{octave,interval}(3:(end),2:(end-1))-gauss_pyr{octave,interval}(1:(end-2),2:(end-1 )));

% 计算梯度幅值

mag = zeros(size(gauss_pyr{octave,interval}));

mag(2:(end-1),2:(end-1)) = sqrt( diff_x .^ 2 + diff_y .^ 2 );

% 存储高斯金字塔梯度幅值

mag_pyr{octave,interval} = zeros(size(mag)+2*zero_pad);

mag_pyr{octave,interval}((zero_pad+1):(end-zero_pad),(zero_pad+1):(end-zero_pad)) = mag;

% 计算梯度主方向

grad = zeros(size(gauss_pyr{octave,interval}));

grad(2:(end-1),2:(end-1)) = atan2( diff_y, diff_x );

grad(find(grad == pi)) = -pi;

% 存储高斯金字塔梯度主方向

grad_pyr{octave,interval} = zeros(size(grad)+2*zero_pad);

grad_pyr{octave,interval}((zero_pad+1):(end-zero_pad),(zero_pad+1):(end-zero_pad)) = grad;

end

end

clear mag grad

grad_time = toc;

if interactive >= 1

fprintf( 2, 'Gradient calculation time %.2f seconds.\n', grad_time );

end

% 下一步是确定特征点的主方向

% 方法:通过寻找每个关键点的子区域内梯度直方图的峰值(注:每个关键点的主方向可以有不止一个)

% 将灰度直方图分为36等分,每隔10度一份

num_bins = 36;

hist_step = 2*pi/num_bins;

hist_orient = [-pi:hist_step:(pi-hist_step)];

% 初始化关键点的位置、方向和尺度信息

pos = [];

orient = [];

scale = [];

% 给关键点确定主方向

if interactive >= 1

fprintf( 2, 'Assigining keypoint orientations...\n' );

end

tic;

for octave = 1:octaves

if interactive >= 1

fprintf( 2, '\tProcessing octave %d\n', octave );

end

for interval = 2:(intervals + 1)

if interactive >= 1

fprintf( 2, '\t\tProcessing interval %d ', interval );

end

keypoint_count = 0;

% 构造高斯加权掩模

g = gaussian_filter( 1.5 * absolute_sigma(octave,interval)/subsample(octave) );

hf_sz = floor(length(g)/2);

g = g'*g;

loc_pad = zeros(size(loc{octave,interval})+2*zero_pad);

loc_pad((zero_pad+1):(end-zero_pad),(zero_pad+1):(end-zero_pad)) = loc{octave,interval};

[iy ix]=find(loc_pad==1);

for k = 1:length(iy)

x = ix(k);

y = iy(k);

wght = g.*mag_pyr{octave,interval}((y-hf_sz):(y+hf_sz),(x-hf_sz):(x+hf_sz));

grad_window = grad_pyr{octave,interval}((y-hf_sz):(y+hf_sz),(x-hf_sz):(x+hf_sz));

orient_hist=zeros(length(hist_orient),1);

for bin=1:length(hist_orient)

diff = mod( grad_window - hist_orient(bin) + pi, 2*pi ) - pi;

orient_hist(bin)=orient_hist(bin)+sum(sum(wght.*max(1 - abs(diff)/hist_step,0)));

end

% 运用非极大抑制法查找主方向直方图的峰值

peaks = orient_hist;

rot_right = [ peaks(end); peaks(1:end-1) ];

rot_left = [ peaks(2:end); peaks(1) ];

peaks( find(peaks < rot_right) ) = 0;

peaks( find(peaks < rot_left) ) = 0;

% 提取最大峰值的值和其索引位置

[max_peak_val ipeak] = max(peaks);

% 将大于等于最大峰值80% 的直方图的也确定为特征点的主方向

peak_val = max_peak_val;

while( peak_val > 0.8*max_peak_val )

% 最高峰值最近的三个柱值通过抛物线插值精确得到

A = [];

b = [];

for j = -1:1

A = [A; (hist_orient(ipeak)+hist_step*j).^2 (hist_orient(ipeak)+hist_step*j) 1];

bin = mod( ipeak + j + num_bins - 1, num_bins ) + 1;

b = [b; orient_hist(bin)];

end

c = pinv(A)*b;

max_orient = -c(2)/(2*c(1));

while( max_orient < -pi )

max_orient = max_orient + 2*pi;

end

while( max_orient >= pi )

max_orient = max_orient - 2*pi;

end

% 存储关键点的位置、主方向和尺度信息

pos = [pos; [(x-zero_pad) (y-zero_pad)]*subsample(octave) ];

orient = [orient; max_orient];

scale = [scale; octave interval absolute_sigma(octave,interval)];

keypoint_count = keypoint_count + 1;

peaks(ipeak) = 0;

[peak_val ipeak] = max(peaks);

end

end

if interactive >= 1

fprintf( 2, '(%d keypoints)\n', keypoint_count );

end

end

end

clear loc loc_pad

orient_time = toc;

if interactive >= 1

fprintf( 2, 'Orientation assignment time %.2f seconds.\n', orient_time );

end

% 在交互模式下显示关键点的尺度和主方向信息

if interactive >= 2

fig = figure;

clf;

imshow(im);

hold on;

display_keypoints( pos, scale(:,3), orient, 'y' );

resizeImageFig( fig, size(im), 2 );

fprintf( 2, 'Final keypoints with scale and orientation (2x scale).\nPress any key to continue.\n' );

pause;

close(fig);

end

% SIFT 算法的最后一步是特征向量生成

orient_bin_spacing = pi/4;

orient_angles = [-pi:orient_bin_spacing:(pi-orient_bin_spacing)];

grid_spacing = 4;

[x_coords y_coords] = meshgrid( [-6:grid_spacing:6] );

feat_grid = [x_coords(:) y_coords(:)]';

[x_coords y_coords] = meshgrid( [-(2*grid_spacing-0.5):(2*grid_spacing-0.5)] );

feat_samples = [x_coords(:) y_coords(:)]';

feat_window = 2*grid_spacing;

desc = [];

if interactive >= 1

fprintf( 2, 'Computing keypoint feature descriptors for %d keypoints', size(pos,1) ); end

for k = 1:size(pos,1)

x = pos(k,1)/subsample(scale(k,1));

y = pos(k,2)/subsample(scale(k,1));

% 将坐标轴旋转为关键点的方向,以确保旋转不变性

M = [cos(orient(k)) -sin(orient(k)); sin(orient(k)) cos(orient(k))];

feat_rot_grid = M*feat_grid + repmat([x; y],1,size(feat_grid,2));

feat_rot_samples = M*feat_samples + repmat([x; y],1,size(feat_samples,2));

% 初始化特征向量.

feat_desc = zeros(1,128);

for s = 1:size(feat_rot_samples,2)

x_sample = feat_rot_samples(1,s);

y_sample = feat_rot_samples(2,s);

% 在采样位置进行梯度插值

[X Y] = meshgrid( (x_sample-1):(x_sample+1), (y_sample-1):(y_sample+1) );

G = interp2( gauss_pyr{scale(k,1),scale(k,2)}, X, Y, '*linear' );

G(find(isnan(G))) = 0;

diff_x = 0.5*(G(2,3) - G(2,1));

diff_y = 0.5*(G(3,2) - G(1,2));

mag_sample = sqrt( diff_x^2 + diff_y^2 );

grad_sample = atan2( diff_y, diff_x );

if grad_sample == pi

grad_sample = -pi;

end

% 计算x、y方向上的权重

x_wght = max(1 - (abs(feat_rot_grid(1,:) - x_sample)/grid_spacing), 0);

y_wght = max(1 - (abs(feat_rot_grid(2,:) - y_sample)/grid_spacing), 0);

pos_wght = reshape(repmat(x_wght.*y_wght,8,1),1,128);

diff = mod( grad_sample - orient(k) - orient_angles + pi, 2*pi ) - pi;

orient_wght = max(1 - abs(diff)/orient_bin_spacing,0);

orient_wght = repmat(orient_wght,1,16);

% 计算高斯权重

g = exp(-((x_sample-x)^2+(y_sample-y)^2)/(2*feat_window^2))/(2*pi*feat_window^2);

feat_desc = feat_desc + pos_wght.*orient_wght*g*mag_sample;

end

% 将特征向量的长度归一化,则可以进一步去除光照变化的影响.

feat_desc = feat_desc / norm(feat_desc);

feat_desc( find(feat_desc > 0.2) ) = 0.2;

feat_desc = feat_desc / norm(feat_desc);

% 存储特征向量.

desc = [desc; feat_desc];

if (interactive >= 1) & (mod(k,25) == 0)

fprintf( 2, '.' );

end

end

desc_time = toc;

% 调整采样偏差

sample_offset = -(subsample - 1);

for k = 1:size(pos,1)

pos(k,:) = pos(k,:) + sample_offset(scale(k,1));

end

if size(pos,1) > 0

scale = scale(:,3);

end

% 在交互模式下显示运行过程耗时.

if interactive >= 1

fprintf( 2, '\nDescriptor processing time %.2f seconds.\n', desc_time );

fprintf( 2, 'Processing time summary:\n' );

fprintf( 2, '\tPreprocessing:\t%.2f s\n', pre_time );

fprintf( 2, '\tPyramid:\t%.2f s\n', pyr_time );

fprintf( 2, '\tKeypoints:\t%.2f s\n', keypoint_time );

fprintf( 2, '\tGradient:\t%.2f s\n', grad_time );

fprintf( 2, '\tOrientation:\t%.2f s\n', orient_time );

fprintf( 2, '\tDescriptor:\t%.2f s\n', desc_time );

fprintf( 2, 'Total processing time %.2f seconds.\n', pre_time + pyr_time + keypoint_time + grad_time + orient_time + desc_time );

end

MATLAB特征提取代码讲课稿

f=strcat('D:\bishe\',num2str(i)); image=strcat(f,'.jpg'); PS=imread(image); PS=imresize(PS,[300,300],'bilinear');%归一化大小 PS=rgb2gray(PS); [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255 GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率,将其存入GP 中相应位置 end %直方图均衡化 S1=zeros(1,256); for i=1:256 for j=1:i S1(i)=GP(j)+S1(i); %计算Sk end end S2=round((S1*256)+0.5); %将Sk归到相近级的灰度 %图像均衡化 f=PS; for i=0:255 f(find(PS==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素 end figure,imshow(f); %边缘检测 f=edge(f,'canny',0.25); imshow(f); %二值法锐化图像 f=double(f); [x,y]=gradient(f); g=sqrt(x.*x+y.*y); i=find(g>=0.5); g(i)=256; j=find(g<0.5); g(j)=0; imshow(g); title('二值法锐化图像'); %中值滤波 g=medfilt2(g); g=dither(g);

图像颜色特征提取原理

一、颜色特征 1 颜色空间 1.1 RGB 颜色空间 是一种根据人眼对不同波长的红、绿、蓝光做出锥状体细胞的敏感度描述的基础彩色模式,R、 G、B 分别为图像红、绿、蓝的亮度值,大小限定在 0~1 或者在 0~255。 1.2 HIS 颜色空间 是指颜色的色调、亮度和饱和度,H表示色调,描述颜色的属性,如黄、红、绿,用角度 0~360度来表示;S 是饱和度,即纯色程度的量度,反映彩色的浓淡,如深红、浅红,大小限定在 0~1;I 是亮度,反映可见光对人眼刺激的程度,它表征彩色各波长的总能量,大小限定在 0~1。 1.3 HSV 颜色模型 HSV 颜色模型依据人类对于色泽、明暗和色调的直观感觉来定义颜色, 其中H (Hue)代表色度, S (Saturat i on)代表色饱和度,V (V alue)代表亮度, 该颜色系统比RGB 系统更接近于人们的经验和对彩色的感知, 因而被广泛应用于计算机视觉领域。 已知RGB 颜色模型, 令M A X = max {R , G, B },M IN =m in{R , G,B }, 分别为RGB 颜色模型中R、 G、 B 三分量的最大和最小值, RGB 颜色模型到HSV 颜色模型的转换公式为: S =(M A X - M IN)/M A X H = 60*(G- B)/(M A X - M IN) R = M A X 120+ 60*(B – R)/(M A X - M IN) G= M A X 240+ 60*(R – G)/(M A X - M IN) B = M A X V = M A X 2 颜色特征提取算法 2.1 一般直方图法 颜色直方图是最基本的颜色特征表示方法,它反映的是图像中颜色的组成分布,即出现了哪些颜色以及各种颜色出现的概率。其函数表达式如下: H(k)= n k/N (k=0,1,…,L-1) (1) 其中,k 代表图像的特征取值,L 是特征可取值的个数,n k是图像中具有特征值为 k 的象素的个数,N 是图像象素的总数。由上式可见,颜色直方图所描述的是不同色彩在整幅图像中所占的比例,无法描述图像中的对象或物体,但是由于直方图相对于图像以观察轴为轴心的旋转以及幅度不大的平移和缩放等几何变换是不敏感的,而且对于图像质量的变化也不甚敏感,所以它特别适合描述那些难以进行自动分割的图像和不需要考虑物体空间位置的图像。 由于计算机本身固有的量化缺陷,这种直方图法忽略了颜色的相似性,人们对这种算法进行改进,产生了全局累加直方图法和局部累加直方图法。 2.2 全局累加直方图法 全局累加直方图是以颜色值作为横坐标,纵坐标为颜色累加出现的频数,因此图像的累加直方空间 H 定义为:

MATLAB特征提取代码

MATLAB特征提取代码 for i=1:26 f=strcat('D:\bishe\',num2str(i)); image=strcat(f,'.jpg'); PS=imread(image); PS=imresize(PS,[300,300],'bilinear');%归一化大小 PS=rgb2gray(PS); [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255 GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置 end %直方图均衡化 S1=zeros(1,256); for i=1:256 for j=1:i S1(i)=GP(j)+S1(i); %计算Sk end end S2=round((S1*256)+0.5); %将Sk归到相近级的灰度 %图像均衡化 f=PS; for i=0:255 f(find(PS==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素 end figure,imshow(f); %边缘检测 f=edge(f,'canny',0.25); imshow(f); %二值法锐化图像 f=double(f); [x,y]=gradient(f); g=sqrt(x.*x+y.*y); i=find(g>=0.5); g(i)=256; j=find(g<0.5); g(j)=0; imshow(g); title('二值法锐化图像'); %中值滤波 g=medfilt2(g); g=dither(g); imshow(g);

图像特征提取总结

图像常见特征提取方法简介 常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。 一、颜色特征 (一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。另外,仅使用颜色特征查询时,如果数据库很大,常会将许多不需要的图像也检索出来。颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可不受图像尺度变化的影响,基缺点是没有表达出颜色空间分布的信息。 (二)常用的特征提取与匹配方法 (1)颜色直方图 其优点在于:它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。其缺点在于:它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。 最常用的颜色空间:RGB颜色空间、HSV颜色空间。 颜色直方图特征匹配方法:直方图相交法、距离法、中心距法、参考颜色表法、累加颜色直方图法。 (2)颜色集 颜色直方图法是一种全局颜色特征提取与匹配方法,无法区分局部颜色信息。颜色集是对颜色直方图的一种近似首先将图像从RGB颜色空间转化成视觉均衡的颜色空间(如HSV 空间),并将颜色空间量化成若干个柄。然后,用色彩自动分割技术将图像分为若干区域,每个区域用量化颜色空间的某个颜色分量来索引,从而将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同图像颜色集之间的距离和色彩区域的空间关系 (3)颜色矩 这种方法的数学基础在于:图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此,仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。 (4)颜色聚合向量 其核心思想是:将属于直方图每一个柄的像素分成两部分,如果该柄内的某些像素所占据的连续区域的面积大于给定的阈值,则该区域内的像素作为聚合像素,否则作为非聚合像素。(5)颜色相关图 二纹理特征 (一)特点:纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。在模式匹配中,这种区域性的特征具有较大的优越性,不会由于局部的偏差而无法匹配成功。作为一种统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗能力。但是,纹理特征也有其缺点,一个很明显的缺点是当图像的分辨率变化的时候,所计算出来的纹理可能会有较大偏差。另外,由于有可能受到光照、反射情况的影响,从2-D图像中反映出来的纹理不一定是3-D物体表面真实

MATLAB特征提取代码

for i=1:26 f=strcat('D:\bishe\',num2str(i)); image=strcat(f,'.jpg'); PS=imread(image); PS=imresize(PS,[300,300],'bilinear');%归一化大小 PS=rgb2gray(PS); [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255 GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置 end %直方图均衡化 S1=zeros(1,256); for i=1:256 for j=1:i S1(i)=GP(j)+S1(i); %计算Sk end end S2=round((S1*256)+0.5); %将Sk归到相近级的灰度 %图像均衡化 f=PS; for i=0:255 f(find(PS==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素 end figure,imshow(f); %边缘检测 f=edge(f,'canny',0.25); imshow(f); %二值法锐化图像 f=double(f); [x,y]=gradient(f); g=sqrt(x.*x+y.*y); i=find(g>=0.5); g(i)=256; j=find(g<0.5); g(j)=0; imshow(g); title('二值法锐化图像'); %中值滤波 g=medfilt2(g); g=dither(g); imshow(g); %提取面积,矩形度,圆形度,拉伸度特征

图像特征提取综述

图像特征提取的定位是计算机视觉和图像处理里的一个概念,表征图像的特性。输入是一张图像(二维的数据矩阵),输出是一个值、一个向量、一个分布、一个函数或者是信号。提取特征的方法千差万别,下面是图像特征的一些特性: 边缘 边缘是两个区域边界的像素集合,本质上是图像像素的子集,能将区域分开。边缘形状是任意的,实践中定义为大的梯度的像素点的集合,同时为了平滑,还需要一些算法进行处理。角 顾名思义,有个突然较大的弧度。早起算法是在边缘检测的基础上,分析边缘的走向,如果突然转向则被认为是角。后来的算法不再需要边缘检测,直接计算图像梯度的高度曲率(合情合理)。但会出现没有角的地方也检测到角的存在。 区域 区域性的结构,很多区域检测用来检测角。区域检测可以看作是图像缩小后的角检测。 脊 长形的物体,例如道路、血管。脊可以看成是代表对称轴的一维曲线,每个脊像素都有脊宽度,从灰梯度图像中提取要比边缘、角和区域都难。 特征提取 检测到特征后提取出来,表示成特征描述或者特征向量。 常用的图像特征:颜色特征、 纹理特征 形状特征 空间关系特征。 1.颜色特征 1.1特点:颜色特征是全局特征,对区域的方向、大小不敏感,但是不能很好捕捉局部特征。 优点:不受旋转和平移变化的影响,如果归一化不受尺度变化的影响。 缺点:不能表达颜色空间分布的信息。 1.2特征提取与匹配方法 (1)颜色直方图 适用于难以自动分割的图像,最常用的颜色空间:RGB和HSV。 匹配方法:直方图相交法(相交即交集)、距离法、中心距法、参考颜色表法、累加颜色直方图法。 对颜色特征的表达方式有许多种,我们采用直方图进行特征描述。常见的直方图有两种:统计直方图,累积直方图。我们将分别实验两种直方图在图像聚类和检索中的性能。 统计直方图 为利用图像的特征描述图像,可借助特征的统计直方图。图像特征的统计直方图实际是一个1-D的离散函数,即: 上式中k代表图像的特征取值,L是特征可取值个数,是图像中具有特征值为k的像素的个数,N是图像像素的总数,一个示例如下图:其中有8个直方条,对应图像中的8种灰度像素在总像素中的比例。

图像特征提取matlab程序

%直接帧间差分,计算阈值并进行二值化处理(效果不好) clc; clear; Im1 = double(imread('lena.TIF')); %读取背景图片 Im2 = double(imread('lena.TIF'); %读取当前图片 [X Y Z] = size(Im2); %当前图片的各维度值 DIma = zeros(X,Y); for i = 1:X for j = 1:Y DIma(i,j) =Im1(i,j) - Im2(i,j); %计算过帧间差分值 end end figure,imshow(uint8(DIma)) %显示差分图像 title('DIma') med = median(DIma); %计算二值化阈值:差值图像中值 mad = abs(mean(DIma) - med); %中值绝对差 T = mean(med + 3*1.4826*mad) %初始阈值 Th =5*T; %调整阈值 BW = DIma <= Th; %根据阈值对图像进行二值化处理 figure,imshow(BW) %se = strel('disk',2); %膨胀处理 %BW = imopen(BW,se); %figure,imshow(BW) %title('BW') [XX YY] = find(BW==0); %寻找有效像素点的最大边框 handle = rectangle('Position',[min(YY),min(XX) ,max(YY)-min(YY),max(XX)-min(XX)]); set(handle,'EdgeColor',[0 0 0]); hei = max(XX)-min(XX); %边框高度 mark = min(YY)+1; while mark < max(YY)-1 %从边框左边开始到右边物质循环,寻找各个人体边缘 left = 0;right = 0; for j = mark:max(YY)-1 ynum = 0; for i = min(XX)+1 : max(XX)-1 if BW(i,j) == 0; ynum = ynum + 1;

不变特征

不变特征 0引言 图像局部特征的研究已经有很长的历史,早期研究可以追溯到20世纪70年代的Momvec算子。文献中存在大量关于角点、边缘、blob和区域等局部特征的研究方法。近年来区分性强、对多种几何和光度变换具有不变性的局部不变特征在宽基线匹配、特定目标识别、目标类别识别、图像及视频检索、机器人导航、纹理识别和数据挖掘等多个领域内获得广泛的应用,是国内外的研究热点。 局部不变特征是指局部特征的检测或描述对图像的各种变化,例如几何变换、光度变换、卷积变换、视角变化等保持不变。局部不变特征的基本思想是提取图像内容的本质属性特征,这些特征与图像内容的具体表现形式无关或具有自适应性(即表现形式变化时特征提取自适应的变化以描述相同的图像内容)。局部不变特征通常存在一个局部支撑邻域,与经典的图像分割算法不同,局部支撑邻域可能是图像的任何子集,支撑区域的边界不一定对应图像外观(例如颜色或纹理)的变化。 局部不变特征不仅能够在观测条件变化大、遮挡和杂乱干扰的情况下获得可靠的匹配,而且能够有效的描述图像内容进行图像检索或场景、目标识别等。局部不变特征可以克服语义层次图像分割的需要。从复杂背景中分割出前景目标是十分困难的课题,基于低层特征的方法很难实现有意义的分割,把图像内容表示为局部不变区域的集合(多个区域可能存在重合,图像中一些部分也可能不存在局部不变区域),可以回避分割问题。基于局部不变特征的方法本质上是对图像内容进行隐式分割,局部不变特征既可能位于感兴趣的前景目标上也可能位于背景或目标边界上,后续的高层处理需要基于局部不变特征提取感兴趣的信息。 局部不变特征的研究包含3个基本问题:一是局部不变特征的检测,二是局部不变特征的描述,三是局部不变特征的匹配。根据不同的准则,局部不变特征的研究方法可以分为不同的类别,按照使用的色调空间的不同可以分为局部灰度不变特征和局部彩色不变特征;按照特征层次的不同可以分为角点不变特征、blob不变特征和区域不变特征;按照几何变换不变性的自由度可以分为平移不变特征、旋转不变特征、尺度不变特征、欧氏不变特征、相似不变特征、仿射不变特征和投影不变特征;按照处理思路的不同可以分为基于轮廓曲率的不变特征、

小波矩特征提取代码

小波矩特征提取matlab代码 分类:Image Recognition Matlab 2010-12-10 10:00 122人阅读评论(0) 收藏举报这是我上研究生时写的小波矩特征提取代码: %新归一化方法小波矩特征提取---------------------------------------------------------- F=imread('a1.bmp'); F=im2bw(F); F=imresize(F,[128 128]); %求取最上点 for i=1:128 for j=1:128 if (F(i,j)==1) ytop=i; xtop=j; break; end end if(F(i,j)==1) break; end end %求取最下点 for i=1:128 for j=1:128 if (F(129-i,j)==1) ybottom=129-i; xbottom=j; break; end end if(F(129-i,j)==1) break; end end %求取最左点 for i=1:128 for j=1:128 if (F(j,i)==1) yleft=j; xleft=i;

break; end end if(F(j,i)==1) break; end end %求取最右点 for i=1:128 for j=1:128 if (F(j,129-i)==1) yright=j; xright=129-i; break; end end if(F(j,129-i)==1) break; end end %求取中心点 x0=(xright-xleft)/2+xleft; y0=(ybottom-ytop)/2+ytop; x0=round(x0); y0=round(y0); %图像平移 F=double(F); [M,N]=size(F); F1=zeros(M,N); M0=M/2; N0=N/2; for i=1:M for j=1:N if F(i,j)==1 F1(i+M0-y0,j+N0-x0)=1; end end end %figure,imshow(F1); %图像缩放 max=0; for i=1:128 for j=1:128 if(F(i,j)==1)

统计降尺度方法和Delta方法建立黄河源区气候情景的比较 …

统计降尺度方法和Delta方法建立黄河源区气候情景的比较分析 赵芳芳徐宗学 北京师范大学水科学研究院,水沙科学教育部重点实验室, 北京, 100875 摘要 大气环流模型(GCMs)预测的气候变化情景,必须经降尺度处理得出小尺度上未来气候变化的时空分布资料,才能满足气候变化对资源、环境和社会经济等影响进行评估的需要。文中研究同时应用Delta方法和统计降尺度(SDS)方法对黄河源区的日降水量和日最高、最低气温进行降尺度处理,建立起未来3个时期(2006—2035、2036—2065和2066—2095年,简记为2020s、2050s和2080s)的气候变化情景,并比较分析两种方法的优缺点和适用性。结果表明,未来降水量有一定的增加趋势,但是增幅不大,而日最高、最低气温存在明显的上升趋势,且增幅较大。与基准期相比,Delta方法模拟的未来3个时期降水量将分别增加8.75%、19.70%和18.49%;日最高气温将分别升高1.41、2.42和3.44 ℃,同时,日最低气温将分别升高1.49、2.68和3.76 ℃,未来极值气温变幅减小。SDS法借助站点实测数据和NCEP再分析资料建立GCM强迫条件下的降尺度模型,模拟结果表明,未来3个时期降水量将分别增加3.47%、6.42%和8.67%,季节变化明显;气温随时间推移增幅明显,未来3个时期的日最高气温将分别升高1.34、2.60和3.90 ℃,最低气温增幅相对较小,3个时期将分别升高0.87、1.49和2.27 ℃,由此模拟的未来时期无霜期将延长。在降尺度方法的应用上,SDS方法存在明显的优势,但同时也存在不可避免的缺陷。因此,在实际的气候变化影响评估中,需要多种方法综合比较,以期为决策部门提供参考和依据。 关键词:气候变化,大气环流模型(GCMs),情景,降尺度,黄河。 初稿时间:2006年2月23日;修改稿时间:2006年7月8 作者简介:赵芳芳,主要从事气候变化对水文资源的影响分析研究。 Email: zhfang2003@https://www.360docs.net/doc/9012616438.html,

图像特征提取方法

图像特征提取方法 摘要 特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。 至今为止特征没有万能和精确的图像特征定义。特征的精确定义往往由问题或者应用类型决定。特征是一个数字图像中“有趣”的部分,它是许多计算机图像分析算法的起点。因此一个算法是否成功往往由它使用和定义的特征决定。因此特征提取最重要的一个特性是“可重复性”:同一场景的不同图像所提取的特征应该是相同的。 特征提取是图象处理中的一个初级运算,也就是说它是对一个图像进行的第一个运算处理。它检查每个像素来确定该像素是否代表一个特征。假如它是一个更大的算法的一部分,那么这个算法一般只检查图像的特征区域。作为特征提取的一个前提运算,输入图像一般通过高斯模糊核在尺度空间中被平滑。此后通过局部导数运算来计算图像的一个或多个特征。 常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。当光差图像时,常 常看到的是连续的纹理与灰度级相似的区域,他们相结合形成物体。但如果物体的尺寸很小 或者对比度不高,通常要采用较高的分辨率观察:如果物体的尺寸很大或对比度很强,只需 要降低分辨率。如果物体尺寸有大有小,或对比有强有弱的情况下同事存在,这时提取图像 的特征对进行图像研究有优势。 常用的特征提取方法有:Fourier变换法、窗口Fourier变换(Gabor)、小波变换法、最 小二乘法、边界方向直方图法、基于Tamura纹理特征的纹理特征提取等。

设计内容 课程设计的内容与要求(包括原始数据、技术参数、条件、设计要求等):一、课程设计的内容 本设计采用边界方向直方图法、基于PCA的图像数据特征提取、基于Tamura纹理特征的纹理特征提取、颜色直方图提取颜色特征等等四种方法设计。 (1)边界方向直方图法 由于单一特征不足以准确地描述图像特征,提出了一种结合颜色特征和边界方向特征的图像检索方法.针对传统颜色直方图中图像对所有像素具有相同重要性的问题进行了改进,提出了像素加权的改进颜色直方图方法;然后采用非分割图像的边界方向直方图方法提取图像的形状特征,该方法相对分割方法具有简单、有效等特点,并对图像的缩放、旋转以及视角具有不变性.为进一步提高图像检索的质量引入相关反馈机制,动态调整两幅图像相似度中颜色特征和方向特征的权值系数,并给出了相应的权值调整算法.实验结果表明,上述方法明显地优于其它方法.小波理论和几个其他课题相关。所有小波变换可以视为时域频域的形式,所以和调和分析相关。所有实际有用的离散小波变换使用包含有限脉冲响应滤波器的滤波器段(filterbank)。构成CWT的小波受海森堡的测不准原理制约,或者说,离散小波基可以在测不准原理的其他形式的上下文中考虑。 通过边缘检测,把图像分为边缘区域和非边缘区域,然后在边缘区域内进行边缘定位.根据局部区域内边缘的直线特性,求得小邻域内直线段的高精度位置;再根据边缘区域内边缘的全局直线特性,用线段的中点来拟合整个直线边缘,得到亚像素精度的图像边缘.在拟合的过程中,根据直线段转角的变化剔除了噪声点,提高了定位精度.并且,根据角度和距离区分出不同直线和它们的交点,给出了图像精确的矢量化结果 图像的边界是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合,边界广泛的存在于物体和背 景之间、物体和物体之间,它是图像分割所依赖的重要特征.边界方向直方图具有尺度不变性,能够比较好的 描述图像的大体形状.边界直方图一般是通过边界算子提取边界,得到边界信息后,需要表征这些图像的边 界,对于每一个边界点,根据图像中该点的梯度方向计算出该边界点处法向量的方向角,将空间量化为M级, 计算每个边界点处法向量的方向角落在M级中的频率,这样便得到了边界方向直方图. 图像中像素的梯度向量可以表示为[ ( ,),),( ,),)] ,其中Gx( ,),),G ( ,),)可以用下面的

尺度不变特征变换(Scale-invariant feature transform,SIFT

SIFT SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。该方法于1999年由David Lowe 首先发表于计算机视觉国际会议(International Conference on Computer Vision,ICCV),2004年再次经David Lowe整理完善后发表于International journal of computer vision(IJCV) 。截止2014年8月,该论文单篇被引次数达25000余次。 算法介绍 SIFT由David Lowe在1999年提出,在2004年加以完善。SIFT在数字图像的特征描述方面当之无愧可称之为最红最火的一种,许多人对SIFT进行了改进,诞生了SIFT的一系列变种。SIFT 已经申请了专利。 SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。 算法的特点 SIFT算法具有如下一些特点: 1.SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性; 2. 区分性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配; 3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量; 4.高速性,经优化的SIFT匹配算法甚至可以达到实时的要求; 5.可扩展性,可以很方便的与其他形式的特征向量进行联合。 特征检测 SIFT特征检测主要包括以下4个基本步骤: 1尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。 2. 关键点定位 在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。 3. 方向确定 基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。 4. 关键点描述 在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。 特征匹配 SIFT特征匹配主要包括2个阶段: 第一阶段:SIFT特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量。第二阶段:SIFT特征向量的匹配。 SIFT特征的生成一般包括以下几个步骤:

特征提取与匹配案例代码

特征提取与匹配案例代码、 环境:Android studio + opencv for Android MainActivity.java package com.packtpub.masteringopencvandroid.chapter3; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import https://www.360docs.net/doc/9012616438.html,.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.android.Utils; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfDMatch; import org.opencv.core.MatOfKeyPoint; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.features2d.DMatch; import org.opencv.features2d.DescriptorExtractor; import org.opencv.features2d.DescriptorMatcher; import org.opencv.features2d.FeatureDetector; import org.opencv.features2d.Features2d; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc;

降尺度方法在月预报中的应用研究

第1期 气象水文海洋仪器 No .1 2011年3月  M eteo rological ,Hy drolog ical and M arine Instruments M ar .2011 收稿日期:2010-08-16. 基金项目:国家自然科学基金(40675040)项目资助. 作者简介:王慧娟(1983),女,硕士.主要从事短期区域气候预测研究. 降尺度方法在月预报中的应用研究 王慧娟1,2,3,吴洪星1,3,仵建勋1,3 (1.解放军理工大学气象学院,南京211101;2.294608部队气象台,南京210022;3.空军装备研究院航空气象研究防化研究所,北京100085) 摘 要:月尺度的预报是气象业务中的难点,本文从降尺度的方法出发、介绍了动力学降尺度 方法、统计学降尺度方法以及动力统计降尺度方法。总结了近年来在月尺度预报上的研究成果,并在此基础上提出了有待进一步研究的课题。关键词:降尺度;月预报;动力延伸期 中图分类号:P456.2 文献标识码:A 文章编号:1006-009X (2011)01-0027-05 Application of downscaling method in monthly forecast Wang H uijuan 1,2,3 ,Wu H o ng xing 1,3 ,Chu Jianxun 1,3 (1.Meteorological College ,PL A Univ ersity o f Science and T echnology ,N anj ing 211101;2.Observatory o f No .294608Army ,N an jing 210022;3.I nstitute of Ai r Force Equi pment ,Chemical De f ense I nstitute of Av iation Weather ,Bei jing 100085) A bstract :The mo nthly fo recast is the difficult point in meteo rological o peratio n .Based on the dow nscaling method ,this paper describes three dow nscaling metho ds that are dy namic ,statistical and dy namic -statistical .Then ,the research results o n the monthly fo recast are summ arized ,and the further pro spects in this area are pro po sed . Key words :dow nscaling metho d ;m onthly forecast ;dynamical ex tended rang e forecast 0 引言 统计学方法做气候预测隐含着一个基本假设,即气候系统的未来状况类似于过去和现在,如果预测期间的气候状况发生较大改变就破坏了这种基本假设,就有可能导致预测失败或者是拟合好预报差。所以统计学预报是基于对过去发生气候状况进行拟合从而对未来情境做出预报。动力学方法则是建立在一套大气动力学方程基础之上的。通过动力学方程之间的关系,由初始状态推导出未来的气候情境。统计学的方法主要用于中长期的气候预测,而动力学的方法则是主要用于 短期的天气预报当中。 月预报的时间尺度介于气候预测和天气预报中间,有着统计学和动力学特征。月尺度的短期 气候预测是气候预测或长期预报的下限,又是中期预报的上限,也被称为动力延伸期预报。 1 研究现状 我国的短期气候预测业务开始于1958年,是世界上开展预测业务比较早且一直坚持的少数几个国家之一。近年来,经过8年多的研制和发展,国家气候中心建成了第一代动力气候模式预测业务系统(NCC -GODAS ),并以此为平台,逐步形成

图像处理特征不变算子系列之DoG算子(五)

图像处理特征不变算子系列之DoG算子(五) 时间 2013-09-12 00:24:07 CSDN博客原 文https://www.360docs.net/doc/9012616438.html,/kezunhai/article/details/11403733 图像处理特征不变算子系列之DoG算子(五) kezunhai@https://www.360docs.net/doc/9012616438.html, https://www.360docs.net/doc/9012616438.html,/kezunhai 在前面分别介绍了:图像处理特征不变算子系列之Moravec算子(一)、图像处理特征不变算子系列之Harris算子(二)、图像处理特征不变算子系列之SUSAN算子(三)和图像处理特征不变算子系列之FAST算子(四)。今天我们将介绍另外一个特征检测算子---DoG算子,DoG算子是 由 Lowe D.G. 提出的,对噪声、尺度、仿射变化和旋转等具有很强的鲁棒性,能够提供更丰富的局部特征信息,本文将对DoG算子进行详细地分析。 在开始介绍DoG之前,有必要对尺度空间有一定的了解。尺度空间最早是由Tony Lindeberg提出的,并不断的发展和完善。日常生活中,我们自觉或不自觉的在使用尺度的概念。举个我们个人自觉的经历,当我们读小学的时候,同学间互相询问来自哪个组;当我们读中学的时候,同学们互相询问自哪个村;当我们读高中的时候,同学们互相询问来自哪个镇;当读大学的时候,同学们互相询问来自哪个省?这里的组、村、镇、省就是我们不自觉使用的尺寸。还有一个例子,当我们打开google地图的时候,随着鼠标的滚动,地图会由五大洲逐渐定位到国家--》省---》市---》区---》街道办等,这也是尺度的表现。 1)尺度空间 在尺度空间中,尺度越大图像就越模糊,尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟目标由远及近人对目标的感知过程。那为什么要讨论尺度空间呢?因为在用机器视觉系统分析未知场景时,机器并不知道图像中物体的尺度,只有通过对图像的多尺度描述,才能获得对物体感知的最佳尺度。如果在不同尺度上,对输入的图像都能检测到相同的关键点特征,那么在不同尺度下也可以实现关键点的匹配,从而实现关键点的尺度不变特性。尺度空间描述的就是图像在不同尺度下的描述,如果对尺度空间有兴趣,请参考Tony Lindeberg的论文:Scale-Space。 2)金字塔多分辨率 常常有人会将DoG与图像金字塔弄混,从而导致对SIFT算法第一步构造DoG不甚理解。这里首先介绍下金字塔多分辨率。金字塔是早起图像多尺度的表示形式,图像金字塔一般包括2个步骤,分别是使用低通滤波平滑图像;对图像进行降采样(也即图像缩小为原来的1/4,长宽高缩小为1/2),从而得到一系列尺寸缩小的图像。金字塔的构造如下所示:

特征提取总结及代码

特征提取代码总结 颜色提取 颜色直方图提取: C ode: #include #include #include usingnamespace std; int main( int argc, char** argv ) { IplImage * src= cvLoadImage("E:\\Download\\test1.jpg",1); IplImage* hsv = cvCreateImage(cvGetSize(src), 8, 3 ); IplImage* h_plane = cvCreateImage(cvGetSize(src), 8, 1 ); IplImage* s_plane = cvCreateImage(cvGetSize(src), 8, 1 ); IplImage* v_plane = cvCreateImage(cvGetSize(src), 8, 1 ); IplImage* planes[] = { h_plane, s_plane }; /** H 分量划分为16个等级,S分量划分为8个等级*/ int h_bins = 16, s_bins = 8; int hist_size[] = {h_bins, s_bins}; /** H 分量的变化范围*/ float h_ranges[] = { 0, 180 }; /** S 分量的变化范围*/ float s_ranges[] = { 0, 255 }; float* ranges[] = { h_ranges, s_ranges }; /** 输入图像转换到HSV颜色空间*/ cvCvtColor(src, hsv, CV_BGR2HSV ); cvCvtPixToPlane(hsv, h_plane, s_plane, v_plane, 0 ); /** 创建直方图,二维, 每个维度上均分*/ CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 ); /** 根据H,S两个平面数据统计直方图*/ cvCalcHist( planes, hist, 0, 0 ); /** 获取直方图统计的最大值,用于动态显示直方图*/ float max_value;

尺度不变特征

SIFT特征分析与源码解读 分类:机器视觉与模式识别2013-11-19 22:28 10人阅读评论(0) 收藏举报 目录(?)[+] SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果,详细解析如下: 算法描述 SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。整个算法分为以下几个部分:1. 构建尺度空间 这是一个初始化操作,尺度空间理论目的是模拟图像数据的多尺度特征。 高斯卷积核是实现尺度变换的唯一线性核,于是一副二维图像的尺度空间定义为: 其中G(x,y,σ) 是尺度可变高斯函数 (x,y)是空间坐标,是尺度坐标。σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。 下图所示不同σ下图像尺度空间: 关于尺度空间的理解说明:2kσ中的2是必须的,尺度空间是连续的。在 Lowe的论文中,将第0层的初始尺度定为1.6(最模糊),图片的初始尺度定为0.5(最清晰). 在检测极值点前对原始图像的高斯平滑以致图像丢失高频信息,所以Lowe 建议在建立尺度空间前首先对原始图像长宽扩展一倍,以保留原始图像信息,增加特征点数量。尺度越大图像越模糊。

相关文档
最新文档