C++:
1、构建垂直方向上的高斯卷积算子;
2、构建水平方向上的高斯卷积算子;
3、分离的高斯卷积;
OpenCV实现的高斯平滑函数:GaussianBlur()
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>
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;
};
结果:
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()
结果: