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

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;
};

结果:
9×9Python:
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()

结果:
9×9

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值