我正试图编写一个C++程序,将平场应用于图像。它应该加载一个图像并将其分割为另一个加载的图像,然后将其导出为PNG。我的程序编译正确,但只生成全黑图像。OpenCV imwrite保存黑色PNG
#include <climits>
#include <stdio.h>
#include <string>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
const char *flat_file = argv[1];
const char *img_file = argv[2];
const char *out_file = argv[3];
Mat flat_img;
flat_img = imread(flat_file, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
Mat image;
image = imread(img_file, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
GaussianBlur(flat_img, flat_img, cv::Size(3,3), 0, 0, BORDER_REPLICATE);
divide(image, flat_img, image, 1.0, -1);
imwrite(out_file, image);
return 0;
}
所有输入文件都是16位TIFF。目前,生成的输出文件是一个16位的PNG,它具有正确的像素尺寸,但是完全是黑色的。
我对C++和OpenCV都很陌生,所以我不完全确定我错过了什么。 This thread似乎表明,浮点值可能是原因。我很好地将浮点数转换出来,但我需要保持源代码的16位本质。我试过在divide命令之后加上一行image.convertTo(image, CV_16U);
,并且都是CV_16U
和CV_8U
,两者都不起作用。
任何和所有的帮助,非常感谢!
编辑
每下面的建议,我尝试添加一些imshow命令来实际测试的OpenCV正确处理的事情。似乎一切正常,直到我的分裂命令。之后,我的图像数组刚刚变成空白。
'image.depth()'的价值是什么?在第一种情况下,如果它是16,则输入图像在被flat_image分割之前乘以UCHAR_MAX(否则由USHRT_MAX)。在第二种情况下,前一句中用8代替16。我期望这两个产生相同输出的唯一方式是如果'image.depth()'既不是8也不是16。 – SSteve