造价通

反馈
取消

热门搜词

造价通

取消 发送 反馈意见

模糊算法示例

2022/07/16126 作者:佚名
导读:常见的模糊算法比如均值模糊、高斯模糊等其基本的过程都是计算一个像素周边的的某个领域内,相关像素的某个特征值的累加和及对应的权重,然后得到结果值。比如均值模糊的各像素的权重是一样的,而高斯模糊的权重和像素距离中心点的距离成高斯分布。这样的过程是无法区分出图像的边缘等信息的,导致被模糊后的图像细节严重丢失,一种简单的改进方式就是设置某个阈值,当领域像素和中心点像素的差距大于阈值时,设置其权重很小,甚至

常见的模糊算法比如均值模糊、高斯模糊等其基本的过程都是计算一个像素周边的的某个领域内,相关像素的某个特征值的累加和及对应的权重,然后得到结果值。比如均值模糊的各像素的权重是一样的,而高斯模糊的权重和像素距离中心点的距离成高斯分布。这样的过程是无法区分出图像的边缘等信息的,导致被模糊后的图像细节严重丢失,一种简单的改进方式就是设置某个阈值,当领域像素和中心点像素的差距大于阈值时,设置其权重很小,甚至为0,这样对于本身比较平滑的区域,和原始的算法区别不大,而对于像素值变化较为明显的边缘地带,则能够有效地保留原始信息,这样就能起到降低噪音的同时保留边缘的信息。

在实际的处理,小半径的领域往往处理能力有限,处理的结果不慎理想,而随着半径的增加,算法的直接实现耗时成平方关系增长,传统的优化方式由于这个判断条件的增加,已经无法继续使用,为了解决速度问题,我们可以采用基于直方图算法的优化,如果能够统计出领域内的直方图信息,上述的判断条件及权重计算就可以简单的用下述代码实现:

void Calc(unsigned short *Hist, int Intensity, unsigned char *&Pixel, int Threshold)

{

int K, Low, High, Sum = 0, Weight = 0;

Low = Intensity - Threshold; High = Intensity Threshold;

if (Low < 0) Low = 0;

if (High > 255) High = 255;

for (K = Low; K <= High; K )

{

Sum = Hist[K] * K;

Weight = Hist[K];

}

if (Weight != 0) *Pixel = Sum / Weight;

}

在任意半径局部直方图类算法在PC中快速实现的框架一文中我们已经实现了任意半径恒长时间的直方图信息的获取,因此算法的执行时间只于上for循环中的循环量有关,也就是取决于Threshold参数,当Threshold取得越大,则最终的效果就越接近标准的模糊算法(上述代码是接近均值模糊),而在实际有意义的算法应用中而只有Threshold往往要取得较小才有保边的意义,因此,计算量可以得到适度的控制。

如果要实现选择性的高斯模糊,则要在for循环中的权重项目中再乘以一个系数,当然这会增加一定的计算量。 我们选择了一些其他保边滤波器的测试图像进行了测试,在效果上通过调整参数能得到相当不错的效果,举例如下:

图片处理前后 2100433B

*文章为作者独立观点,不代表造价通立场,除来源是“造价通”外。
关注微信公众号造价通(zjtcn_Largedata),获取建设行业第一手资讯

热门推荐

相关阅读