OpenCV4.8 开发实战系列专栏之 29 - 快速的图像边缘滤波算法
欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。
专栏代码全部基于C++ 与Python双语演示。
送相关学习资料, V: OpenCVXueTang_Asst
本文关键知识点:快速的图像边缘滤波算法
高斯双边模糊与mean shit均值模糊两种边缘保留滤波算法,都因为计算量比较大,无法实时实现图像边缘保留滤波,限制了它们的使用场景,OpenCV中还实现了一种快速的边缘保留滤波算法。高斯双边与mean shift均值在计算时候使用五维向量是其计算量大速度慢的根本原因,该算法通过等价变换到低纬维度空间,实现了数据降维与快速计算。
OpenCV API函数为:
void cv::edgePreservingFilter(
InputArray src,
OutputArray dst,
int flags = 1,
float sigma_s = 60,
float sigma r= 0.4f
Python:
dst =cv.edgePreservingFilter( src[, dst[,flags[, sigma_s[, sigma_r]]]])
其中sigma_s的取值范围为0200,sigma_r的取值范围为01当sigma s取值不变时候,sigmar越大图像滤波效果越明显当sigma r取值不变时候,窗口sigma s越大图像模糊效果越明显当sgma_r取值很小的时候,窗口sigma_s取值无论如何变化,图像双边滤波效果都不好!
快速的图像边缘滤波算法在图像处理领域具有重要意义,它能够在保持图像边缘的同时,实现图像的平滑处理。以下是对几种常见快速边缘滤波算法的介绍:
一、高斯双边滤波
高斯双边滤波是一种结合了空间域和强度域信息的滤波方法。它使用高斯函数来计算空间邻近度和像素值相似度,从而在平滑图像的同时保留边缘信息。然而,高斯双边滤波的计算量相对较大,可能无法实现实时处理。
二、Mean Shift均值模糊
Mean Shift均值模糊是一种基于非参数密度估计的滤波算法,它能够在保持图像边缘的同时实现图像的平滑。但同样,由于计算复杂度较高,Mean Shift均值模糊在实时应用中可能受到限制。
三、OpenCV的快速边缘保留滤波算法
OpenCV实现了一种快速的边缘保留滤波算法,该算法通过积分图像实现局部均方差的边缘保留模糊。该算法计算简单,且计算量与半径无关,因此能够实现快速处理。其基本原理包括:
- 计算局部均值和方差:利用积分图像快速计算窗口内像素的均值和方差。
- 根据均值和方差进行滤波:根据计算得到的均值和方差,以及预设的sigma_s和sigma_r参数,对每个像素进行滤波处理。
这种算法的优点在于计算效率高,且能够在保持图像边缘的同时实现平滑处理。
四、自适应中值滤波
自适应中值滤波是一种针对椒盐噪声特别有效的滤波算法。与常规中值滤波相比,自适应中值滤波能够根据图像局部噪声的密度动态调整滤波窗口的大小,从而在去除噪声的同时更好地保护图像边缘。
五、导向滤波
导向滤波是一种基于局部线性模型的滤波方法,它能够在保持图像边缘的同时实现图像的平滑。导向滤波通过构建一个导向图像(通常是原图像或其某个变换),并利用该导向图像来引导滤波过程,从而实现边缘保持和平滑处理。
应用场景与选择建议
在实际应用中,选择哪种快速的图像边缘滤波算法取决于具体的应用场景和需求。例如:
- 在需要实时处理的场景中,可以考虑使用OpenCV的快速边缘保留滤波算法或自适应中值滤波。
- 在对图像质量要求较高且计算资源充足的场景中,可以考虑使用高斯双边滤波或导向滤波。
总之,快速的图像边缘滤波算法在图像处理领域具有广泛的应用前景,选择合适的算法对于实现高效的图像处理至关重要。
cv::edgePreservingFilter
是 OpenCV 提供的一种用于图像处理的函数,它旨在保持图像边缘的同时进行平滑处理。这种滤波器特别适用于去除噪声的同时保持图像中的重要结构信息,如边缘和细节。下面是对这个函数及其参数的详细解释,以及如何在 Python 中使用它的示例。
函数原型
在 C++ 中,函数原型如下:
void cv::edgePreservingFilter(InputArray src, OutputArray dst, int flags=1, float sigma_s=60, float sigma_r=0.4f);
在 Python 中,使用方式如下:
dst = cv.edgePreservingFilter(src[, dst[, flags[, sigma_s[, sigma_r]]]])
参数说明
- src: 输入图像,必须是 8 位或 16 位的单通道或三通道图像。
- dst: 输出图像,与输入图像大小和类型相同。
- flags: 指定滤波算法的类型。OpenCV 中默认提供两种算法:
cv.NORM_L2
(值为 1): 使用基于范数的权重计算方法。cv.NORM_L1
(值为 0): 使用基于绝对差值的权重计算方法。
- sigma_s: 坐标空间中的sigma参数,用于确定在多大范围内搜索相似的像素。较大的值意味着更大的搜索范围,可能会找到更多相似的像素,但计算成本也会增加。
- sigma_r: 颜色空间中的sigma参数,用于确定两个像素在颜色上相似到何种程度才会被认为是相似的。较小的值意味着只有颜色非常接近的像素才会被考虑,这可能会导致更精细的边缘保持,但也可能导致过度平滑。
使用示例
以下是一个在 Python 中使用 cv::edgePreservingFilter
的简单示例:
import cv2 as cv
# 读取输入图像
src = cv.imread('input.jpg')
# 应用边缘保持滤波器
dst = cv.edgePreservingFilter(src, flags=1, sigma_s=60, sigma_r=0.4)
# 显示结果
cv.imshow('Original Image', src)
cv.imshow('Edge Preserving Filtered Image', dst)
cv.waitKey(0)
cv.destroyAllWindows()
在这个示例中,我们读取了一张名为 input.jpg
的图像,然后应用 cv.edgePreservingFilter
函数进行边缘保持滤波。通过调整 sigma_s
和 sigma_r
的值,你可以控制滤波的效果,以达到在去除噪声和保持边缘之间的最佳平衡。
注意事项
- 选择合适的
sigma_s
和sigma_r
值对于获得良好的滤波效果至关重要。 - 该函数可能会比较耗时,特别是对于大尺寸的图像,因此在实际应用中可能需要考虑性能优化。
- 滤波器的效果可能因图像内容而异,因此建议在不同的图像上测试参数设置,以找到最适合你的应用场景的配置。
演示代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int artc, char** argv) {
Mat src = imread("D:/images/example.png");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
Mat dst;
double tt = getTickCount();
edgePreservingFilter(src, dst, 1, 60, 0.44);
double end = (getTickCount() - tt) / getTickFrequency();
printf("time consume : %f\n ", end);
imshow("result", dst);
waitKey(0);
return 0;
}
python 代码演示
import cv2 as cv
import numpy as np
src = cv.imread("D:/images/example.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
h, w = src.shape[:2]
dst = cv.edgePreservingFilter(src, sigma_s=100, sigma_r=0.4, flags=cv.RECURS_FILTER)
result = np.zeros([h, w*2, 3], dtype=src.dtype)
result[0:h,0:w,:] = src
result[0:h,w:2*w,:] = dst
cv.imshow("result", result)
cv.imwrite("D:/result.png", result)
cv.waitKey(0)
cv.destroyAllWindows()
结束语
学习贵在坚持,学习OpenCV贵在每一天的代码练习,原理跟基本的函数解释,相关知识,后续更新边学边理解,搞技术永远要坚持做长期主义者!我们一起努力!!!
送相关学习资料,V: OpenCVXueTang_Asst
原文地址:https://blog.csdn.net/jia20003/article/details/145158386
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!