七:OpenCV图像平滑处理一(C++/python)

在实际业务中经常会需要对图片做平滑处理,如模糊,锐化等方便获取到更多图片特征信息,OpenCV共提供了13种函数,本章节介绍以下5种:
1.blur
2.boxFilter
3.sqrtBoxFilter
4.medianBlur
5.GaussianBlur

1.函数 blur (均值滤波)

定义:
void blur( InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT );

def blur(src, ksize, dst=None, anchor=None, borderType=None)

参数:
src:输入图像
dst:输出图像
ksize:滤波器的大小,越大模糊越厉害
anchor:滤波器的中心,通常采用默认值
borderType:边界类型,通常采用默认值

作用:图像模糊,也称为均值滤波,可以用于图片模糊效果如毛玻璃,也可以用于部分场景下图片边框填充,如锐利边框补充

使用案例

#python code
img=cv2.imread("xxx.jpg")
blur_image=cv2.blur(img,(2,2))
merge = np.hstack((img, blur_image))
plt.figure("blur_image")
plt.title("blur_image")
plt.imshow(merge)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.jpg", 1);
    Mat dst;
    Size size(11, 11);
    blur(src,  dst, size);
    namedWindow("src", 0);
    imshow("src", src);
    namedWindow("dst", 0);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

效果图

2.函数 boxFilter (盒子滤波,与均值滤波类似)

定义:
void boxFilter( InputArray src, OutputArray dst, int ddepth,Size ksize, Point anchor = Point(-1,-1),bool normalize = true,int borderType = BORDER_DEFAULT );

def boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None)

参数:
src:输入图像
dst:输出图像
ddepth:输出图像的数据类型
ksize:滤波器的大小
anchor:滤波器的中心,通常采用默认值
normalize:是否归一化
borderType:边界类型,通常采用默认值

作用:盒子滤波,与均值滤波类似,个人感觉模糊效果比均值更好

使用案例

#python code
img=cv2.imread("demo.jpg")
box_blur_image = cv2.boxFilter(img,cv2.CV_8U,(2,2))
merge = np.hstack((img, box_blur_image))
plt.figure("box_blur_image")
plt.title("box_blur_image")
plt.imshow(merge)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("demo.jpg", 1);
    Mat dst;
    Size size(11, 11);
    boxFilter(src, dst,src.depth(), size);
    namedWindow("src", 0);
    imshow("src", src);
    namedWindow("dst", 0);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

效果图

3.函数 sqrtBoxFilter (归一化平方和盒子滤波)

定义:
void sqrBoxFilter( InputArray src, OutputArray dst, int ddepth,Size ksize, Point anchor = Point(-1, -1), bool normalize = true, int borderType = BORDER_DEFAULT );

def sqrBoxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None)

参数:
src:输入图像
dst:输出图像
ddepth:输出图像的数据类型
ksize:滤波器的大小
anchor:滤波器的中心,通常采用默认值
normalize:是否归一化
borderType:边界类型,通常采用默认值

作用:归一化平方和盒子滤波,与均值滤波类似。

使用案例

#python code
img=cv2.imread("xxx.jpg")
sq_blur_image = cv2.sqrBoxFilter(img,cv2.CV_8U,(2,2))
merge = np.hstack((img, sq_blur_image))
plt.figure("sq_blur_image")
plt.title("sq_blur_image")
plt.imshow(merge)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.jpg", 0);
    Mat dst;
    Size size(20, 20);
    sqrBoxFilter(src, dst, -1, size);
    normalize(dst, dst, 0, 255, NORM_MINMAX);
    convertScaleAbs(dst, dst);
    namedWindow("src", 0);
    imshow("src", src);
    namedWindow("dst", 0);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

效果图

根据效果图不难看出归一化滤波更能突出暗部特征

4.函数 medianBlur (中值滤波)

定义:
void medianBlur( InputArray src, OutputArray dst, int ksize );

参数:
src:输入图像
dst:输出图像
ksize:滤波器的大小,注意该值必须是单数1/3/5/7/…

作用:中值滤波,平滑图片,去除图片噪点

使用案例

#python code
img=cv2.imread("xxx.jpg")
medianBlur = cv2.medianBlur(img,5)
merge = np.hstack((img, medianBlur))
plt.figure("blur_image")
plt.title("blur_image")
plt.imshow(merge)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.jpg", 1);
    Mat dst;
    medianBlur(src, dst, 5);
    namedWindow("src", 0);
    imshow("src", src);
    namedWindow("dst", 0);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

效果图

5.函数GaussianBlur (图片高斯模糊)

定义:
void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT );

def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

参数:
src:输入图像
dst:输出图像
ksize:滤波器的大小,【注意该值只能是单数】
sigmaX: X方向的高斯核标准偏差
sigmaY: Y方向的高斯核标准偏差
borderType:边界类型,通常采用默认值

作用:高斯滤波,调整滤波器的大小和 X Y方向标准差可以得到不同效果的模糊,与blur效果相似

#python code
img=cv2.imread("xxx.jpg")
GaussianBlur = cv2.GaussianBlur(img,(5,5),1,11)
merge = np.hstack((img, GaussianBlur))
plt.figure("GaussianBlur")
plt.title("GaussianBlur")
plt.imshow(merge)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.jpg", 1);
    Mat dst;
    Size size(5, 5);
    GaussianBlur(src, dst,size,1.2,0);
    namedWindow("src", 0);
    imshow("src", src);
    namedWindow("dst", 0);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

效果图

相关推荐>>

六:OpenCV图像变换与增强二(C++/python)
五:OpenCV图像变换与增强一(C++/python)