opencv图像相减异常/下采样后上采样图像尺寸不匹配
opencv图像加减运算异常/下采样后上采样图像尺寸不匹配
图像运算异常常见的两种原因:
1.图像的大小或者格式不一致
2.图像的格式不一致
图像运算异常常见的三种原因:
- 图像的尺寸不一致
解决方法,设定同样的Size,但是要注意可能会对图像进行拉伸 - 图像的格式不一致
解决方法:
img = cv.函数名(img1,img2,dtype=cv2.CV_8UC3) #声明生成新的img的数据类型
- 图像的读取失败 ,
就是没有读取到图像,查看一下路径问题。
下采样后上采样图像尺寸不匹配
我的代码是这样的
#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++中整数除法是向下取整的,没有小数这一说,这样就跳过了可能报错的地方。
最后再提醒一下,图像运算和处理时注意图像的尺寸和通道哦。