图像低频高频区域分离

简介

  本篇整理记录利用小波分离图像的高频、低频部分信息。

具体实现

  实现代码参考资料:小波变换 C++ opencv 实现。

小波变换

  小波生成和参考资料中一致。小波变换中,首先抽取出原图像的每一行,进行小波分解,获得水平方向的高、低频信息。
接着抽取出原图像的每一列,进行小波分解,获得垂直方向的高、低频信息。
  生成的对应结果如下:
                                 图像低频高频区域分离_第1张图片                                               
图像低频高频区域分离_第2张图片 
                   水平方向                                         垂直方向

区域分离

  如上,我们已经获得了水平、垂直方向的高、低频信息,并保存到了图像中。接着我们首先将这两幅图片都叠加到同一副图像中。
结果开运算、高斯滤波和阀值二值化之后,最终获得比较好的分离掩码结果。
  对应代码如下:
void picDone(Mat mat1, Mat mat2){
    int i, j;
    IplImage tmp;
    CvScalar s;
    float sum = 0;
 
    mat2.copyTo(mask);                                                                                                               
    tmp = mask;
    for(i=0; i< mat2.rows; i++){
        for(j=0; j< mat2.cols; j++){
            mask.at<float>(i,j) = (mat1.at<float>(i,j) + mat2.at<float>(i,j)) / 2;
            if((i==0) && (j==0)){
                sum = mask.at<float>(i,j);  
            }else{
                sum = (sum + mask.at<float>(i,j)) / 2;
            }
        }   
    }
    tmp = mat2;
    cvZero(&tmp);
 
    imshow("mask0", mask);
    morphologyEx(mask, mat2, MORPH_CLOSE, Mat(5,5,CV_8U), Point(-1,-1), 1);
    GaussianBlur(mat2, mask, Size(7,7), 0, 0);
 
    tmp = mask;
    for(i=0; i< mask.rows; i++){
        for(j=0; j< mask.cols; j++){
            s = cvGet2D(&tmp, i, j);
            if(s.val[0] < sum){
                s.val[0] = 0;
                cvSet2D(&tmp, i, j, s);
            }
        }
    }
    imshow("mask", mask);
}
  对应的结果显示如下:
图像低频高频区域分离_第3张图片  图像低频高频区域分离_第4张图片
                  直接叠加                                          后处理结果

你可能感兴趣的:(opencv,图像处理)