OpenCV图像减法签名输出

OpenCV Image substraction signed output

本文关键字:输出 图像 OpenCV      更新时间:2023-10-16

我想减去两个灰度图像(CV_8UC1),并得到他们的符号差异作为结果(CV_16SC1)。

我已经尝试了下面的代码,但我得到的差异是CV_8UC1矩阵,而不是有符号的CV_16SC1。

你能帮助正确定义掩码矩阵和数据类型参数吗?

谢谢!

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include "Imagesubstraction.h"
using namespace cv;
using namespace std;

int main(void)
{

Mat M1, M2,Dif;
    M1 = imread("../data/difference/a.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    M2 = imread("../data/difference/b.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    Mat Mask(1024, 1024, CV_8UC1, Scalar(1));
    subtract(M1, M2, Dif,Mask,3);
    imwrite("../data/difference/c.bmp", Dif);

    return 0;
}

当然,保存为BMP格式后,您将得到一个无符号矩阵。如OpenCV文档中所述:

只有8位(或16位无符号(CV_16U)在PNG, JPEG 2000和TIFF的情况下)单通道或3通道(与' BGR '通道顺序)图像可以使用此功能保存。

但是如果你在保存Dif矩阵之前看一下它,你会发现它是一个16位的有符号矩阵。

至少,下面的代码片段按预期工作:

cv::Mat m1(100, 100, CV_8U, cv::Scalar(50));
cv::Mat m2(100, 100, CV_8U, cv::Scalar(30));
cv::Mat dif;
cv::Mat mask(100, 100, CV_8U, cv::Scalar(255));
cv::subtract(m2, m1, dif, mask, CV_16S);
std::cout << dif << std::endl;