3.1 高斯金字塔的构建
尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两部分:
1. 对图像做不同尺度的高斯模糊;
2. 对图像做降采样(隔点采样)。
图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张图像),每个金字塔共n 层。金字塔的层数根据图像的原始大小和塔顶图像的大小共同决定,其计算公式如下:
(3-3)
其中M,N 为原图像的大小,t为塔顶图像的最小维数的对数值。如,对于大小为512*512的图像,金字塔上各层图像的大小如表3.1 所示,当塔顶图像为4*4 时,n=7,当塔顶图像为2*2 时,n=8。
下采样实现:可以采样隔行隔列取值。
DOWN SAMPLE降采样
隔点采样 VS实现程序
//隔点采样
void DownSample(constMat& src, Mat& dst)
{
// resize(src, dst, Size(src.cols/2, src.rows/2),0, 0, CV_INTER_NN);
if(src.channels()!= 1)
return;
if(src.cols<=1 || src.rows <=1)
{
src.copyTo(dst);
return;
}
dst.create((int)(src.rows/2),(int)(src.cols/2), src.type());
//cout<<"--"<<dst.rows<<" " <<dst.cols << "--"<<endl;
pixel_t* srcData = (pixel_t*)src.data;
pixel_t* dstData = (pixel_t*)dst.data;
int srcStep= src.step/sizeof(srcData[0]);
int dstStep= dst.step/sizeof(dstData[0]);
int m = 0, n= 0;
for(int j = 0; j < src.cols; j+=2, n++)
{
m = 0;
for(int i = 0; i < src.rows; i+=2, m++)
{
pixel_t sample = *(srcData + srcStep* i + src.channels() * j);
//防止当图像长宽不一致时,长宽为奇数时,m,n越界
if(m< dst.rows && n < dst.cols)
{
*(dstData + dstStep * m +dst.channels() * n) = sample;
}
}
}
}
降采样实现方法1:
ram缓存整幅图像,然后进行行列采集。这种实现方法会占用大量的ram资源,而且和我之前的高斯滤波模块按周期输出不符。不采纳
降采样实现方法2:
如下图所示隔行隔点采样,也就是第一行数据不要,采集第二行数据,第三行数据不要采集第四行数据,也就是说偶数行有效,这样就完成了隔行采样,然后再进行隔列采样。实现方法是用一行ram大小的简单双口ram实现。这样在一个时钟下就可以完成隔行隔列采样。实现代码如下:
always @(posedge clk) begin ///ram读状态机
if(rst) begin
addrb<= 4'd0; temp<=0; count<=1;enb <= 1'b0; end
elsebegin
if(r_data) begin
count <= count +1;
if(count==3'd2) begin
addrb <= addrb + 1 ; enb <=1'b1;temp<=temp+1; count<=1; end //enb <= 1'b1;
end
end
end
图中所示256*256 lena图像
实现效果比较:
Matlab降采样和硬件降采样实现数据比较分析:
从图可以所有的数据都一致。
效果比较:
matlab 降采样实现
硬件实现
到此,降采样设计完成。