opencv滤波算法总结
opencv平滑算法总结
1、高斯滤波
有大佬已经写的很好了,直接引用,备忘
链接: 高斯滤波
按照正态分布概率,将卷积核内灰度值加权求出最终的灰度值
2、中值滤波
最终取值为卷积核的中值
3、均值滤波
最终取值为卷积核的均值
4、双边滤波
将高斯滤波和该灰度值的值域差值的加权进行联合,具有保边效果
5、联合双边滤波
获得高斯滤波卷积核A,然后高斯平滑,获取平滑后的值域差值获得卷积核 B, 然后将卷积核A B相乘,然后归一化,便可得到该位置的权重模板,将所得到的权重模板和该位置的邻域对应位置的值相乘,然后求和得到该位置的输出值
//高斯滤波
int MainWindow::myGaussBlur(Mat& p_srcImg , Mat &p_dstImg)
{GaussianBlur(p_srcImg , p_dstImg , Size(15,5) , 2);return 0;
}
//中值滤波
int MainWindow::myMediaBlur(Mat& p_srcImg , Mat &p_dstImg)
{medianBlur(p_srcImg , p_dstImg , 1);return 0;
}
//均值滤波
int MainWindow::myBlur(Mat& p_srcImg , Mat &p_dstImg)
{blur(p_srcImg , p_dstImg , Size(5,5));return 0;
}
//双边滤波
int MainWindow::mybilaBlur(Mat& p_srcImg , Mat &p_dstImg)
{bilateralFilter(p_srcImg , p_dstImg,3,3,3);return 0;
}
//联合双边滤波
int MainWindow::myjoinBilaBlur(Mat& p_srcImg , Mat &p_dstImg)
{GaussianBlur(p_srcImg , p_dstImg , Size(5,5) , 2);return 0;
}void MainWindow::on_comboBox_activated(int index)
{Mat srcImg = imread("D:\\5.jpg",0);if(srcImg.empty()){QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");return;}Mat t_dstImg;switch (index) {case 0:myGaussBlur(srcImg ,t_dstImg );break;case 1:myMediaBlur(srcImg ,t_dstImg );break;case 2:myBlur(srcImg ,t_dstImg );break;case 3:mybilaBlur(srcImg ,t_dstImg );break;default:break;}QImage qImg = QImage((unsigned char*)(t_dstImg.data), t_dstImg.cols,t_dstImg.rows, t_dstImg.cols*t_dstImg.channels(), QImage::Format_Grayscale8);ui->label_2->resize(qImg.width() , qImg.height());ui->label_2->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label_2->size(), Qt::KeepAspectRatio)));}