opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

本章内容:


        1.上采样
        2.下采样
        3.图像金字塔
        4.高斯差分(DOG)

1. 上采样

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

输出结果

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

2.下采样

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

输出结果

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

3. 图像金字塔

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

4.高斯差分(DOG)

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

输出结果

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

代码


#include <ostream>
#include <opencv.hpp>

int main(int argc, char *argv[])
{
    /*
     本章内容:
        1.上采样
        2.下采样
        3.图像金字塔
        4.高斯差分(DOG)

    */
    cv::String fileName = "/home/wang/dev/Image/cdut.jpeg";
    cv::Mat src = cv::imread(fileName);
    if(src.data == NULL){
        printf("图像读入失败\n");
        return -1;
    }
    /* 1. 上采样
        api接口:CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst,
                         const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
        参数分析:
        @param dstsize size of the output image.//输出图像大小
    */
    cv::Mat dstUp;
//    cv::pyrUp(src, dstUp, cv::Size(src.rows * 2, src.cols * 2));  // 报错
    cv::pyrUp(src, dstUp, cv::Size(src.cols * 2, src.rows * 2));  // 正确
    cv::imshow("src", src);
    cv::imshow("pyrUp", dstUp);

    /*2.下采样
        api接口:
    */
    cv::Mat dstDown;
    cv::pyrDown(src,dstDown,cv::Size(src.cols / 2, src.rows / 2));
    cv::imshow("pyrDown", dstDown);
    /*3.图像金字塔
    */
    cv::Mat dstDown1;
    cv::pyrDown(dstDown,dstDown1,cv::Size(dstDown.cols/2,dstDown.rows/2));
    cv::imshow("dstDown1", dstDown1);

    /*4.高斯差分(DOG)
        Gaussian(x,y,k*rou) - Gaussian(x,y,rou)
        计算过程:
        1. 彩色图像转灰度图像
        2. 高斯光滑获得不同尺度下的图像
        3. 不同尺度下的高斯光滑吐下做差分
    */
    /*
        api接口:CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
        参数分析:
            @param code color space conversion code (see #ColorConversionCodes).
        enum ColorConversionCodes{
                    COLOR_BGR2BGRA     = 0,
                    COLOR_RGB2RGBA     = COLOR_BGR2BGRA,
                    COLOR_BGRA2BGR     = 1,
                    COLOR_RGBA2RGB     = COLOR_BGRA2BGR,
             }
    */
    cv::Mat dstGray;
    cv::cvtColor(src,dstGray, cv::COLOR_BGR2GRAY);
    cv::Mat G1;
    cv::Mat G2;
    cv::Mat DOG;
    cv::GaussianBlur(dstGray,G1,cv::Size(5,5),5.0);
    cv::GaussianBlur(G1,G2,cv::Size(5,5),5.0);
    cv::subtract(G2,G1,DOG);
    /* 矩阵标准化
        api接口:CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
                             int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
        参数:
            @param alpha  标准化最大值
            @param beta  无效值
            @param norm_type normalization type (see cv::NormTypes).
            enum cv::NormTypes:
                 NORM_INF       = 1,
                 NORM_L1        = 2,
                 NORM_L2        = 4,
                 NORM_L2SQR     = 5,
                 NORM_HAMMING   = 6,`
                 NORM_HAMMING2  = 7,
                 NORM_TYPE_MASK = 7,
                 NORM_RELATIVE  = 8,
                 NORM_MINMAX    = 32
    */
    cv::normalize(DOG, DOG, 255, 0, cv::NORM_MINMAX);
    cv::imshow("dstGray", dstGray);
    cv::imshow("G1",G1);
    cv::imshow("G2",G2);
    cv::imshow("DOG",DOG);

    cv::waitKey(0);
    return 1;
}

 

 

pyrUp中行列问题上采样中行列问题

上采样的行列与矩阵的行列相反

opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)

报错结果:

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.4.0-dev) /home/wang/opencv/opencv/modules/imgproc/src/pyramids.cpp:923: error: (-215:Assertion failed) std::abs(dsize.width - ssize.width*2) == dsize.width % 2 && std::abs(dsize.height - ssize.height*2) == dsize.height % 2 in function 'pyrUp_'