opencv&C++: 均值滤波、中值滤波、高斯滤波、双边滤波、频域低通滤波、频域高通滤波、频域带通滤波、频率带阻滤波代码

Mat CVImageHelper::MeanFiltering(Mat dst)
{
    Mat src;
    blur(dst,src,cv::Size(10,10));
    return src;
}
Mat CVImageHelper::GaussianFiltering(Mat dst)
{
    Mat src;
    GaussianBlur(dst,src,cv::Size(5,5),0);
    return src;
}
Mat CVImageHelper::MedianFiltering(Mat dst)
{
    Mat src;
    medianBlur(dst, src, 5);
    return src;
}
Mat CVImageHelper::BilateralFiltering(Mat dst)
{
    Mat src;
    bilateralFilter(dst, src, 5, 75, 75);
    return src;
}
Mat CVImageHelper::LowpassFiltering(Mat dst)
{
    Mat imgIn=dst.clone();
    imgIn.convertTo(imgIn,CV_32F);
    //DFT
    Mat planes[]={imgIn,Mat::zeros(imgIn.size(),CV_32F)};
    Mat DFT_image;
    merge(planes,2,DFT_image);
    dft(DFT_image,DFT_image);
    //construct_H
    Mat H(imgIn.size(),CV_32F,Scalar(1));
    double D=0;
    double D0= 0.1 * std::min(imgIn.rows, imgIn.cols);
    for (int u=0;u<H.rows;u++) {
        for (int v=0;v<H.cols;v++) {
            D=sqrt((u-imgIn.rows/2)*(u-imgIn.rows/2)+(v-imgIn.cols/2)*(v-imgIn.cols/2));
            if(D>D0)
            {
                H.at<float>(u,v)=0;
            }}}
    //fftshift
    int cx=H.cols/2;
    int cy=H.rows/2;
    Mat q1(H,Rect(0,0,cx,cy));
    Mat q2(H,Rect(cx,0,cx,cy));
    Mat q3(H,Rect(0,cy,cx,cy));
    Mat q4(H,Rect(cx,cy,cx,cy));
    Mat temp;
    q1.copyTo(temp);
    q4.copyTo(q1);
    temp.copyTo(q4);
    q2.copyTo(temp);
    q3.copyTo(q2);
    temp.copyTo(q3);
    //filtering
    Mat planesH[]={Mat_<float>(H.clone()),Mat_<float>(H.clone())};
    Mat planes_dft[]={DFT_image,Mat::zeros(DFT_image.size(),CV_32F)};
    split(DFT_image,planes_dft);
    Mat planes_out[]={Mat::zeros(DFT_image.size(),CV_32F),Mat::zeros(DFT_image.size(),CV_32F)};
    planes_out[0]=planesH[0].mul(planes_dft[0]);
    planes_out[1]=planesH[1].mul(planes_dft[1]);
    Mat complexIH;
    merge(planes_out,2,complexIH);
    //IDFT
    Mat imgOut;
    dft(complexIH,imgOut,DFT_INVERSE|DFT_REAL_OUTPUT);
    normalize(imgOut,imgOut,0,1,NORM_MINMAX);
    imgOut.convertTo(imgOut, CV_8U, 255, 0); // 将planesH[0]的值扩大255倍,并转换为8位无符号整型
    return imgOut;

}
Mat CVImageHelper::HighpassFiltering(Mat dst)
{
    Mat imgIn=dst.clone();
    imgIn.convertTo(imgIn,CV_32F);
    //DFT
    Mat planes[]={imgIn,Mat::zeros(imgIn.size(),CV_32F)};
    Mat DFT_image;
    merge(planes,2,DFT_image);
    dft(DFT_image,DFT_image);
    //construct_H
    Mat H(imgIn.size(),CV_32F,Scalar(1));
    double D=0;
    double D0= 0.05 * std::min(imgIn.rows, imgIn.cols);
    for (int u=0;u<H.rows;u++) {
        for (int v=0;v<H.cols;v++) {
            D=sqrt((u-imgIn.rows/2)*(u-imgIn.rows/2)+(v-imgIn.cols/2)*(v-imgIn.cols/2));
            if(D<D0)
            {
                H.at<float>(u,v)=0;
            }}}
    //fftshift
    int cx=H.cols/2;
    int cy=H.rows/2;
    Mat q1(H,Rect(0,0,cx,cy));
    Mat q2(H,Rect(cx,0,cx,cy));
    Mat q3(H,Rect(0,cy,cx,cy));
    Mat q4(H,Rect(cx,cy,cx,cy));
    Mat temp;
    q1.copyTo(temp);
    q4.copyTo(q1);
    temp.copyTo(q4);
    q2.copyTo(temp);
    q3.copyTo(q2);
    temp.copyTo(q3);
    //filtering
    Mat planesH[]={Mat_<float>(H.clone()),Mat_<float>(H.clone())};
    Mat planes_dft[]={DFT_image,Mat::zeros(DFT_image.size(),CV_32F)};
    split(DFT_image,planes_dft);
    Mat planes_out[]={Mat::zeros(DFT_image.size(),CV_32F),Mat::zeros(DFT_image.size(),CV_32F)};
    planes_out[0]=planesH[0].mul(planes_dft[0]);
    planes_out[1]=planesH[1].mul(planes_dft[1]);
    Mat complexIH;
    merge(planes_out,2,complexIH);
    //IDFT
    Mat imgOut;
    dft(complexIH,imgOut,DFT_INVERSE|DFT_REAL_OUTPUT);
    normalize(imgOut,imgOut,0,1,NORM_MINMAX);
    imgOut.convertTo(imgOut, CV_8U, 255, 0); // 将planesH[0]的值扩大255倍,并转换为8位无符号整型
    return imgOut;
}
Mat CVImageHelper::BandpassFiltering(Mat dst)
{
    Mat imgIn=dst.clone();
    imgIn.convertTo(imgIn,CV_32F);
    //DFT
    Mat planes[]={imgIn,Mat::zeros(imgIn.size(),CV_32F)};
    Mat DFT_image;
    merge(planes,2,DFT_image);
    dft(DFT_image,DFT_image);
    //construct_H
    Mat H(imgIn.size(),CV_32F,Scalar(1));
    double D=0;
    double D0= 0.1 * std::min(imgIn.rows, imgIn.cols);
    double D1= 0.2 * std::min(imgIn.rows, imgIn.cols);
    for (int u=0;u<H.rows;u++) {
        for (int v=0;v<H.cols;v++) {
            D=sqrt((u-imgIn.rows/2)*(u-imgIn.rows/2)+(v-imgIn.cols/2)*(v-imgIn.cols/2));
            if(D<=D0 || D>=D1)
            {
                H.at<float>(u,v)=0;
            }}}
    //fftshift
    int cx=H.cols/2;
    int cy=H.rows/2;
    Mat q1(H,Rect(0,0,cx,cy));
    Mat q2(H,Rect(cx,0,cx,cy));
    Mat q3(H,Rect(0,cy,cx,cy));
    Mat q4(H,Rect(cx,cy,cx,cy));
    Mat temp;
    q1.copyTo(temp);
    q4.copyTo(q1);
    temp.copyTo(q4);
    q2.copyTo(temp);
    q3.copyTo(q2);
    temp.copyTo(q3);
    //filtering
    Mat planesH[]={Mat_<float>(H.clone()),Mat_<float>(H.clone())};
    Mat planes_dft[]={DFT_image,Mat::zeros(DFT_image.size(),CV_32F)};
    split(DFT_image,planes_dft);
    Mat planes_out[]={Mat::zeros(DFT_image.size(),CV_32F),Mat::zeros(DFT_image.size(),CV_32F)};
    planes_out[0]=planesH[0].mul(planes_dft[0]);
    planes_out[1]=planesH[1].mul(planes_dft[1]);
    Mat complexIH;
    merge(planes_out,2,complexIH);
    //IDFT
    Mat imgOut;
    dft(complexIH,imgOut,DFT_INVERSE|DFT_REAL_OUTPUT);
    normalize(imgOut,imgOut,0,1,NORM_MINMAX);
    imgOut.convertTo(imgOut, CV_8U, 255, 0); // 将planesH[0]的值扩大255倍,并转换为8位无符号整型
    return imgOut;
}
Mat CVImageHelper::BandstopFiltering(Mat dst)
{
    Mat imgIn=dst.clone();
    imgIn.convertTo(imgIn,CV_32F);
    //DFT
    Mat planes[]={imgIn,Mat::zeros(imgIn.size(),CV_32F)};
    Mat DFT_image;
    merge(planes,2,DFT_image);
    dft(DFT_image,DFT_image);
    //construct_H
    Mat H(imgIn.size(),CV_32F,Scalar(1));
    double D=0;
    double D0= 0.1 * std::min(imgIn.rows, imgIn.cols);
    double D1= 0.2 * std::min(imgIn.rows, imgIn.cols);
    for (int u=0;u<H.rows;u++) {
        for (int v=0;v<H.cols;v++) {
            D=sqrt((u-imgIn.rows/2)*(u-imgIn.rows/2)+(v-imgIn.cols/2)*(v-imgIn.cols/2));
            if(D>D0 && D<D1)
            {
                H.at<float>(u,v)=0;
            }}}
    //fftshift
    int cx=H.cols/2;
    int cy=H.rows/2;
    Mat q1(H,Rect(0,0,cx,cy));
    Mat q2(H,Rect(cx,0,cx,cy));
    Mat q3(H,Rect(0,cy,cx,cy));
    Mat q4(H,Rect(cx,cy,cx,cy));
    Mat temp;
    q1.copyTo(temp);
    q4.copyTo(q1);
    temp.copyTo(q4);
    q2.copyTo(temp);
    q3.copyTo(q2);
    temp.copyTo(q3);
    //filtering
    Mat planesH[]={Mat_<float>(H.clone()),Mat_<float>(H.clone())};
    Mat planes_dft[]={DFT_image,Mat::zeros(DFT_image.size(),CV_32F)};
    split(DFT_image,planes_dft);
    Mat planes_out[]={Mat::zeros(DFT_image.size(),CV_32F),Mat::zeros(DFT_image.size(),CV_32F)};
    planes_out[0]=planesH[0].mul(planes_dft[0]);
    planes_out[1]=planesH[1].mul(planes_dft[1]);
    Mat complexIH;
    merge(planes_out,2,complexIH);
    //IDFT
    Mat imgOut;
    dft(complexIH,imgOut,DFT_INVERSE|DFT_REAL_OUTPUT);
    normalize(imgOut,imgOut,0,1,NORM_MINMAX);
    imgOut.convertTo(imgOut, CV_8U, 255, 0); // 将planesH[0]的值扩大255倍,并转换为8位无符号整型
    return imgOut;
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值