ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

opencv 滤波

opencv 滤波 1. 卷积核卷积核就是一个小数字矩阵 在图像上滑动小数字矩阵和对应位置的像素做运算实现模糊、锐化、边缘检测。blur、GaussianBlur、medianBlur、filter2D全部底层都是卷积运算假设 3×3 卷积核滑动到图像某一块图像像素 卷积核kernel [10 20 30] [a b c] [40 50 60] [d e f] [70 80 90] [g h i]输出中心像素 10*a 20*b 30*c 40*d 50*e 60*f 70*g 80*h 90*i核窗口逐像素向右、向下滑动遍历整张图生成输出图像。2. 均值滤波void blur(InputArray src,InputArray dst,Size ksize,Point point Point(-1, -1),int borderType BORDER_DEFAULT);原理在图像上滑动一个矩形窗口卷积核把窗口内所有像素求算术平均值赋值给窗口中心输出像素。cv::Mat src,dst; src imread(test.jpg); cv::blur(src,dst,cv::Size(5,5));cv::Size(3,3) 卷积核大小必须奇数, size越大越模糊2. 高斯模糊void GaussianBlur(InputArray src,InputArray dst,Size ksize,double sigmaX,double sigmaY 0,int borderType BORDER_DEFAULT);Size 设置卷积核的大小必须是奇数 Size(0,0) 核大小有sigmaX自动计算sigmaXX方向高斯标准差数值越大模糊越强 sigmaX 0 ,sigmaX由Size()自动计算sigmaY: Y方向高斯标准差sigmaY传0就自动等于sigmaXMat src,dst; GaussianBlur(src,dst,Size(5,5),0); // sigmaX由size自动计算 GaussianBlue(src,dst,Size(0,0),4); // Size(0,0) 核大小由sigmaX 自动计算3. 中值滤波void medianBlur(InputArray src, InputArray dst, int ksize);原理取卷积窗口内像素中位数不是平均值。ksize 窗口大小取像素值必须是奇数cv::Mat src,dst; medianBlure(src, dst, 5);4. 双边滤波void bilateral(InputArray src,InputArray dst,int d,double sigmaColor,double sigmaSpace,int borderType BORDER_DEAFAULT);双边滤波保边缘的模糊美颜算法底层。❗不是固定卷积核权重是动态计算每一个位置的权重都不一样计算开销大。d滤波邻域直径。d 0程序自动根据sigmaSpace计算邻域大小推荐写 0sigmaColor颜色域标准差值越大允许相差更大的颜色参与平滑越大模糊越强。一般取值25 ~ 100sigmaSpace空间域标准差单位像素值越大参与计算的像素范围越大。一般取值25 ~ 100borderType边界填充默认即可不用修改实例代码mainwindow.cpp#include mainwindow.h #include ui_mainwindow.h #include QDebug MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { qDebug() __func__ __LINE__; ui-setupUi(this); initMainWindow(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::initMainWindow() { qDebug() __func__ __LINE__; ui-blurViewLabel-setFixedSize(723,399); ui-gaussianViewLabel-setFixedSize(723,399); ui-medianViewLabel-setFixedSize(723,399); ui-bilateralViewLabel-setFixedSize(723,399); QString imgPath R(D:\new_share\016_opencv\OpenCVFilter\1.jpg); Mat imgData imread(imgPath.toStdString()); // BGR 格式 cvtColor(imgData, imgData , COLOR_BGR2RGB); // 转为 RGB 格式 myImg imgData; blurImg QImage((const unsigned char*)imgData.data, imgData.cols, imgData.rows, static_castint(imgData.step),QImage::Format_RGB888).copy(); gaussianImg blurImg; medianImg blurImg; bilateralImg blurImg; imgShow(); } void MainWindow::imgShow() { qDebug() __func__ __LINE__; ui-blurViewLabel-setPixmap(QPixmap::fromImage(blurImg.scaled(ui-blurViewLabel-size()))); ui-gaussianViewLabel-setPixmap(QPixmap::fromImage(gaussianImg.scaled(ui-gaussianViewLabel-size()))); ui-medianViewLabel-setPixmap(QPixmap::fromImage(medianImg.scaled(ui-medianViewLabel-size()))); ui-bilateralViewLabel-setPixmap(QPixmap::fromImage(bilateralImg.scaled(ui-bilateralViewLabel-size()))); } void MainWindow::imgProc(int kernel) { qDebug() __func__ __LINE__; Mat imgSrc myImg; Mat imgBlurDst imgSrc.clone(); Mat imgGaussianDst imgSrc.clone(); Mat imgMedianDst imgSrc.clone(); Mat imgBilateralDst imgSrc.clone(); int value 1; value value kernel*2; blur(imgSrc,imgBlurDst,Size(value,value),Point(-1,-1)); GaussianBlur(imgSrc, imgGaussianDst, Size(value,value),0); medianBlur(imgSrc,imgMedianDst,value); bilateralFilter(imgSrc, imgBilateralDst, value, value*2.0, value/2.0); blurImg QImage((const unsigned char*)imgBlurDst.data, imgBlurDst.cols, imgBlurDst.rows, static_castint(imgBlurDst.step),QImage::Format_RGB888).copy(); gaussianImg QImage((const unsigned char*)imgGaussianDst.data, imgGaussianDst.cols, imgGaussianDst.rows, static_castint(imgGaussianDst.step), QImage::Format_RGB888).copy(); medianImg QImage((const unsigned char*)imgMedianDst.data, imgMedianDst.cols, imgMedianDst.rows, static_castint(imgMedianDst.step), QImage::Format_RGB888).copy(); bilateralImg QImage((const unsigned char*)imgBilateralDst.data, imgBilateralDst.cols, imgBilateralDst.rows, static_castint(imgBilateralDst.step), QImage::Format_RGB888).copy(); imgShow(); } void MainWindow::on_verticalSlider_valueChanged(int value) { qDebug() __func__ __LINE__; imgProc(value); }mainwindow.h#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include opencv2/opencv.hpp QT_BEGIN_NAMESPACE using namespace cv; namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); void initMainWindow(); void imgShow(); void imgProc(int kernel); private slots: void on_verticalSlider_valueChanged(int value); private: Ui::MainWindow *ui; Mat myImg; QImage blurImg; QImage gaussianImg; QImage medianImg; QImage bilateralImg; }; #endif // MAINWINDOW_H
返回列表