OpenCV-高斯滤波(高斯平滑)

C++:
1、构建垂直方向上的高斯卷积算子;
2、构建水平方向上的高斯卷积算子;
3、分离的高斯卷积;
OpenCV实现的高斯平滑函数:GaussianBlur()

#include 
#include 
#include 
using namespace std;
using namespace cv;

int main()
{
	Mat img, gaussimage, integer_image;
	img=imread("D:/dog.jpg");
	
	/*gaussimage=GaussBlur(img,Size(7,7) ,2.5, CV_64F,
		Point(-1, -1),  BORDER_DEFAULT);
	gaussimage.convertTo(integer_image, CV_8U, 255.0);*/
	GaussianBlur(img, gaussimage, Size (9,9), 2);
	imshow("gauss image", gaussimage);
	imshow("original image", img);
	waitKey(0);
	return 0;
};

结果:
OpenCV-高斯滤波(高斯平滑)_第1张图片Python:
1、先水平方向上构建高斯卷积核,由于OpenCV提供的函数只能构建垂直方向上的,所以再通过矩阵转置获取水平方向上的;
2、图像矩阵与水平高斯核卷积;
3、与垂直方向上卷积核进行高斯卷积。

import cv2 as cv
import numpy as np
from scipy import signal

#方法一
def GaussBlur(img,sigma,h,w,Boundary='fill'):
    #高斯矩阵中需要进行e的运算,数据类型为 CV_64F 或者 CV_32F
    GaussKernel_x=cv.getGaussianKernel(w,sigma,cv.CV_64F)
    #OpenCV只给了垂直方向上的高斯卷积核函数,所以经过转置函数得到X水平方向上的高斯卷积核
    GaussKernel_x=np.transpose(GaussKernel_x)
    #高斯滤波首先进行水平方向高斯卷积,再进行垂直方向上卷积
    GaussBlur_x=signal.convolve2d(img,GaussKernel_x,mode='same',
                                 boundary=Boundary,fillvalue=0)
    #得到y垂直方向上的高斯卷积核函数
    GaussKernel_y=cv.getGaussianKernel(h,sigma,cv.CV_64F)

    GaussBlur_result = signal.convolve2d(GaussBlur_x, GaussKernel_y, mode='same',
                                   boundary=Boundary, fillvalue=0)
    return GaussBlur_result

#方法二 内置高斯滤波函数
def GaussBlur2():
    Gauss_img2=cv.GaussianBlur(img,(9,9),2)
    cv.imshow("gauss image2",Gauss_img2)

if __name__=="__main__":
    img=cv.imread('D:/dog.jpg')
    img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    cv.imshow("original image",img)

    Gauss_img=GaussBlur(img,2,9,9,'fill')
    #卷积后的数据类型是浮点型,需要进行数据类型(uint8)转换,从而进行灰度级显示。
    Gauss_img=np.round(Gauss_img)
    Gauss_img=Gauss_img.astype(np.uint8)
    cv.imshow("gauss image",Gauss_img)

    GaussBlur2()
    cv.waitKey(0)
    cv.destroyAllWindows()

结果:
OpenCV-高斯滤波(高斯平滑)_第2张图片

你可能感兴趣的:(OpenCV基础教程,卷积,opencv,计算机视觉,cv)