【opencv图像加减运算异常/下采样后上采样图像尺寸不匹配】

opencv图像加减运算异常/下采样后上采样图像尺寸不匹配

图像运算异常常见的两种原因:
1.图像的大小或者格式不一致
2.图像的格式不一致

图像运算异常常见的三种原因:

  1. 图像的尺寸不一致
    解决方法,设定同样的Size,但是要注意可能会对图像进行拉伸
  2. 图像的格式不一致
    解决方法:
    img = cv.函数名(img1,img2,dtype=cv2.CV_8UC3) #声明生成新的img的数据类型
  3. 图像的读取失败
    就是没有读取到图像,查看一下路径问题。

下采样后上采样图像尺寸不匹配

我的代码是这样的

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    
    

    // 读取图像
    Mat img = imread("1.jpg");

    
        Mat down1;
        Mat down2, down2_up, lap;


        //下采样
        pyrDown(img, down1);
       //下采样再上采样后图像尺寸维度不匹配。
        pyrDown(down1, down2);
        pyrUp(down2, down2_up);
        lap = down1 - down2_up;
        imshow("img", img);
        imshow("down1", down1);
        imshow("down2", down2);
        imshow("down2_up", down2_up);
        imshow("lap", lap);

    // 等待用户操作 
    waitKey(0);
    return 0;
}

lap = down1 - down2_up;设置断点后查看图像发现down1和down2_up尺寸差了1,于是后面的减运算操作就会弹出异常。
在这里插入图片描述
查阅资料后发现,
pyrDown和pyUp默认是行和列都变为原来的1/2,但是如果行或列为奇数时,奇数➗2之后,我理解为小数点为0.5会进一,这就会产生上面的情况,下采样时【720×457】变为【360×229】,上采样【360×229】变为【720×458】。
解决办法:
代码为:

	//下采样
    pyrDown(img, down1,Size(img.cols/2,img.rows/2));
    pyrDown(down1, down2, Size(down1.cols / 2, down1.rows / 2));
    pyrUp(down2, down2_up, Size(down2.cols * 2, down2.rows * 2));

运行后结果为:
在这里插入图片描述

有人会想,这不是和默认一样嘛,但是仔细想一想,默认是0.5进一,而C++中整数除法是向下取整的,没有小数这一说,这样就跳过了可能报错的地方。
最后再提醒一下,图像运算和处理时注意图像的尺寸和通道哦。

猜你喜欢

转载自blog.csdn.net/weixin_51315141/article/details/132470957
今日推荐