????????在滤波过程中,除了滤波算子的选择之外,再就是就在源图像上选取尺寸合适的邻域并对其进行一定步长的遍历操作了。邻域尺寸的不同可能会给结果带来不同的效果,一般尺寸大小选择奇数如3、5、7等。
????????那么图像滤波之前的内容就是获取邻域并对邻域进行运算了。图像滤波一般是在源图像上将滤波算子与其对应邻域像素进行矩阵运算,这部分是直接创建等尺寸的算子窗口,在源图像上遍历计算。而还有的则是直接在源图像上取得邻域像素内容,然后对邻域内容处理,例如子块重叠的直方图均衡算法。其实这也可以算为滤波算子内元素全为1,然后遍历得到的所有邻域子块。
????????下面以子块重叠的直方图均衡算法为例,来实现体现一下其中的滤波情况。下面对其代码进行分析解释:
1、确定一个邻域尺寸FilterSize,那么就有
int?len?= FilterSize*FilterSize;
int?localwidth?= FilterSize/2;//窗口索引最大值
2、构造对应的邻域窗口
ImgTyp* Filter = new ImgTyp[len];
memset(Filter,0,sizeof(ImgTyp)*len);
3、对于单个邻域内取值,则类似于前面图像分块,只需要确定每个子块在源图像上读取的起始点即可
4、在宽高分别为Width、Height的源图像上遍历获取邻域子块
for (int i = localwidth;i < Height-localwidth;i++)
{
for (int j = localwidth;j < Width-localwidth;j++)
{
for (int n = -localwidth;n < localwidth;n++)
{
for (int m = -localwidth;m < localwidth;m++)
{//每次循环获取邻域子块
Filter[(n+localwidth)*localwidth+m+localwidth] = SrcImg[(i+n)*Width+m+j];
}
}
}
}
????????以上可应用在子块重叠的直方图均衡算法中,选取不同邻域尺寸的最后试验结果如下:
????????可以看到,随着尺寸的增大,局部直方图均衡化显露的细节也就越多,但是图像边缘就会出现越大的未变区域(如果边缘像素很重要,这个一般会在图像处理前进行图像扩充操作)。
|