2016-08-09 55 views
0

我想減去兩個灰度圖像(CV_8UC1)並獲得它們的有符號差異作爲結果(CV_16SC1)。OpenCV圖像減法符號輸出

我已經嘗試了下面的代碼,但我得到差異CV_8UC1矩陣insted的簽署CV_16SC1。

你能否幫忙正確定義Mask矩陣和數據類型參數?

謝謝!

#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; 
} 

回答

0

當然,你將在保存爲BMP格式後得到一個無符號矩陣。正如OpenCV documentation指出:

只有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;